1.反爬虫措施一般分为四类:
①基于验证码的反爬虫:传统验证码、逻辑验证码、滑动验证码、google访问时弹出的验证码
②基于Headers的反爬虫:常用的是User-Agent字段、Referer字段。
③基于用户行为的反爬虫:
a. 同一个IP短时间多次访问同一页面→使用大量IP代理进行绕过;
b. 同一账户短时间多次进行相同操作→注册较多的账户登陆,构成一个cookie池,对用户状态进行自动切换;
c. 访问页面的间隔比较固定,不像人在访问→将访问间隔设置成随机,尽可能模拟人的访问频率;
④基于动态页面的反爬虫:
a.页面使用Ajax动态加载→需要分析Ajax请求,然后进行模拟发送获取数据
b.Ajax请求的所有参数全部加密,无法构造所需数据的请求→ 使用selenium+phantomJS(缺点:较低的效率和较大的内存消耗)
爬虫和反爬虫的斗争中,最终必然是爬虫胜利,只不过是付出多大的代价而已。
2.在scrapy中推荐的突破反爬虫措施(也适用于普通爬虫程序):
①动态User-Agent池(伪装存在很多用户)
可使用下载器中间件RandomUserAgent, 设置动态的User-Agent。使用时在settings.py中将内置的UserAgentMiddleware禁用,并激活RandomUserAgent即可。
## 用于产生随机的User-Agent
import random
class RandomUserAgent(object):
def __init__(self, agents):
self.agents = agents
@classmethod
def from_crawler(cls, crawler):
# 从Settings.py中加载USER-AGENTS的值
return cls(crawler.settings.getlist('USER-AGENTS'))
def process_request(self, request, spider):
# 在process_request中设置User-Agent的值
request.headers.setdefault('User-Agent': random.choice(self.agents))
②禁用cookies
如果登陆的网站不需要登陆就可以进行爬取,可以尝试将Cookies禁用,因为Cookies会跟踪爬虫的访问过程,容易被发现。
禁用Cookies的设置方法:settings.py中→ COOKIES_ENABLED=False
③设置下载延时与自动限速
settings.py中→
DOWNLOAD_DELAY = 2 #下载延时
RANDOMIZE_DOWNLOAD_DELAY = True #延迟时间=(随机值0.5-1.5)*DOWNLOAD_DELAY
但有一些网站会检测访问延迟的相似性,也有被发现的可能性,此时可以使用scrapy提供的自动限速扩展方法,此扩展能根据Scrapy服务器以及爬取的网站的负载自动限制爬取速度。
④代理IP池
⑤Tor代理
⑥分布式下载器:Crawlera
⑦Google cache