27
27
大多数网站都会定义robots.txt文件,下面以淘宝的[ robots.txt] ( http://www.taobao.com/robots.txt ) 文件为例,看看该网站对爬虫有哪些限制。
28
28
29
29
```
30
+
30
31
User-agent: Baiduspider
31
32
Allow: /article
32
33
Allow: /oshtml
@@ -89,7 +90,7 @@ Disallow: /
89
90
90
91
#### HTTP协议
91
92
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截取的是经过网络适配器的数据,因此可以清晰的看到从物理链路层到应用层的协议数据。
93
94
94
95
HTTP请求(请求行+请求头+空行+[ 消息体] ):
95
96
@@ -114,6 +115,7 @@ HTTP响应(响应行+响应头+空行+消息体):
114
115
3 . HTTPie
115
116
116
117
``` Shell
118
+
117
119
$ http --header http://www.scu.edu.cn
118
120
HTTP/1.1 200 OK
119
121
Accept-Ranges: bytes
@@ -136,6 +138,7 @@ HTTP响应(响应行+响应头+空行+消息体):
136
138
4 . BuiltWith:识别网站使用的技术
137
139
138
140
``` Python
141
+
139
142
>> >
140
143
>> > import builtwith
141
144
>> > builtwith.parse(' http://www.bootcss.com/' )
@@ -150,6 +153,7 @@ HTTP响应(响应行+响应头+空行+消息体):
150
153
5 . python-whois:查询网站的所有者
151
154
152
155
``` Python
156
+
153
157
>> >
154
158
>> > import whois
155
159
>> > whois.whois(' baidu.com' )
@@ -159,6 +163,7 @@ HTTP响应(响应行+响应头+空行+消息体):
159
163
6 . robotparser:解析robots.txt的工具
160
164
161
165
``` Python
166
+
162
167
>> > from urllib import robotparser
163
168
>> > parser = robotparser.RobotFileParser()
164
169
>> > parser.set_url(' https://www.taobao.com/robots.txt' )
@@ -186,6 +191,7 @@ HTTP响应(响应行+响应头+空行+消息体):
186
191
7 . 将有用的信息进行持久化(以备后续的处理)。
187
192
188
193
``` Python
194
+
189
195
from urllib.error import URLError
190
196
from urllib.request import urlopen
191
197
@@ -280,7 +286,7 @@ if __name__ == '__main__':
280
286
281
287
2 . 设置代理服务。有些网站会限制访问的区域(例如美国的Netflix屏蔽了很多国家的访问),有些爬虫需要隐藏自己的身份,在这种情况下可以设置代理服务器(urllib.request中的ProxyHandler就是用来进行此项操作)。
282
288
283
- 3 . 限制下载速度。如果我们的爬虫获取网页的速度过快,可能就会面临被封禁或者产生“损害动产”的风险(这个可能会导致吃官司且败诉哦 ),可以在两次下载之间添加延时从而对爬虫进行限速。
289
+ 3 . 限制下载速度。如果我们的爬虫获取网页的速度过快,可能就会面临被封禁或者产生“损害动产”的风险(这个可能会导致吃官司且败诉 ),可以在两次下载之间添加延时从而对爬虫进行限速。
284
290
285
291
4 . 避免爬虫陷阱。有些网站会动态生成页面内容,这会导致产生无限多的页面(例如在线万年历等)。可以通过记录到达当前页面经过了多少个链接(链接深度)来解决该问题,当达到事先设定的最大深度时爬虫就不再像队列中添加该网页中的链接了。
286
292
@@ -289,6 +295,7 @@ if __name__ == '__main__':
289
295
- 使用未经验证的上下文
290
296
291
297
``` Python
298
+
292
299
import ssl
293
300
294
301
request = urllib.request.Request(url = ' ...' , headers = {... })
@@ -299,6 +306,7 @@ if __name__ == '__main__':
299
306
- 设置全局的取消证书验证
300
307
301
308
```Python
309
+
302
310
import ssl
303
311
304
312
ssl._create_default_https_context = ssl._create_unverified_context
0 commit comments