在爬取信息的过程中,最烦的莫过于程序报出各种代码的网络连接的错误,类似HTTP ERROR、WIN ERROR 10060等等。那么遇到这种情况怎么办呢,有以下几种解决途径:
(1)添加UA头
这个一般都会做,请求的时候requests.get(url,headers=headers)
这里有一个UA头的大全集,可以参考一下:
user_agent_list = [
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
"Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
"Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) App leWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53"
]
UA=random.choice(user_agent_list)#获取随机的User_Agent
headers={'User_Agent':UA}
(2)设置等待间隔,过一会儿再申请
time.sleep(seconds)用来使程序休息一会,否则过高的爬取速度会让目标服务器的带宽负载受不了的,大多数网站服务器会做一些简单的反爬虫,它检测出指向你的IP地址的机器不停地请求数据,根本不像正常人类行为,就有可能会把你封掉。因此,不要急,慢慢来。在最后一步需要频繁抓取的代码里加上time.sleep()函数,等个两三秒再爬。
此外,递归request是个好方法,当一次请求失败时,我先停上8秒(向百度网盘致敬),然后再重新请求页面,如果再失败,我再停上8秒,再请求……这个过程是很明显的递归。代码如下:
def auto_request(img_href):
global imgrealhtml
try:
UA=random.choice(user_agent_list)#获取随机的User_Agent
headers={'User_Agent':UA}
imgrealhtml=requests.get(img_href,headers=headers)
except:
time.sleep(8)
print(u'请稍等,8秒后重新下载')
auto_request(img_href)
return imgrealhtml
注意:我对于global imgrealhtml 进行了加粗处理,一定要加上这句话,如果没有的话,当第一次请求失败执行except语句的时候会报错,因为这是一个全局函数,imgrealhtml默认是一个全局变量,如果第一次失败,内存中已经产生了一个imgrealhtml,执行except语句的时候,再从头开始执行,又产生了一个imgrealhtml,这样imgrealhtml的值发生了改变,而python就会认为imgrealhtml是一个局部变量,与全局变量的设定相矛盾。因此要先声明global。
(3)IP代理和TOR
大名鼎鼎的VPN就是用来做这个的。很多VPN的花费并不高,速度不太快,连接不太好的甚至还有免费的,注册一下送180天。
网络上有很多免费的IP代理,经我实际检验,基本上都不行,如果想用有效的,还是要花点钱买资源。
TOR洋葱路由(The Onion Router)网络,常用缩写为 Tor,是一种 IP 地址匿名手段。由网络志愿者服务器构建的洋葱路由器网络,通过不同服务器构成多个层(就像洋葱)把客户端包在最里面。数据进入网络之前会被加密,因此任何服务器都不能偷取通信数据。另外,虽然每一个服务器的入站和出站通信都可以被查到,但是要想查出通信的真正起点和终点,必须知道整个通信链路上所有服务器的入站和出站通信细节,而这基本是不可能实现的。
总结:
其实对于一般的小网站(非百度 淘宝 等大型网站),递归request+随机UA头的方法基本上够用了,如果不是非常必要,比如自己的IP被封了(HTTP error :403 Forbidden),不要去用IP代理,很影响速度,而且常常连接不上。