什么是网络爬虫

网络爬虫(又称为网页蜘蛛,网络机器人,在 FOAF 社区中,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。

网络爬虫的规模:

  1. 小规模爬虫:爬取的数据量小,爬取速度不敏感。爬取一个或几个网页。
  2. 中规模爬虫:爬取数据规模较大,爬取速度敏感。爬取整个网站甚至多个系列网站。
  3. 大规模爬虫:全网爬取,只能定制开发。主要是搜索引擎。

爬虫的编写思路

网页的渲染方式一般有两种:后端渲染和前端渲染。

早期的网页大多使用后端渲染的方式,即在服务器上生成 HTML 然后发送给客户端。而现在越来越多的网站开始使用前端渲染,服务器只把最基本的 HTML 发送给客户端,然后客户端通过 ajax 技术向服务器请求数据并用 JavaScript 动态生成网页。

编写爬虫程序时针对不同的渲染方式有不同的编写方法:

  • 如果是后端渲染,要爬取的数据一般就包含在 HTML 中。所以要先向指定 URL 发送请求,得到 HTML 文档,然后从 HTML 文档中提取所需的信息
  • 如果是前端渲染,数据一般包含在某个 API 的响应包中。所以先抓包找到该 API 的地址,然后分析请求方式、请求参数和请求头格式等,用 Python 模拟发送请求包,得到响应包后分析其结构并从中解析出所需的信息

在 Python 中,发送网络请求可以用标准库中的 urllib3,还可以用第三方库 requests,后者使用起来更加简单方便。

从 HTML 文档中提取信息一般有两种方式:

  • 直接通过正则表达式搜索整个文档,获取信息。Python 中的正则表达式库:re
  • 将 HTML 文档解析成一颗 DOM 树,然后通过特定语法搜索 DOM 树,获取信息。常用解析库:lxmlBeautifulSoup4 (bs4)

两种方式各有优缺点,需要结合实际情况合理搭配使用。

如果要编写中规模爬虫,爬虫框架 Scrapy 是个不错的选择。Scrapy 里自带了发送网络请求和解析网页的功能,无需再使用其他库。

如果要爬取的网站很复杂(主要体现在 API 或者身份验证方式很复杂),可以使用 selenium

使用 requests 请求网页

Python 第三方库:requests

lxml 解析网页

Python 第三方库:lxml

BeautifulSoup4 (bs4) 解析网页

Python 第三方库:BeautifulSoup4 (bs4)