【Python3爬虫】常见反爬虫措施及解决办法(一)
这一篇博客,是关于反反爬虫的,我会分享一些我遇到的反爬虫的措施,并且会分享我自己的解决办法。如果能对你有什么帮助的话,麻烦点一下推荐啦。
一、UserAgent
1 import requests 2 3 url = "http://www.baidu.com" 4 res = requests.get(url)
代码很简单,就是一个发送请求的代码。运行之前打开Fiddler,然后运行代码,在Fiddler中找到我们发送的请求,就可以看到有如下内容:
这时候我们的UserAgent字段的值就是python-requests/2.18.4,很显然这不是一个浏览器的UserAgent,而这样的UserAgent很容易就被识别出来,所以我们在编写爬虫的时候一定要注意添加UserAgent。然后对于一些网站,如果我们一直使用同一个UserAgent去访问,频率高了之后也会被ban掉,这个时候就需要使用随机的UserAgent了。
解决办法:
1.收集整理常见的UserAgent以供使用
ua_list =
["Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_2 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5",
"Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5",
"MQQBrowser/25 (Linux; U; 2.3.3; zh-cn; HTC Desire S Build/GRI40;480*800)",
"Mozilla/5.0 (Linux; U; Android 2.3.3; zh-cn; HTC_DesireS_S510e Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
"Mozilla/5.0 (SymbianOS/9.3; U; Series60/3.2 NokiaE75-1 /110.48.125 Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413",
"Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Mobile/8J2",
"Mozilla/5.0 (Windows NT 5.2) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/534.51.22 (KHTML, like Gecko) Version/5.1.1 Safari/534.51.22",
"Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A5313e Safari/7534.48.3",
"Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A5313e Safari/7534.48.3",
"Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A5313e Safari/7534.48.3",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; OMNIA7)",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; XBLWP7; ZuneWP7)",
"Mozilla/5.0 (Windows NT 5.2) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30",
"Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0",
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET4.0E; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET4.0E; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C)",
"Mozilla/4.0 (compatible; MSIE 60; Windows NT 5.1; SV1; .NET CLR 2.0.50727)",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; 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)",
"Opera/9.80 (Windows NT 5.1; U; zh-cn) Presto/2.9.168 Version/11.50",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)",
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET4.0E; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C)",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; ) AppleWebKit/534.12 (KHTML, like Gecko) Maxthon/3.0 Safari/534.12",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)"]
2.使用第三方库–fake_useragent
使用方法如下:
1 from fake_useragent import UserAgent 2 3 4 ua = UserAgent() 5 for i in range(3): 6 print(ua.random) 7 # Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36 8 # Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36 9 # Mozilla/5.0 (X11; Linux i686; rv:21.0) Gecko/20100101 Firefox/21.0
二、IP
对于一些网站来说,如果某个IP在单位时间里的访问次数超过了某个阈值,那么服务器就会ban掉这个IP了,它就会返回给你一些错误的数据。一般来说,当我们的IP被ban了,我们的爬虫也就无法正常获取数据了,但是用浏览器还是可以正常访问,但是如果用浏览器都无法访问,那就真的GG了。很多网站都会对IP进行检测,比如知乎,如果单个IP访问频率过高就会被封掉。
解决办法:
使用代理IP。网上有很多免费代理和付费代理可供选择,免费代理比如:西刺代理、快代理等等,付费代理比如:代理云、阿布云等等。除此之外,我们还可以建一个属于自己的代理池以供使用,这里可以参考下我的上一篇博客。
三、Referer防盗链
防盗链主要是针对客户端请求过程中所携带的一些关键信息来验证请求的合法性,而防盗链又有很多种,比如Referer防盗链、时间戳防盗链等等,这里只讲Referer防盗链。Referer用于告知服务器该请求是从哪个页面链接过来的,比如我们先打开少司命的百度百科:
然后打开开发者工具,再查看右侧的图片,能找到如下内容,这里Referer字段就表明我们是从什么页面跳转过去的:
但是如果我们直接在浏览器中输入url查看图片的话,是没有Referer的:
这里本来有一个例子的,就是妹子图:https://www.mzitu.com,不过现在无法访问了。这个网站的图片就使用了Referer防盗链,如果我们的爬虫没有携带符合要求的Referer字段,就会被识别出来。虽然我们请求的链接是没有问题的,但是因为没有Referer字段,它就不会把真正的图片返回给我们。
解决办法:
在请求头headers中添加Referer字段以及相应的值。
四、在html中动手脚
首先我不得不佩服那些前端工程师们,为了反爬虫真是想了不少办法,比如JS加密啊JS混淆啊,真是搞得人头大。不过我们这里先说那些在html中动手脚的,比如加一些无意义的字符之类的,这样即使我们能爬下来,得到的数据也是没法使用的。比如部分微信公众号的文章里会穿插一些乱七八糟的字符,这里用这篇文章作为例子:
解决办法:
可以看到每个字前面都加了一个span标签,span标签里加入了一个用于干扰的字符,而且有的还使用了strong标签,这就给我们的解析增加了难度。这里我使用的是lxml解析,解析完之后再对数据做一下清洗,完整代码如下:
1 import requests 2 from lxml import etree 3 4 url = "https://mp.weixin.qq.com/s?__biz=MzI0MDYwNjk2OA==&mid=2247484365&idx=4&sn=291a93e8a4ce6e90d3b6ef8b98fe09c4&chksm=e919085ade6e814cc037ecf6a873f22da0e492911a4e539e6f8fdeff022806b4d248c4d54194&scene=4" 5 res = requests.get(url) 6 et = etree.HTML(res.text) 7 lst = et.xpath(\'//*[@id="js_content"]/p//text()\') 8 lst = [lst[i] for i in range(1, len(lst), 2)] 9 text = \'\'.join(lst) 10 print(text)