python爬虫技术基础(2)header是处理及网络超时
有时我们发送的网络请求可能会被服务器拒绝这可能是该网站设置了反爬虫机制来防止用户恶意采集信息,但这不代表我们不能访问该网站,我们可以模拟服务器的头部信息去访问。
1. 请求headers处理
我们首先打开我们要访问的网站,然后根据浏览器的打开方式进入检查页面,例如谷歌浏览器可以直接按F12或者Ctrl+Shift+I,进入下要页面:
找到document文件并单击,如下图页面:
这个就为我们的头部信息,也就是我们当前访问此网站的用户信息,我们复制一下然后开始使用它,代码如下:
1 2 3 4 5 6 | import requests url = 'https://www.baidu.com/' headers = { 'User-Agent' :'Mozilla / 5.0 (Windows NT 10.0 ; Win64; x64) AppleWebKit / 537.36 (KHTML, like Gecko) Chrome / 79.0 . 3945.130 Safari / 537.36 '} #头部信息 r = requests.get(url,headers = headers) #发送网络请求 print (r.text) #以文本形式输出网页源码 |
输出为网站的html源码,如下图:
这种方式类似于我们模拟了一个用户去访问该网站,等同于手动在打开浏览器去访问。
2. 网络超时
我们在发送网络请求的时候避免不了超时现象的发生,如果我们不设置一个超时时间,那么系统会因为它长时间未响应而无法打开网页。
超时又分为连接超时和读取超时。
连接超时就是在程序默认的等待时间内没有得到服务器的响应。
我们来看个例子:
1 2 3 4 5 6 7 8 9 10 11 | import datetime import requests url = 'http://www.google.com.hk' print (datetime.datetime.now()) try : r = requests.get(url, timeout = 5 ).text print ( '获得响应' ) except requests.exceptions.RequestException as s: print ( '连接超时' ) print (s) print (datetime.datetime.now()) |
输出结果为:
1 2 3 4 5 6 | 2020 - 02 - 19 21 : 09 : 06.084353 连接超时 HTTPConnectionPool(host = 'www.google.com.hk' , port = 80 ): Max retries exceeded with url: / (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x0383A298 >, 'Connection to www.google.com.hk timed out. (connect timeout=5)' )) 2020 - 02 - 19 21 : 09 : 11.125962 |
由于国内的服务器无法正常访问谷歌,所以出现连接超时的现象,其中关键语句为:
1 | r = requests.get(url, timeout = 5 ).text |
我们在这条语句中设置超时限定时间。
我们再来看一下读取超时,读取超时就是指客户端等待服务器发送请求的时间,也就是指连接成功之后服务器返回响应之间等待的时间,为了防止服务器响应速度过慢而导致等待时间过长,我们可以设置读取时间,超过了规定时间即为读取超时,它的用法和连接超时类似,关键语句为:
1 | r = requests.get(url, timeout = ( 5 , 10 )).text |
在这里15即为读取限制时间,如果超过即为读取超时。
3. 总结
本节的内容能够帮助我们高效的进行爬虫操作,模拟浏览器头部信息的访问方式在爬虫中会经常用到,各个浏览器对应的方式可能不同,大家可以通过自己的浏览器去找到相应的信息去解读。