这是一个爬取百度百科内容的爬虫,主要由以下几个部分组成:
url 管理器
它的作用是管理需要爬取的 url
,它自身维护了两个 set()
集合, new_urls
和 old_urls
,用 set()
集合当然是因为它可以自动去重:
1 | def __init__(self): |
该类主要有四个方法:
添加一个或者多个 url
到 set()
集合中,在 new_urls
或者 old_urls
中出现的 url
当然是不做操作了:
1 | def add_new_url(self, url): |
然后提供获取 url
和判断集合是否已经遍历完成的方法:
1 | def has_new_url(self): |
执行过获取 url
方法之后的 url
就添加到 old_urls
集合中。
下载器
使用 urllib2 模块的功能可以轻松完成:
1 | def download(self, url): |
解析器
该部分也是爬虫最为核心的部分,它决定了爬虫应该爬取哪些内容,
使用了 BeautifulSoup 模块来完成核心的解析部分。
关于 BeautifulSoup
的使用可以先看一个小 Demo :
1 | #!/usr/bin/env python |
结果为:
1 | 获取所有链接 |
它是将整个 url
中的内容解析成 Dom 树,按节点来查找相应的内容,更高效。
回到我们的解析器,它主要由两个功能组成,一个是获取 url
中的数据,这个数据所在的节点需要我们自己决定。
我们所要爬取的就是标题和内容。
根据审查,百度百科中我们所要获取的内容的信息分别为:
以及:
然后就可以编写对应的数据获取代码了:
1 | def get_new_data(self, page_url, soup): |
解析器的另外一个功能是从内容中获取新的需要爬取的 url
地址:
1 | def _get_new_urls(self, page_url, soup): |
这里我们使用正则来匹配 href
中的内容是否符合我们要爬取的 url
:
1 | links = soup.find_all('a', href=re.compile(r"/item/(.*)")) |
将两个功能整合,我们的解析器就完成了:
1 | def parse(self,page_url,html_cont): |
内容输出
应该是要将其导出到数据库中的,暂时我们将它写入到一个文档中:
1 | #!/usr/bin/env python |
该部分的逻辑还是比较简单的。
主程序
关于主程序的编写,首先逻辑一定要清晰,主要按照如下的流程进行:
其中我们是直接导出到一个文档,而不是应用中的。
首先我们导包:
1 | import url_manager,html_parser,html_downloader,html_outputer |
初始化程序:
1 | def __init__(self): |
然后按照上图的逻辑,定义爬取方法,一步步执行对应操作:
1 | def craw(self, root_url): |
由于抓取的途中会出现一些 url
内容为空或者是不符合规范,所以我们使用 try...catch...
语句包裹,这里我们先抓取 50 条数据测试一下。
启动爬虫程序:
1 | if __name__ == '__main__': |
运行了 28 秒左右 Exited with code=0 in 28.146 seconds.
控制台:
1 | craw 1 : http://baike.baidu.com/item/Python |
output.html 文件也获取到了想要爬取的内容:
至此,人生第一个 Python 爬虫完成。
该文主要是根据慕课网的视频 Python 开发简单爬虫 整理而成。