0x00序言
Author:ChristopherLam 未经允许,禁止转载
我们知道,一些网站对于爬虫是不甚欢迎的,因此有一些基础的防爬措施,比如不允许相同的header在短时间内大量访问,今天就讲一种简单的绕过这种防爬策略的方法。
0x01关键代码实现机理
首先准备充足的User-Agent,既然不允许相同的header,那我改一改其中的User-Agent不就实现了吗?那么要怎么实现User-Agent的转换呢?这里我们使用random模块的choice方法,这个方法的
官方文档介绍为:
random.choice(
seq)
Return a random element from the non-empty sequence
seq. If
seq is empty, raises
IndexError.
翻译过来,就是这个方法在一个不为空的序列中返回一个随机的对象,如果序列为空,就触发IndexError。
也就是
这方法只接受
list类型
的变量。
0x02整体代码思路
好,接下来来理理切换header的思路。
1.准备一个序列,有足够的可切换的User-Agent。
2.将这个序列转换进字典变量(urllib模块或说其他第三方库的header只接受字典格式)
0x03具体代码实现
headers =['Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0',
'IE 9.0User-Agent:Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;',
'Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11',
'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER) ',
'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36']
def RandomUserAgent(headers):
header = {'User-Agent': choice(self.headers)}
return header
上图为准备的User-Agent,上网复制即可,User-Agent数量你项目短时间内爬取请求数呈正比。
上图为实现随机切换User-Agent
向创建的header变量添加User-Agent的键,对应值为choice(headers),即利用choice方法在headers列表中随机抽取一个元素。
最后返回即可。
这样即可轻松解决因大量爬取而造成的被服务器拒绝访问的问题。
代码很简单,你学会了吗?