爬虫的主要作用就是在网站互联的大网上收集、分析各种网页数据
工作原理也很简单,给爬虫一个URL,通过HTTP协议把HTML页面下载下来,分析里面的元素,比如说表单、表格、链接等
因为HTML页面是纯文本的,可以把它形成一棵DOM树,也可以使用正则表达式去获取想要的东西。
最重要的事,拿到这个页面的其他的链接,然后拿这些链接对应的HTML页面,继续分析,然后循环下去,把所有的页面找出来。
所以一个爬虫最基本的能力有:
- 通过HTTP协议访问网页
- 分析HTML网页
## 反爬虫
一般而言,如果在网站的根目录下放一个robots.txt,里面定义好那些内容对爬虫开放,当然这只是约定俗成的规范,而不是标准,所以总有爬虫不守规范。
作为程序,爬虫访问起网络来,比人类快很多,如果爬虫很多,会给网站带来非常大的流量,所以网站会想到很多办法来**反爬虫**
最开始的时候,爬虫在发出HTTP请求的时候,没有伪装自己,不会修改User Agent,所以网竞争力可以很容易的禁止我们。
> User Agent其实就是HTTP Header的一个字符串,让服务器能识别客户端的操作系统及版本,浏览器及版本,浏览器引擎、语音等。可以针对性的返回桌面版或者手机版的网页。
后来我们也可以把user Agent设置得和人类浏览器甚至伪装成Goolge的爬虫。
网站还可以分析我们的行为,比如说一秒之内有多少次请求,就认为是爬虫。
## 陷阱、验证码
有些网站会在的网站发回的HTML页面里面包含一些人类肉眼看不到的链接,人类看不到,所以不会点击,但是爬虫能分析所有的链接,所以会踩到陷阱里面去。
这样,服务器就可以名正言顺的**封IP**
还有一招就是验证码,如果一段时间访问次数超过某个阈值,立刻显示一个图形验证码。现在验证越来越复杂,就算使用OCR也不行。
我们可以做分布式,让每个机器的爬虫运行得慢一点,不要触发封锁策略。
还可以使用代理,让IP不断变化
网站还有一种策略是,识别出是爬虫之后,返回一些假数据,和真实数据混在一起。
## selenium
随着互联网技术发展,现在访问一个URL后,返回的HTML特别少,JS特别多,从HTML中几乎找不到有用的东西。
原来,网站都用JS在浏览器端渲染了。
这些JS通过AJAX方式访问后端网站的API,返回的都是JSON,只需要弄清API的输入和输出,直接调用API就可以拿到数据。
当时直接调用API的时候,也是有很多麻烦,比如需要进行认证,例如发个token
后来,干脆使用**无界面浏览器**,也就是内嵌浏览器,这个浏览器不需要界面显示,可以程序中静悄悄地执行。这样,就可以相当于一个真正的人类在请求网页,把JS下载下来,就在无界面浏览器中执行,等待渲染完了,就可以拿到HTML做后续的分析了