2727大多数网站都会定义robots.txt文件,下面以淘宝的[ robots.txt] ( http://www.taobao.com/robots.txt ) 文件为例,看看该网站对爬虫有哪些限制。
2828
2929```
30+
3031User-agent: Baiduspider
3132Allow: /article
3233Allow: /oshtml
@@ -89,7 +90,7 @@ Disallow: /
8990
9091#### HTTP协议
9192
92- 在开始讲解爬虫之前,我们稍微对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截取的是经过网络适配器的数据,因此可以清晰的看到从物理链路层到应用层的协议数据。
93+ 在开始讲解爬虫之前,我们稍微对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截取的是经过网络适配器的数据,因此可以清晰的看到从物理链路层到应用层的协议数据。
9394
9495HTTP请求(请求行+请求头+空行+[ 消息体] ):
9596
@@ -114,6 +115,7 @@ HTTP响应(响应行+响应头+空行+消息体):
1141153 . HTTPie
115116
116117 ``` Shell
118+
117119 $ http --header http://www.scu.edu.cn
118120 HTTP/1.1 200 OK
119121 Accept-Ranges: bytes
@@ -136,6 +138,7 @@ HTTP响应(响应行+响应头+空行+消息体):
1361384 . BuiltWith:识别网站使用的技术
137139
138140 ``` Python
141+
139142 >> >
140143 >> > import builtwith
141144 >> > builtwith.parse(' http://www.bootcss.com/' )
@@ -150,6 +153,7 @@ HTTP响应(响应行+响应头+空行+消息体):
1501535 . python-whois:查询网站的所有者
151154
152155 ``` Python
156+
153157 >> >
154158 >> > import whois
155159 >> > whois.whois(' baidu.com' )
@@ -159,6 +163,7 @@ HTTP响应(响应行+响应头+空行+消息体):
1591636 . robotparser:解析robots.txt的工具
160164
161165 ``` Python
166+
162167 >> > from urllib import robotparser
163168 >> > parser = robotparser.RobotFileParser()
164169 >> > parser.set_url(' https://www.taobao.com/robots.txt' )
@@ -186,6 +191,7 @@ HTTP响应(响应行+响应头+空行+消息体):
1861917 . 将有用的信息进行持久化(以备后续的处理)。
187192
188193``` Python
194+
189195from urllib.error import URLError
190196from urllib.request import urlopen
191197
@@ -280,7 +286,7 @@ if __name__ == '__main__':
280286
2812872 . 设置代理服务。有些网站会限制访问的区域(例如美国的Netflix屏蔽了很多国家的访问),有些爬虫需要隐藏自己的身份,在这种情况下可以设置代理服务器(urllib.request中的ProxyHandler就是用来进行此项操作)。
282288
283- 3 . 限制下载速度。如果我们的爬虫获取网页的速度过快,可能就会面临被封禁或者产生“损害动产”的风险(这个可能会导致吃官司且败诉哦 ),可以在两次下载之间添加延时从而对爬虫进行限速。
289+ 3 . 限制下载速度。如果我们的爬虫获取网页的速度过快,可能就会面临被封禁或者产生“损害动产”的风险(这个可能会导致吃官司且败诉 ),可以在两次下载之间添加延时从而对爬虫进行限速。
284290
2852914 . 避免爬虫陷阱。有些网站会动态生成页面内容,这会导致产生无限多的页面(例如在线万年历等)。可以通过记录到达当前页面经过了多少个链接(链接深度)来解决该问题,当达到事先设定的最大深度时爬虫就不再像队列中添加该网页中的链接了。
286292
@@ -289,6 +295,7 @@ if __name__ == '__main__':
289295 - 使用未经验证的上下文
290296
291297 ``` Python
298+
292299 import ssl
293300
294301 request = urllib.request.Request(url = ' ...' , headers = {... })
@@ -299,6 +306,7 @@ if __name__ == '__main__':
299306 - 设置全局的取消证书验证
300307
301308 ```Python
309+
302310 import ssl
303311
304312 ssl._create_default_https_context = ssl._create_unverified_context
0 commit comments