800819103
在线客服,实时响应qq群
在线客服,实时响应客服电话
13318873961对于爬虫而言,要获得大量的信息,要了解对方的反爬虫机制情况,预防在采集过程中被批量封杀IP,那么网络爬虫怎么预防被封杀?
对方是怎么检测你是用户还是爬虫的呢?下文总结了一些网络爬虫怎么预防被封杀的方法。
一、设置等待时间
有一些网站的防范措施可能会因为你快速提交表单而把你当做机器人爬虫,比如说以非常人的速度下载图片,登录网站,爬取信息。
常见的设置等待时间有两种,一种是显性等待时间(强制停几秒),一种是隐性等待时间(看具体情况,比如根据元素加载完成需要时间而等待)
1.显性等待时间
import time#导入包time.sleep(3)#设置时间间隔为3秒
而且尽量在夜深人静的时候进行数据的采集,切记采集不要太快,不然容易让网站识别出你个非人类
2.隐式等待
这里用到的主要语句,以wait.until()为例
比如说形式如下
wait1.until(lambda driver: driver.find_element_by_xpath("//div[@id='link-report']/span"))
上面的语句就是在等待页面元素加载全部完成后才进行下一步操作,因为爬虫速度太快,导致一些元素没有被加载完全就进行下一步操作而导致没有查找到元素或者被网站认为是机器人在进行浏览。
二、修改请求头
识别你是机器人还是人类浏览器浏览的重要依据就是User-Agent,比如人类用浏览器浏览就会使这个样子的User-Agent:'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'
这里拿urllib2来说,默认的User-Agent是Python-urllib2/2.7,所以要进行修改。
import urllib2
req = urllib2.Request(url)
#多了以下一这一步而已
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36')
response = urllib2.urlopen(req)
三、采用代理ip
当自己的ip被网站封了之后,只能采取换代理ip的方式进行爬取,所以,我建议,每次爬取的时候尽量用代理来爬,封了代理,还有代理,无穷无尽啊。代理的实现程序:
# -*- coding: utf-8 -*-import urllib2
url = "http://www.ip181.com/"proxy_support = urllib2.ProxyHandler({'http':'121.40.108.76'})#参数是一个字典{'类型':'代理ip:端口号'}opener = urllib2.build_opener(proxy_support)#定制openeropener.add_handler=[('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36')]#add_handler给加上伪装urllib2.install_opener(opener)
response = urllib2.urlopen(url)print response.read().decode('gbk')
检验自己是否用代理ip成功:
使用代理ip访问
从结果中可以看出,检测出了代理ip,正是我自己加上的ip值,此乃最后一招,当自己ip被封后,采用代理ip进行访问。
要是一个代理ip挂了怎么办,那你可以做个ip池啊,就是把一堆代理ip放在一起,每次运行时从ip池挑一个代理ip当做访问ip就可以了!
采用ip池的方法~~~~~举个栗子
# -*- coding: utf-8 -*-
import urllib2
import random
ip_list=['119.6.136.122','114.106.77.14']
#使用一组ip调用random函数来随机使用其中一个ip
url = "http://www.ip181.com/"proxy_support = urllib2.ProxyHandler({'http':random.choice(ip_list)})
#参数是一个字典{'类型':'代理ip:端口号'}opener = urllib2.build_opener(proxy_support)
#定制opener
opener.add_handler=[('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36')]
#add_handler给加上伪装
urllib2.install_opener(opener)
response = urllib2.urlopen(url)
print response.read().decode('gbk')
使用ip池抽取ip访问
采用代理ip池的方法,可以看出,检测出的ip是ip池中的一个,对吧,很简单对不对,那么怎么来创建ip池呢,也很简单,用动态或者静态方法随便找个匿名ip的网站进行代理ip爬取,然后清洗一下ip,把能用的(测试一个简单的返回状态网页)留下来写到列表里,然后就可以形成ip池啦,最后当某个ip不能用了,那就从池中剔除!
四、避开不可见元素陷阱
自己爬着爬着就把隐藏元素都爬出来了,你说你自己是不是爬虫吧,这是网站给爬虫的陷阱,只要发现,立马封IP,所以请查看一下元素再进行爬取!
比如说这个网址,一个简单的登录页面,从审查元素中我们可以看到有一些元素是不可见的!
上述中可以看到隐藏的value和不显示的url
查找出陷阱url和不可见的value代码
结果就是
the link http://pythonscraping.com/dontgohereis a trap do not change value of phone do not change value of email
五、采用分布式爬取
分布式爬取,针对比较大型爬虫系统,实现步骤如下所示
1.基本的http抓取工具,如scrapy
2.避免重复抓取网页,如Bloom Filter
3.维护一个所有集群机器能够有效分享的分布式队列
4.将分布式队列和Scrapy结合
5.后续处理,网页析取(python-goose),存储(Mongodb)
(知乎上看到的补充一下)
通过上文,大家其实可以发现,爬虫预防被封杀的方法比较多,而且大部分的方法都是可以通用的,尽量把爬虫从头伪装到底,这样可以降低被封杀的几率。