Python 爬虫基础入门与核心实现
Python 优势
对于网络爬虫开发来说,Python 有着天然的优势。主要体现在以下两个方面:
1. 抓取网页本身的接口
相比其他静态编程语言(如 Java、C# 与 C++),Python 抓取网页文档的接口更简洁。对比其他动态脚本语言(如 Perl、Shell),Python 的 urllib 包提供了较为完整的访问网页文档的 API。
此外,抓取网页有时候需要模拟浏览器的行为,很多网站对于生硬的爬虫抓取都是封杀的。此时,需要模拟 User-Agent 的行为来构造合适的请求(模拟用户登录、模拟 Session/Cookie 的存储和设置)。在 Python 里都有非常优秀的第三方包帮助搞定这些工作(如 Requests、Mechanize)。
2. 网页抓取后的处理
抓取的网页通常需要处理,比如过滤 HTML 标签,提取文本等。Python 的 BeautifulSoup 提供了简洁的文档处理功能,能用极短的代码完成大部分文档的处理。
其实以上功能很多语言和工具都能做,但是用 Python 能够干得最快,最干净。
Life is short, you need python.
PS:Python 2.x 和 Python 3.x 有很大不同,本文只讨论 Python 3.x 的爬虫实现方法。
爬虫框架
一个标准的爬虫框架通常包含以下核心组件:
- URL 管理器:管理待爬取的 URL 集合和已爬取的 URL 集合,传送待爬取的 URL 给网页下载器。
- 网页下载器(urllib):爬取 URL 对应的网页,存储成字符串,传送给网页解析器。
- 网页解析器(BeautifulSoup):解析出有价值的数据,存储下来,同时补充 URL 到 URL 管理器。
URL 管理器
基本功能
- 添加新的 URL 到待爬取 URL 集合中。
- 判断待添加的 URL 是否在容器中(包括待爬取 URL 集合和已爬取 URL 集合)。
- 获取待爬取的 URL。
- 判断是否有待爬取的 URL。
- 将爬取完成的 URL 从待爬取 URL 集合移动到已爬取 URL 集合。
存储方式
-
内存(Python 内存)
- 待爬取 URL 集合:
set() - 已爬取 URL 集合:
set()
- 待爬取 URL 集合:
-
关系数据库(MySQL)
- 表结构:
urls(url, is_crawled)
- 表结构:
-
缓存(Redis)
- 待爬取 URL 集合:
set - 已爬取 URL 集合:
set
- 待爬取 URL 集合:
大型互联网公司,由于缓存数据库的性能高,所以一般把 URL 存储在缓存数据库中。小型公司,一般把 URL 存储在内存中,要永久存储,则存储到关系数据库中。
网页下载器 urllib
将 URL 对应的网页下载到本地,存储成一个文件或字符串。
基本方法
新建 baidu.py,内容如下:
import urllib.request
response = urllib.request.urlopen('http://www.baidu.com')
buff = response.read()
html = buff.decode()
(html)


