一、问题描述
之前爬虫过程主要存在两个个问题:
(1)爬取到网页源码之后,没有解析,直接利用正则表达式抓取信息,这样做起来比较费劲,容易造成信息抓取不全面,同时,所有页面链接都是根据链接规律自建的,没有做到自动爬取。
(2)代码未做模块化处理,检查错误比较难。
在改善了上述两个问题之后,重新爬取了百度百科中疾病信息库,并保存在.xlsx文件中
二、网页分析及爬虫结构
1、网页分析
爬虫入口链接:root_url=“http://baike.baidu.com/fenlei/%E7%96%BE%E7%97%85”
爬虫入口页面:
红圈对应源码位置为该疾病链接,蓝圈对应位置为每个分页链接
因此本次爬虫的过程为:依次爬取每页所有疾病链接,进而根据疾病链接爬取疾病信息
2、爬虫结构
(1)url 集合
urls_0=set():主页链接集合(未爬取)
urls_1=set():疾病页面链接集合(未爬取)
new_url_0:主页链接(即将爬取)
new_url_1:疾病链接(即将爬取)
old_urls=set():所有已爬取链接集合(防止重复爬取)
(2)模块
main: 主程序(调度,保存数据)
url_manager :url管理器(url保存,提取,查空)
html_downloader :html下载器(下载HTML)
html_parser :html解析器(提取主页内疾病链接和疾病页面内所需信息)
(3)爬取过程
三、具体模块代码
为方便查看,将主模块放在最后
1、url_manager :url管理器(url保存,提取,查空)
class UrlManager(object):
def __init__(self):
self.new_urls_0=set()#主页链接集合(未爬取)
self.new_urls_1=set()#疾病链接集合(未爬取)
self.old_urls=set()#已爬取链接集合
#单一url添加到url_set中
def add_new_url(self,url,url_set):
if url is None:
return
if url not in url_set and url not in self.old_urls:
url_set.add(url)
#多个ur