Python爬虫|网络爬虫简介
文章目录
Python爬虫|网络爬虫简介
网络爬虫何时有用
理想状态下, 网 络爬虫并不是必须品, 每个网站 都应该提供API, 以结构化的格式共享它们的数据。 然而现实情况中, 虽然一些网站 已经提供了这种API,但是它们通常会限制可以抓 取的数据,以及访问这些数据的频率。
网络爬虫是否合法
- 网 络爬虫目前还处于早期的蛮荒阶段,“允许哪些行为” 这种基本秩序还处于建设之中。 从目前的实践来看, 如果抓取数据的行为用于个人使用, 则不存ft问题: 而如果数据用于转载, 那么抓取的数据类型就非常关键了。
- 当抓取的数据是现实生活中的真实数据(比如,营业地址、 电话清单) 时, 是允许转载的。 但是, 如果是原创数据(比如, 意见和评论), 通常就会受到版权限制, 而不能转载。
- 无论如何, 当你抓取某个网站 的数据时,请记住自己是该网站 的访客,应当约束自己的抓取行为, 否则他们可能会封禁你的 IP , 甚至采取更进一步的法律行动。
背景调研
检查robots.txt
- 大多数网站 都会定义robots.txt 文件, 这样可以让爬虫了解爬取该网站时存ft哪些限制。 这些限制虽然仅仅作为建议给出, 但是良好的网 络公民都应当遵守 这些限制。检查robots. txt 文件这一宝贵资源可以最小化爬虫被封禁的可能,而且还能发现 和网站 结构相 关的线索。
- sect ion 2 规定, 无论使用哪种用户代理, 都应该ft两次下载请求之间给出5秒 的抓 取延迟, 我们需要遵从该建议以避免服务器过载。 这里还有一个/trap 链接,用于封禁那些爬取了不允许链接的恶意爬虫。如果你访问了这个链接, 服务器就会封禁你的IP 一分钟!
- sect ion 3 定义了一个Sitemap 文件,
检查网站地图
网站提供的Sitemap 文件(即网站 地图) 可以帮助爬虫定位网站 最新的内容, 而无须爬取每 一个网页。 网站 地图提供了所有网页的链接,虽然Sitema p文件提供了一种爬取网站 的有效方式, 但是我们仍需对其谨慎处理, 因为该文件经常存ft缺失、 过期或不完整的问题。
估算网站大小
目标网站 的大小会影响我们如何进行爬取,估算网站 大小的一个简便方法是检查Goo g le爬虫的结果,因为Goo gle很可能已经爬取过我们感兴趣的网站 。 我们可以通过Goo gle 搜索的site 关键词过滤域名结果, 从而获取该信息。
识别网站所用技术
构建网站 所使用的技术类型也会对我们如何爬取产生影响。 有一个十 分有 用的工具可以检查网站 构建的技术类型一-builtwith 模块。 该模块的安装 方法如下。
pip install builtwith
寻找网站所有者
对于一些网站 , 我们可能会关心其所有者是谁。 比如, 我们已知网站 的所有者会封禁网 络爬虫, 那么我们最好把下载速度控制得更加保守一些。 为了找到网站 的所有者,我们可以使用WHOIS协议查询域名的注册者是谁。
编写第一个网络爬虫
为了抓取网站 ,我们首先需要下载包含有感兴趣数据的网页, 该过程一般被称为爬取(crawling) 。
3 种爬取网站的常见方法::
- 爬取网站 地图
- 遍历每个网页的数据库ID
- 跟踪网页链接。
下载网页
要想爬取网页,我们首先需要将其下载下来。下面的示例脚本使用Python 的urllib 2 模块下载URL。
import urllib2
de f downl oad ( url ) : return urllib2 . url。pen ( ur l ) . read ()
当传入URL参数时, 该函数将会下载网页并返回其HTML。 不过, 这个代码片段存在一个问题, 即当下载网页时, 我们可能会遇到一些无法控制的错误, 比如请求的页面可能不存在。
-
重试下载
下载时遇到的错误经常是临时性的, 比如服务器 过载时返回的 503 Ser vice Unavailable错误。
-
设置用户代理
如果能使用可辨识的用户代理则 更好, 这样可以避免我们的网 络爬虫碰到一些问题。 此外, 也许是因为曾经 历过质量不佳的Python网 络爬虫造成的服务器过载, 一些网站 还会封 禁这个 默认的用户代理 。
网站地图爬虫
在第一个简单的爬虫中, 我们将使用示例网站 robots. tx t文件中发现 的网站 地图来下载所有网页。 为了解析网站 地图, 我们将会使用一个简单的 正则表达式, 从< loc >标签中提取出URL。
ID遍历爬虫
在爬取网站 时,遍历ID 是一个很便捷的方法,但是和网站 地图爬虫一样, 这种方法也无法保证始终可用。 比如, 一些网站 会检查页面别名是否满足预 期, 如果不是, 则会返回404 Not Found 错误。
链接爬虫
通过跟踪所有链接的方式,我们可以很容易地 下载整个网站 的页面。但是, 这种方法会下载大量我们并不需要的网页。 例如, 我们想要从一个在线论坛 中抓取用户账号详情页,那么此时我们只需要下载账号页, 而 不需要下载讨 论贴的页面。