【Python必学】Python爬虫反爬策略你肯定不会吧?
前言
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。
正文
python爬虫反爬策略三部曲,拥有这三步曲就可以在爬虫界立足了:
- 浏览器伪装
- ip代理池和用户代理池构建
- 动态页面加载解决方法
注意:如果你python基础不够扎实,建议先学好再来,缺python最新教程的可以点击下方链接自行获取
网站反爬机制常用的方法:
1、通过识别访问的headers来判断是爬虫还是浏览器访问,其中最常用和最重要的就是user-agent用户代理,服务器可以从这个字段识别出客户端浏览器类型和版本号、客户端的操作系统,页面排版等信息,正是因为这个原因手机和电脑打开的同个网站的页面的排版是不同的,常用的还有referer等字段;
2、通过用户行为,要是通过一个ip短时间内大量访问数据,该网站可能对这个ip进行短时间的禁止访问,这个可以增加访问延时时间,比如每访问一次延时time.sleep(5),延时5秒,要是爬取的数据量大的话这个爬取时间是挺蛋疼的,最好的方法就是同时构建用户代理池和ip代理池,每访问几次就换一个用户代理和ip代理就完美解决了;
3、动态页面加载,可以通过抓包分析出页面加载的规律然后构造批量请求,如果文件是加密的,可以使用selenium+phantomjs浏览器内核来访问,这个是真实的用户行为,速度比较慢,可以浏览器操作的部分交给selenium+phantomjs,爬取的功能交给爬虫实现,虽然比纯爬虫慢,但是也没办法了。
先来第一部曲
浏览器伪装
- 通过request添加headers
- 通过opener添加headers
- 批量添加headers
通过request添加headers
-
import urllib.request
-
url="https://qiushibaike.com"
-
headers={"user-agent":"mozilla/5.0 (windows nt6.1; wow64) apple\
-
webkit/537.36 (khtml, likegecko) chrome/69.0.3497.92 safari/537.36"}
-
req=urllib.request.request(url,headers=headers)
-
#对request进行封装
-
data=urllib.request.urlopen(req).read().decode("utf-8","ignore")
通过opener添加headers
基本的urlopen()函数不支持验证、cookie或其他http高级功能,要支持这些功能必须使用build_opener()函数来创建自己的自定义opener对象
install_opener(opener)安装opener作为urlopen()使用的全局url opener,即意味着以后调用urlopen()时都会使用安装的opener对象。
-
import urllib.request
-
url="https://www.qiushibaike.com/"
-
headers=("user-agent":"mozilla/5.0 (windows nt6.1; wow64) apple\
-
webkit/537.36 (khtml, likegecko) chrome/69.0.3497.92 safari/537.36")
-
opener=urllib.request.build_opener()
-
opener.addheaders=[headers]
-
data=opener.open(url).read()
-
#使用自定义的伪装浏览器进行访问
-
urllib.request.install_opener(opener)
-
data=urllib.request.urlopen(url).read().decode("utf-8","ignore")
-
#也可以安装为全局,意味着以后调用urlopen()函数都会使用安装的opener对象
通过批量添加headers
-
import urllib.request
-
url="https://qiushibaike.com"
-
headers={
-
"user-agent":"mozilla/5.0 (windows nt6.1; wow64) apple\
-
webkit/537.36 (khtml, likegecko) chrome/69.0.3497.92 safari/537.36",
-
"referer":"https://qiushibaike.com"
-
}
-
#这里只是做一个演示,可以添加更多的字段,有些字段是不用的,有些字段是要的,这个可以进行抓包分析请求需求
-
opener=urllib.request.build_opener()
-
headerall=[]
-
for key,value in headers.item():
-
item=(key,value)
-
headerall.apend(item)
-
#[("",""),("","")] 遍历存储以后的形式
-
opener.addheaders=headersall
-
urllib.request.install_opener(opener)
-
data=urllib.request.urlopen(url).read().decode("utf-8","ignore")
浏览器伪装可以解决大部分网站的反爬机制,大型网站反爬机制就比较复杂点了,后面更新构建ip代理和用户代理,动态页面加载的解决方法