网络爬虫(又被称为网页蜘蛛,网络机器人,在 FOAF 社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
简单来说,爬虫就是批量获取网页并提取和保存信息的自动化程序
一、为什么需要爬虫
日益发达的万维网上有着无数的网页,包含着海量的信息,无孔不入、森罗万象。很多时候我们需要提取这些有用的数据,然而这不是靠 Ctrl+c
、 Ctrl+v
就能解决的。我们需要一个自动化的程序来解决这些重复动作,按照我们制定的规则去提取我么需要的内容。
我们可以发现信息自由的重要性
爬虫可以干什么?
- 像上一篇文章写的爬取大长腿图片
- 每年春节前都火一波的抢火车票
- 可以创建搜索引擎(Google,百度什么的)
- 简单来讲只要浏览器能打开的,都可以用爬虫实现
可以看看逼乎上的问题:利用爬虫技术能做到哪些很酷很有趣很有用的事情?
链接:https://www.zhihu.com/question/27621722
二、爬虫是什么
简单来讲就是模仿浏览器来打开网页批量获取到我们需要的信息。这儿有个重点是批量获取。如果你还不知道浏览器是怎么打开网页的?那就有必要去补补了
参考:从输入 URL 到页面加载完成的过程中都发生了什么事情?
链接:http://fex.baidu.com/blog/2014/05/what-happen/
三、一个完整的爬虫
所以一个完整的爬虫一般会包含如下三个模块:
- 网络请求模块
- 爬取流程控制模块
- 内容分析提取模块
市面上常见的都是爬虫都是 Python 写的,理论上来说,任何支持网络通信的语言都是可以写爬虫的,爬虫本身虽然语言关系不大,但是 Python 之类的语言用起来更顺手
3.1 发起网络请求
爬虫首先要做的工作就是获取网页,这里就是获取网页的源代码。源代码里包含了网页的部分有用信息,所以只要把源代码获取下来,就可以从中提取想要的信息了。所以,最关键的部分就是构造一个请求并发送给服务器,然后接收到响应并将其解析出来,我爬虫其实就是一堆的 http(s)请求,找到待爬取的链接,然后发送一个请求包,得到一个返回包。这一步的重点就是 url 、请求 header、body、 响应 herder、body。构造请求头,模拟请求(这儿也涉及到模拟登录,不具体讲解),获取到响应体,然后就是解析了。
3.2 爬取流程控制
所谓爬取流程,就是按照什么样的规则顺序去爬取。我们这种写着玩的小打小闹的爬虫,不必要考虑太多问题,但是涉及到大规模的抓取,一定要有良好的爬虫设计,这时就要考虑数据的结构,去重,并发,分布式等等来提高效率。
3.3 内容分析提取
我们请求到响应的内容后,就需要提取有效信息了。内容的分析提取方式有很多,如果我们能直接获取到 HTML,可以使用以下方法提取:
- CSS 选择器:使用
cheeio
之类的库 - XPATH:XPath 即为 XML 路径语言(XML Path Language),它是一种用来确定 XML 文档中某部分位置的语言
- 正则表达式或普通字符串查找
如果说使用了 Ajax/Fetch 异步请求获取到数据,现在单页面应用发展的挺快,这也很常见。对于这种页面,分析的时候我们要跟踪所有的请求,观察数据到底是在哪一步加载进来的。然后当我们找到核心的异步请求的时候,就只需抓取到这个异步请求就可以了,然后就比较方便了。之前玩掘金的时候就发现掘金的文章列表的接口没做数量限制。哈哈哈,一次性就可以获取到全部文章……前两天看了下,掘金他们已经改了
四、常见反爬虫套路及应对
4.1 通过 Headers 反爬虫
从用户请求的 Headers 反爬虫是最常见的反爬虫策略。很多网站都会对 Headers 的 User-Agent 进行检测,还有一部分网站会对 Referer 进行检测。如果遇到了这类反爬虫机制,可以直接在爬虫中添加 Headers,将浏览器的 User-Agent 复制到爬虫的 Headers 中、将 Referer 值修改为目标网站域名。这类反爬虫很常见也很好对付
4.2 基于 IP 反爬虫
这是目前对爬虫最致命的招数。ip 限制有时并非是专门为了针对爬虫的,而大多数时候是出于网站安全原因针对 DOS 攻击的防御措施。这个虽然效果很好,但是其实有两个缺陷,一个是非常容易误伤普通用户,另一个就是 IP 不值钱,几十块钱甚至有可能买到几十万个 IP。
4.3 加密以及人机交互的反爬虫
有些网站把 ajax 请求的所有参数全部加密了,我们根本没办法构造自己所需要的数据的请求。有些网页往往需要和用户进行一些交互,进而才能走到下一步。这时候我们就可以使用 phantomJs 之类的无头浏览器了。用这几乎能绕过大多数的反爬虫机制,因为它不是在伪装成浏览器来获取数据,它本身就是浏览器,phantomJs 就是一个没有界面的浏览器,只是操控这个浏览器的不是人而是最适合做重复工作代码。
关于爬虫与反爬虫始终是: 道高一尺魔高一丈
本文介绍了爬虫的一些基本原理,这可以帮助我们更好地理解爬虫