本文的文字及图片来源于网络,仅供学习、交流使用,不具备任何商业用途,版权归原做者全部,若有问题请及时联系咱们以做处理。
正文html
Python爬虫反爬策略三部曲,拥有这三步曲就能够在爬虫界立足了:浏览器
- 浏览器假装
- IP代理池和用户代理池构建
- 动态页面加载解决方法
注意:若是你Python基础不够扎实,建议先学好再来,缺Python最新教程的能够点击下方连接自行获取
http://note.youdao.com/noteshare?id=a3a533247e4c084a72c9ae88c271e3d1
网站反爬机制经常使用的方法:服务器
一、经过识别访问的headers来判断是爬虫仍是浏览器访问,其中最经常使用和最重要的就是User-Agent用户代理,服务器能够从这个字段识别出客户端浏览器类型和版本号、客户端的操做系统,页面排版等信息,正是由于这个缘由手机和电脑打开的同个网站的页面的排版是不一样的,经常使用的还有Referer等字段;cookie
二、经过用户行为,要是经过一个IP短期内大量访问数据,该网站可能对这个IP进行短期的禁止访问,这个能够增长访问延时时间,好比每访问一次延时time.sleep(5),延时5秒,要是爬取的数据量大的话这个爬取时间是挺蛋疼的,最好的方法就是同时构建用户代理池和IP代理池,每访问几回就换一个用户代理和IP代理就完美解决了;网络
三、动态页面加载,能够经过抓包分析出页面加载的规律而后构造批量请求,若是文件是加密的,可使用selenium+phantomJS浏览器内核来访问,这个是真实的用户行为,速度比较慢,能够浏览器操做的部分交给selenium+phantomJS,爬取的功能交给爬虫实现,虽然比纯爬虫慢,可是也没办法了。函数
先来第一部曲学习
浏览器假装网站
- 经过Request添加headers
- 经过Opener添加headers
- 批量添加headers
经过Request添加headersui
-
-
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)
-
-
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对象。
-
-
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")
-
经过批量添加headers
-
-
url=
"https://qiushibaike.com"
-
-
"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()
-
-
for key,value in headers.item():
-
-
-
-
opener.addheaders=headersall
-
urllib.request.install_opener(opener)
-
data=urllib.request.urlopen(url).read().decode(
"utf-8","ignore")
浏览器假装能够解决大部分网站的反爬机制,大型网站反爬机制就比较复杂点了,后面更新构建IP代理和用户代理,动态页面加载的解决方法