最近学习Python
廖雪峰老师的Python 3教程
想要用项目练练手。Python网络爬虫看起来是不错的练手项目,于是着手学习爬虫的制作。
一开始并没有什么头绪,直到看到了慕课网的Python爬虫教程。
这个教程基于python2,但是给了我爬虫的基本思路。接着我用python3写了该教程上的百度百科(弱智)爬虫。

百度百科(弱智)爬虫 基于python3

功能简介

爬取与某个百科页面相关的几百个百科页面。用的是深度优先搜索,所以会搜出很多莫名其妙的词条。实际上这个爬虫并没有什么卵用,只是拿来学习练手。

爬虫框架

有一个主程序和四个模块。
四个模块分别是

  1. url管理器:管理url
  2. html下载器:用request,下载网页的html代码
  3. html解析器:用BeautifulSoup4,解析下载下来的html代码,获得词条的标题和简介
  4. html输出器:输出为一个html,用表格的形式表现最终的数据

爬虫代码

主程序

# spider_main.py
from baike_spider import url_manager
from baike_spider import html_downloader
from baike_spider import html_parser
from baike_spider import html_outputerclass SpiderMain(object):def __init__(self):# init all objectsself.urls = url_manager.UrlManager()self.downloader = html_downloader.HtmlDownloader()self.parser = html_parser.HtmlParser()self.outputer = html_outputer.HtmlOutputer()def crawl(self, root_url):count = 1# add root_url into url_managerself.urls.add_new_url(root_url)# start loopwhile self.urls.has_new_url():try:new_url = self.urls.get_new_url()print('crawling %d : %s' % (count, new_url))html_cont = self.downloader.download(new_url)new_urls, new_data = self.parser.parse(new_url, html_cont)  # get new urls and dataself.urls.add_new_urls(new_urls)self.outputer.collect_data(new_data)        # collect dataif count == 300:breakcount = count + 1except:print('crawl failed.')self.outputer.output_html()if __name__=='__main__':root_url = 'http://baike.baidu.com/view/1927.htm'obj_spider = SpiderMain()obj_spider.crawl(root_url)  # start spider

url管理器

# url_manager.py
class UrlManager(object):def __init__(self):self.new_urls = set()self.old_urls = set()def add_new_url(self, url):if url is None:returnif url not in self.new_urls and url not in self.old_urls:self.new_urls.add(url)def add_new_urls(self, urls):if urls is None or len(urls) == 0:returnfor url in urls:self.add_new_url(url)def has_new_url(self):return len(self.new_urls) != 0def get_new_url(self):new_url = self.new_urls.pop()self.old_urls.add(new_url)return new_url

html下载器

# html_downloader
from urllib import requestclass HtmlDownloader(object):def download(self, url):if url is None:return Noneresponse = request.urlopen(url)if response.status != 200:return Nonedata = response.read()return data.decode('utf-8')

html解析器

# html_parser
from bs4 import BeautifulSoup
import re
from urllib.parse import urljoinclass HtmlParser(object):def parse(self, page_url, html_cont):if page_url is None or html_cont is None:returntry:soup = BeautifulSoup(html_cont, 'html.parser', from_encoding='utf-8')except ValueError as e:print('except:', e)# parsenew_urls = self._get_new_urls(page_url, soup)new_data = self._get_new_data(page_url, soup)return new_urls, new_data
# parse new urlsdef _get_new_urls(self, page_url, soup):new_urls = set()# /view/123.htmlinks = soup.find_all('a', href = re.compile(r"/view/\d+\.htm"))for link in links:new_url = link['href']      # get linknew_full_url = urljoin(page_url, new_url)new_urls.add(new_full_url)return new_urls# parse title and summarydef _get_new_data(self, page_url, soup):res_data = {}# urlres_data['url'] = page_url# <dd class="lemmaWgt-lemmaTitle-title">#  <h1>星际争霸Ⅱ</h1>title_node = soup.find('dd', class_='lemmaWgt-lemmaTitle-title',).find('h1')res_data['title'] = title_node.get_text()# <div class="lemma-summary" label-module="lemmaSummary">summary_node = soup.find('div', class_='lemma-summary')res_data['summary'] = summary_node.get_text()print('res_data[\'summary\'] = ', res_data['summary'])return res_data

html输出器

# html_outputer
class HtmlOutputer(object):def __init__(self):# a list to maintain datasself.datas = []def collect_data(self, data):if data is None:returnself.datas.append(data)def output_html(self):fout = open('output.html', 'w', encoding='utf-8')fout.write('<html>')fout.write('<meta charset="UTF-8">')    # importantfout.write('<body>')fout.write('<table>')# python default:unicodefor data in self.datas:fout.write('<tr>')fout.write('<td>%s</td>' % data['url'])fout.write('<td>%s</td>' % data['title'])fout.write('<td>%s</td>' % data['summary'])fout.write('</tr>')fout.write('</table>')fout.write('</body>')fout.write('</html>')fout.close()

输出的结果示例

http://baike.baidu.com/view/1927.htm 星际争霸 《星际争霸》(英语:StarCraft)是暴雪娱乐制作发行的一款即时战略游戏。这是星际争霸系列游戏的第一部作品,于1998年3月31日正式发行。游戏拥有3部资料片,但是正式发行的只有《母巢之战》。其续作《星际争霸II:自由之翼》已于2010年7月27日发行。《星际争霸》使用《魔兽争霸Ⅱ》引擎,但不同的是融合了三个截然不同的种族:Protoss,Zerg和Terran,他们各自有着迥然不同的战斗单位与科技树。
http://baike.baidu.com/view/174999.htm 吉尼斯世界纪录大全 吉尼斯世界纪录大全于1955年问世,集世界上最好、最坏、最美、最怪、最惨、最伟大的事物,收录了许多光怪陆离、难以想象的纪录。
http://baike.baidu.com/view/293873.htm 碉堡 碉堡是一个网络流音乐,由屌爆演化而来,主要有“震惊了”、“悲剧了”、“非常牛逼”几种意思,不同场合下意义也不同。
http://baike.baidu.com/view/969702.htm DuGalle DuGalle是暴雪开发的即时战略游戏星际争霸(StarCraft)中的角色。(2436年-2500年3月24日) Gerard DuGalle上将是来自地球的Terran,隶属UED(United Earth Directorate)。
http://baike.baidu.com/view/3306588.htm 兵营
http://baike.baidu.com/view/368419.htm 黑暗执政官 黑暗执政官是星际争霸中神族的部队,在它们漫长的放逐过程中面对着各种各样的挑战。在这个过程中,它们不停地与命运做抗争,改进自己的武器技能,并把自己的生理形态转化成更适应周围恶劣的环境,最终就产生了黑暗执政官。
http://baike.baidu.com/view/565476.htm 金甲虫 金甲虫创于一九九六年,店铺遍及四川、贵州、云南、重庆等四省十一市三十余个县,开业十五年无一假货,以“到金甲虫,买正宗货”闻名遐迩。[1]

我的第一个Python3 网络爬虫 百度百科爬虫相关推荐

  1. 网络红人百度百科怎么做_如何做网红搜狗好搜百科技巧分享

    随着百科的发展,现在一共有五家百科词条,分别是 百度百科,搜狗百科,好搜百科,快懂百科,维基百科. 百科词条权重值高,呈现好,已成为了黄金社交名片. 现在各大 APP.品牌.企业.演员.艺术大师.医师 ...

  2. python爬取百度百科表格_第一个python爬虫(python3爬取百度百科1000个页面)

    以下内容参考自:http://www.imooc.com/learn/563 一.爬虫简介 爬虫:一段自动抓取互联网信息的程序 爬虫可以从一个url出发,访问其所关联的所有的url.并从每个url指向 ...

  3. python3爬虫---百度百科(疾病信息)

    一.问题描述 之前爬虫过程主要存在两个个问题: (1)爬取到网页源码之后,没有解析,直接利用正则表达式抓取信息,这样做起来比较费劲,容易造成信息抓取不全面,同时,所有页面链接都是根据链接规律自建的,没 ...

  4. python爬虫百度百科-如何入门 Python 爬虫?

    目前网上有关网页爬虫的指导有很多,但是套路却是千篇一律,基本都是围绕以下内容进行展开,CSS/html等网页知识 requests或urllib BeautifulSoup或正则表达式 Seleniu ...

  5. python爬虫百度百科-python爬虫(一)_爬虫原理和数据抓取

    本篇将开始介绍Python原理,更多内容请参考:Python学习指南 为什么要做爬虫 著名的革命家.思想家.政治家.战略家.社会改革的主要领导人物马云曾经在2015年提到由IT转到DT,何谓DT,DT ...

  6. python 百度百科 爬虫_爬虫爬取百度百科数据

    以前段时间<青春有你2>为例,我们使用Python来爬取百度百科中<青春有你2>所有参赛选手的信息. 什么是爬虫? 为了获取大量的互联网数据,我们自然想到使用爬虫代替我们完成这 ...

  7. python 百度百科 爬虫_python简单爬虫

    爬虫真是一件有意思的事儿啊,之前写过爬虫,用的是urllib2.BeautifulSoup实现简单爬虫,scrapy也有实现过.最近想更好的学习爬虫,那么就尽可能的做记录吧.这篇博客就我今天的一个学习 ...

  8. python爬虫︱百度百科的requests请求、百度URL格式、网页保存、爬虫模块

    1 . 百科网页请求 1.1 网站解析requests与urllib.request对比: py3中主要用requests以及urllib.request两款库用来做网页内容的解析,两者的使用较多以r ...

  9. python爬虫百度百科-python每日一题:网络爬虫百度百科

    # !控制主机程序 '''主机发送爬虫网址,从机进行爬取信息,并返回给主机''' #本次优化主要是:由于发送url与爬取url速度差异较大,造成发送url的队列中存在数据较多,占用内存. # 新方案是 ...

最新文章

  1. LSM 优化系列(四) -- Rocksdb和Lethe 对Delete问题的优化
  2. android对话框的使用(下)
  3. RecycleView 动画实现
  4. mysql导入sql文件
  5. Java向C++发送结构体
  6. 【C语言进阶深度学习记录】三 浮点数(float) 在内存中的表示方法
  7. 雅可比迭代c++实现_线性方程组(3)-静态迭代法
  8. React 的诞生过程
  9. memcmp与strcmp区别
  10. 你知道怎么用Idea抽取方法、创建class吗?
  11. springboot使用junit5/junit4
  12. 戴尔电脑能升级鸿蒙系统嘛,戴尔台式机预装win10家庭版升级win10专业版方法教程...
  13. Oracle R12采购接收流程 PR PO RCV AP Payment
  14. 易语言单卡网络验证UI界面源码
  15. manifest.json 解析--手机web app开发笔记(三-2)
  16. 分享一个火狐浏览器firefox的所有版本所有平台所有国家的地址,一定要收藏好哦^_^
  17. 看板管理中看板的定义、构成,以及实际看板案例分享
  18. 垃圾分类主题班会PPT模板
  19. linux 命令行下wlan无线网卡配置 2
  20. 电影求爱方式之榜中榜

热门文章

  1. python生成QQ机器人爬取百度文库链接推送好友并生成词云
  2. 职校电子计算机专业高考分数线,2015年重庆高考分数线
  3. 使用SQL语句修改表数据
  4. [电子书]项目储备一: 字符编码与LCD显示单个字母/汉字
  5. ASM:《X86汇编语言-从实模式到保护模式》第17章:保护模式下中断和异常的处理与抢占式多任务...
  6. FPGA零基础学习:Signal tap 逻辑分析仪使用教程
  7. Java图形界面编程--界面版猜数字游戏
  8. 美篇服务器暂时无法访问,【美篇】不期而遇的惊喜——机上创意服务案例欣赏...
  9. 【问】启动SQL服务管理器时提示SQL Server could not find
  10. 解决 Vue 中路由跳转相同路径页面不刷新的问题