前言
在爬取的过程中难免发生ip被封和403错误等等,这都是网站检测出你是爬虫而进行反爬措施,这里自己总结下如何避免。
方法1:设置等待时间
有一些网站的防范措施可能会因为你快速提交表单而把你当做机器人爬虫,比如说以非常人的速度下载图片,登录网站,爬取信息。
常见的设置等待时间有两种,一种是显性等待时间(强制停几秒),一种是隐性等待时间(看具体情况,比如根据元素加载完成需要时间而等待)
1.显性等待时间
import time#导入包
time.sleep(3)#设置时间间隔为3秒
而且尽量在夜深人静的时候进行数据的采集,切记采集不要太快
.隐式等待这里用到的主要语句,以wait.until()为例比如说形式如下
wait1.until(lambda driver: driver.find_element_by_xpath("//p[@id='link-report']/span"))
上面的语句就是在等待页面元素加载全部完成后才进行下一步操作,因为爬虫速度太快,导致一些元素没有被加载完全就进行下一步操作而导致没有查找到元素或者被网站认为是机器人在进行浏览。
具体的案例可以在我以前的文章中详细应用Python自定义豆瓣电影种类,排行,点评的爬取与存储(进阶下)
方法2:修改请求头
识别你是机器人还是人类浏览器浏览的重要依据就是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)
方法3:采用代理ip
当自己的ip被网站封了之后,只能采取换代理ip的方式进行爬取,所以,我建议,每次爬取的时候尽量用代理来爬,封了代理,还有代理,无穷无尽啊,可别拿代理去黑学校网站啊。
方法4:避开不可见元素陷阱
自己爬着爬着就把隐藏元素都爬出来了,你说你自己是不是爬虫吧,这是网站给爬虫的陷阱,只要发现,立马封IP,所以请查看一下元素再进行爬取!比如说这个网址,一个简单的登录页面,从审查元素中我们可以看到有一些元素是不可见的!
方法5:采用分布式爬取
基于Python,scrapy,redis的分布式爬虫实现框架
分布式爬取,针对比较大型爬虫系统,实现步骤如下所示1.基本的http抓取工具,如scrapy2.避免重复抓取网页,如Bloom Filter3.维护一个所有集群机器能够有效分享的分布式队列4.将分布式队列和Scrapy结合5.后续处理,网页析取(python-goose),存储(Mongodb)
方法6:进行模拟登陆
这个就太多了,一般用Selenium,可以结合Firefox或者是无头浏览器PhantomJS,这个做的东西比较多了,如果感兴趣,可以点击这些,进行查看,方法,代码,解析,一应俱全