您的位置:首页 > 其它

scrapy进阶:防ban策略之随机user-agent,from_crawler等小技巧

2017-11-10 16:44 405 查看
爬虫会给网站带来一定的压力,网站会做一起反爬的措施。

我们可以对scrapy做一些定制,防止爬虫被禁用



如下代码实现一个随机更换scrapy的user-agent的middleware。

import random
class RotateUserAgentMiddleware(object):
def process_request(self, request, spider):
ua = random.choice(self.user_agent_list)
if ua:
# 显示当前使用的useragent
print("********Current UserAgent:%s************" % ua)
# 记录
#logging.log('Current UserAgent: ' + ua, level='INFO')
request.headers.setdefault('User-Agent', ua)
# the default user_agent_list composes chrome,I E,firefox,Mozilla,opera,netscape
# for more user agent strings,you can find it in http://www.useragentstring.com/pages/useragentstring.php user_agent_list = [ \
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 "
"(KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
"Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 "
"(KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 "
"(KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 "
"(KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 "
"(KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 "
"(KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 "
"(KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 "
"(KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 "
"(KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
]

Middleware在setting里都需要做挂载。

DOWNLOADER_MIDDLEWARES = {
#取消原有的useragent中间件,挂载自己的随机useragent
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
'eagle.middlewares.RotateUserAgentMiddleware' :400,

现在user-agent已经是随机的了。

pipline或middleware如何得到setting?

在我们定制自己的pipline或middleware时,有时候会需要访问系统的setting。那如何得到?crawler实例可以访问到几乎所有的配置,我们需要在pipline或middleware初始化的时候传入crawler的实例,这里scrapy的设计比较精妙,也不太好理解。

#如果类方法存在,会被调用,得到全局的crawler
#这个类的实例化的时候,会把当前全局的crawler实例传进来初始化pipline,所以init要传入crawler
@classmethod
def from_crawler(cls, crawler):
return cls(crawler)

class SelfPipeline(object):
def __init__(self, crawler):
super(EaglePipeline, self).__init__()
es_hosts = crawler.settings.get("ES_HOST", "xxx")

如上,pipline的init就传入了全局的crawler。

除了得到crawler的实例,还可以得到spider的事件:

open_spider(self, spider)

当 spider 被开启时,这个方法被调用。

close_spider(spider)

当 spider 被关闭时,这个方法被调用

request.meta的用处

每一个request都带有一个meta成员变量,其实是一个dict,可以存放各种定义的数据,比如:

{'depth': 2, 'download_timeout': 180.0, 'link_text': '', 'rule': 1}

这个depth就很有用,有时候在middleware,我们想知道当前url在第几个层次,都一些处理。start_url是没有depth这个字段,我们自然也就知道当前url是首页。

关于作者:魏佳斌,互联网产品/技术总监,北京大学光华管理学院(MBA),特许金融分析师(CFA),资深产品经理/码农。偏爱python,深度关注互联网趋势,人工智能,AI金融量化。致力于使用最前沿的认知技术去理解这个复杂的世界。

扫描下方二维码,关注:AI量化实验室(ailabx),了解AI量化最前沿技术、资讯。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: