-
282024年4月
-
302024年3月
-
292024年2月
-
312024年1月
-
312023年12月
-
302023年11月
-
312023年10月
-
302023年9月
-
312023年8月
-
352023年7月
-
312023年6月
-
312023年5月
-
302023年4月
-
312023年3月
-
282023年2月
-
312023年1月
-
312022年12月
-
302022年11月
-
312022年10月
-
302022年9月
-
312022年8月
-
322022年7月
-
292022年6月
-
322022年5月
-
302022年4月
-
332022年3月
-
312022年2月
-
372022年1月
-
382021年12月
-
382021年11月
-
402021年10月
-
432021年9月
-
372021年8月
-
442021年7月
-
442021年6月
-
432021年5月
-
342021年4月
-
312021年3月
-
292021年2月
-
352021年1月
-
422020年12月
-
402020年11月
-
482020年10月
-
522020年9月
-
852020年8月
-
752020年7月
-
802020年6月
-
782020年5月
-
772020年4月
-
432020年3月
-
362020年2月
-
452020年1月
-
562019年12月
-
712019年11月
-
612019年10月
-
562019年9月
-
532019年8月
-
362019年7月
-
362019年6月
-
382019年5月
-
402019年4月
-
352019年3月
-
342019年2月
-
442019年1月
-
392018年12月
-
402018年11月
-
392018年10月
-
392018年9月
-
452018年8月
-
452018年7月
-
392018年6月
-
512018年5月
-
492018年4月
-
342018年3月
-
282018年2月
-
482018年1月
-
732017年12月
-
7292017年11月
-
7442017年10月
-
2892017年9月
-
12017年8月
我们请求一个网页时,不仅携带着headers等信息,而且会带一个ip地址。如果你一直携带着同一个ip地址,去大量快速请求同一个域名下的网页,网站就会识别出这是同一个人(同一个ip)在大量请求他的网站,这时往往会把你的ip封掉,或者弹出验证码验证你是不是机器。
如果试一下用python不加任何约束,成百上千次地循环访问豆瓣电影页面,会发现一段时间后爬虫报错,无法抓取到信息。这时如果你用浏览器登录豆瓣的网站,也会发现登不进去,因为你这个ip已经被封掉了,无论用python还是浏览器请求都没有用。这时你如果换一个wifi,就又可以正常访问了。
这种反爬虫方式只有当你大规模抓取网页时才会出现,如果你只是想抓取豆瓣top250个电影信息,请求次数非常少,则只使用自己的一个ip就不会被封。
用python做爬虫时,要想绕过这道反爬虫机制,一般有两种方法
降低抓取速度。比如每两次请求之间间隔2秒,即设置
time.sleep(2)
(事先import time
)。(你user-agent等伪装得当的情况下,如果2秒请求一次,这是人手动也可以操作出来的,网站就不敢确定你是一个爬虫程序,只有统一个ip 1秒请求很多次,网站才会直接判断你是爬虫)有时设置随机sleep时间,防止网站识别出你访问时间太过均匀可以设置代理IP,使用不断变化的IP来请求,这样就不会被判定为同一个人,请求非常快也无法被判定为爬虫。大量抓取时,如果不想以牺牲爬虫速度为代价获取数据,一般都要设置代理IP。
要想获得代理ip,主要有两种途径,一个是从免费代理ip网站上获得,另一个是购买付费代理。
就我个人而言,平时要抓取的数据大都在千或者万的级别,需要使用代理ip。但是爬虫只运行几个小时也就能结束了,因此我会选择按小时购买付费代理IP。如果数据量再大,需要跑几天几个月这种的,使用付费代理就比较贵了。
付费代理IP比较稳定,而且操作比较简单。下文我们就分别讲解付费代理IP和免费代理IP的设置。
requests代理IP设置
首先介绍一个网站
这是一个ip测试网站,你在浏览器打开这个网址,就可以看到你当前使用的ip,比如我的就是
{
"roigin": "59 .77 . 43 . 8"
}
如果你用requests请求的话,得到的也是浏览器中显示的内容,表示你这次请求时的IP >>> import requests >>> r = requests.get(' http://httpbin.org / ip')
>>> print ( r .text )
{
"origin": "59.77.43.8"
{
如果你设置了一个代理ip的话,它就会显示你设置的ip,下面我们用requests实现代理IP设置
import requests
>>> proxies = {
... 'http': 'http://180.160.103.185:8118',
... 'https': 'https://180.160.103.185:8118'
... }
>>> r = requests.get('http://httpbin.org/ip', proxies = proxies)
{
>>> print(r.text){ "origin": "180.160.103.185"
}
其中1180.160.103.185:8118
就是我们要找的代理IP,前半部分180.160.103.185
是ip,后半部分8118
是端口(port),两者都要有。
上面代码读者运行多半会报错,因为这个代理ip在我写文章时有效,在读者看文章时多半会失效了,带着失效的ip访问则抛出异常。
我们再来看看那里能获取到IP,现在随着互联网大数据的发展,所以免费代理IP平台非常多,我们就不一一举例说了,找个相类似的例子。例如:开心代理,这个网站就有实时更新免费的IP,已经实时检测匿名度,地域,相应时间,虽然免费IP的质量各方面不如收费的代理IP好,但是对于学习已经开发者来说能提供一个这样的免费代理IP还是一个非常不错的,如果免费代理IP达不到要求的话,也没有关系,平台还有收费有质量保障的代理IP,例如:动态高质量http代理,动态Socks5代理都是非常不错的,希望能给你们提供到帮助。