网站给爬虫设置各种关卡:
1.设置限制访问:在一段时间内该IP是无法访问的
2.返回验证码:要求用户输入验证码,防止用户是机器
3.采用ajax异步加载:如果只是爬取静态网页的爬虫是什么都得不到的
4.爬虫陷阱:让你爬取的内容变成其他和本网站无关的信息
5.加速乐的服务:在访问之前先判断客户端的cookie正不正确。如果不正确,返回521状态码,set-cookie并且返回一段js
代码通过浏览器执行后又可以生成一个cookie,只有这两个cookie一起发送给服务器,才会返回正确的网页内容。
6.javascript渲染:网页开发者将重要信息放在网页中但不写入html标签中,而浏览器会自动渲染<script>标签的js
代码将信息展现在浏览器当中,而爬虫是不具备执行js代码的能力,所以无法将js事件产生的信息读取出来
针对以上的反爬,可以有以下几种躲过反爬虫的策略。
1.设置等待时间:
直接:导入time,然后限制时间为正常人浏览时间
间接:看具体情况来等待,比如某些元素需要一定时间加载。wait1.until(lambda driver
:driver.find_element_by_xpath("//div[@id='link-report']/span"))
2.识别验证码:
人工识别:适合比较复杂的验证码,正确率高,但是成本也高
机器识别:调用在线验证码识别软件接口识别验证码,正确率百分之八九十以上
3.异步加载:
① fiddler / wireshark抓包分析ajax请求的界面,再通过规律仿造服务器构造一个请求访问服务器得到返回的真实数据包。
② 通过PhantomJS+Selenium模拟浏览器行为,抓取经过js渲染后的页面。phantomjs是一个无头无界面浏览器,使用selenium
可以驱动它模拟浏览器的一切操作,但缺点也很明显,爬取效率低;需要注意的是,调用PhantomJs需要指定PhantomJs
的可执行文件路径,通常是将该路径添加到系统的path路径,让程序执行时自动去path中寻找。使用Selenium后,请求不再由Scrapy的Downloader
执行,所以之前添加的请求头等信息都会失效,需要在Selenium中重新添加
4.爬虫陷阱:
一般是比较简单的死循环,可以对爬虫将要爬取的链接进行判断,不重复爬取相同的页面。除此之外,对于特定的元素看清之后小心爬取,还可使用scrapy
的LinkExtractor设定unique参数为True即可或者直接设定爬虫的最大循环次数。
5.针对用户行为:
① cookie禁用:对于一些不需要登录的网站,可以在setting.py文件中设置COOKIES_ENABLED = False
② 自动限速:在setting.py文件中设置DOWNLOAD_DELAY = 1
③判断header:在请求时构造一个header,每次url请求更换一次user-agent。可以百度,也可看看之前的文章
<https://blog.csdn.net/weixin_41931602/article/details/80175325>
④ 采用代理IP:可以做一个IP代理池,每次运行时随机挑选一个做访问IP。IP代理有收费有免费,看情况使用
免费的代理不一定能用,需要先做一下测试
# testproxy.py #encoding=utf8 import urllib import requests import sys if
__name__ == "__main__": for url in sys.stdin: resp = requests.get(url) if
resp.status_code ==requests.codes.ok: print url
然后写个脚本,用crontab设置其定期运行