|
|
@@ -27,6 +27,7 @@
|
|
|
大多数网站都会定义robots.txt文件,下面以淘宝的[robots.txt](http://www.taobao.com/robots.txt)文件为例,看看该网站对爬虫有哪些限制。
|
|
|
|
|
|
```
|
|
|
+
|
|
|
User-agent: Baiduspider
|
|
|
Allow: /article
|
|
|
Allow: /oshtml
|
|
|
@@ -89,7 +90,7 @@ Disallow: /
|
|
|
|
|
|
#### HTTP协议
|
|
|
|
|
|
-在开始讲解爬虫之前,我们稍微对HTTP(超文本传输协议)做一些回顾,因为我们在网页上看到的内容通常是浏览器执行HTML语言得到的结果,而HTTP就是传输HTML数据的协议。HTTP是构建于TCP(传输控制协议)之上应用级协议,它利用了TCP提供的可靠的传输服务实现了Web应用中的数据交换。按照维基百科上的介绍,设计HTTP最初的目的是为了提供一种发布和接收[HTML](https://zh.wikipedia.org/wiki/HTML)页面的方法,也就是说这个协议是浏览器和Web服务器之间传输的数据的载体。关于这个协议的详细信息以及目前的发展状况,大家可以阅读阮一峰老师的[《HTTP 协议入门》](http://www.ruanyifeng.com/blog/2016/08/http.html)、[《互联网协议入门》](http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html)系列以及[《图解HTTPS协议》](http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html)进行了解,下图是我在2009年9月10日凌晨4点在四川省网络通信技术重点实验室用开源协议分析工具Ethereal(抓包工具WireShark的前身)截取的访问百度首页时的HTTP请求和响应的报文(协议数据),由于Ethereal截取的是经过网络适配器的数据,因此可以清晰的看到从物理链路层到应用层的协议数据。
|
|
|
+在开始讲解爬虫之前,我们稍微对HTTP(超文本传输协议)做一些回顾,因为我们在网页上看到的内容通常是浏览器执行HTML语言得到的结果,而HTTP就是传输HTML数据的协议。HTTP是构建于TCP(传输控制协议)之上应用级协议,它利用了TCP提供的可靠的传输服务实现了Web应用中的数据交换。按照维基百科上的介绍,设计HTTP最初的目的是为了提供一种发布和接收[HTML](https://zh.wikipedia.org/wiki/HTML)页面的方法,也就是说这个协议是浏览器和Web服务器之间传输的数据的载体。关于这个协议的详细信息以及目前的发展状况,大家可以阅读阮一峰老师的[《HTTP 协议入门》](http://www.ruanyifeng.com/blog/2016/08/http.html)、[《互联网协议入门》](http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html)系列以及[《图解HTTPS协议》](http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html)进行了解,下图是我在四川省网络通信技术重点实验室工作期间用开源协议分析工具Ethereal(抓包工具WireShark的前身)截取的访问百度首页时的HTTP请求和响应的报文(协议数据),由于Ethereal截取的是经过网络适配器的数据,因此可以清晰的看到从物理链路层到应用层的协议数据。
|
|
|
|
|
|
HTTP请求(请求行+请求头+空行+[消息体]):
|
|
|
|
|
|
@@ -114,6 +115,7 @@ HTTP响应(响应行+响应头+空行+消息体):
|
|
|
3. HTTPie
|
|
|
|
|
|
```Shell
|
|
|
+
|
|
|
$ http --header http://www.scu.edu.cn
|
|
|
HTTP/1.1 200 OK
|
|
|
Accept-Ranges: bytes
|
|
|
@@ -136,6 +138,7 @@ HTTP响应(响应行+响应头+空行+消息体):
|
|
|
4. BuiltWith:识别网站使用的技术
|
|
|
|
|
|
```Python
|
|
|
+
|
|
|
>>>
|
|
|
>>> import builtwith
|
|
|
>>> builtwith.parse('http://www.bootcss.com/')
|
|
|
@@ -150,6 +153,7 @@ HTTP响应(响应行+响应头+空行+消息体):
|
|
|
5. python-whois:查询网站的所有者
|
|
|
|
|
|
```Python
|
|
|
+
|
|
|
>>>
|
|
|
>>> import whois
|
|
|
>>> whois.whois('baidu.com')
|
|
|
@@ -159,6 +163,7 @@ HTTP响应(响应行+响应头+空行+消息体):
|
|
|
6. robotparser:解析robots.txt的工具
|
|
|
|
|
|
```Python
|
|
|
+
|
|
|
>>> from urllib import robotparser
|
|
|
>>> parser = robotparser.RobotFileParser()
|
|
|
>>> parser.set_url('https://www.taobao.com/robots.txt')
|
|
|
@@ -186,6 +191,7 @@ HTTP响应(响应行+响应头+空行+消息体):
|
|
|
7. 将有用的信息进行持久化(以备后续的处理)。
|
|
|
|
|
|
```Python
|
|
|
+
|
|
|
from urllib.error import URLError
|
|
|
from urllib.request import urlopen
|
|
|
|
|
|
@@ -280,7 +286,7 @@ if __name__ == '__main__':
|
|
|
|
|
|
2. 设置代理服务。有些网站会限制访问的区域(例如美国的Netflix屏蔽了很多国家的访问),有些爬虫需要隐藏自己的身份,在这种情况下可以设置代理服务器(urllib.request中的ProxyHandler就是用来进行此项操作)。
|
|
|
|
|
|
-3. 限制下载速度。如果我们的爬虫获取网页的速度过快,可能就会面临被封禁或者产生“损害动产”的风险(这个可能会导致吃官司且败诉哦),可以在两次下载之间添加延时从而对爬虫进行限速。
|
|
|
+3. 限制下载速度。如果我们的爬虫获取网页的速度过快,可能就会面临被封禁或者产生“损害动产”的风险(这个可能会导致吃官司且败诉),可以在两次下载之间添加延时从而对爬虫进行限速。
|
|
|
|
|
|
4. 避免爬虫陷阱。有些网站会动态生成页面内容,这会导致产生无限多的页面(例如在线万年历等)。可以通过记录到达当前页面经过了多少个链接(链接深度)来解决该问题,当达到事先设定的最大深度时爬虫就不再像队列中添加该网页中的链接了。
|
|
|
|
|
|
@@ -289,6 +295,7 @@ if __name__ == '__main__':
|
|
|
- 使用未经验证的上下文
|
|
|
|
|
|
```Python
|
|
|
+
|
|
|
import ssl
|
|
|
|
|
|
request = urllib.request.Request(url='...', headers={...})
|
|
|
@@ -299,6 +306,7 @@ if __name__ == '__main__':
|
|
|
- 设置全局的取消证书验证
|
|
|
|
|
|
```Python
|
|
|
+
|
|
|
import ssl
|
|
|
|
|
|
ssl._create_default_https_context = ssl._create_unverified_context
|