Scrapy使用随机User-Agent爬取网站

news/2024/5/15 23:33:57/文章来源:https://blog.csdn.net/weixin_34239169/article/details/89618107
img_bfc63943164d22241520493724e082d9.jpe
小哈.jpg

在爬虫爬取过程中,我们常常会使用各种各样的伪装来降低被目标网站反爬的概率,其中随机更换User-Agent就是一种手段。
在scrapy中,其实已经内置了User-Agent中间件,

class UserAgentMiddleware(object):"""This middleware allows spiders to override the user_agent"""def __init__(self, user_agent='Scrapy'):self.user_agent = user_agent@classmethoddef from_crawler(cls, crawler):o = cls(crawler.settings['USER_AGENT'])crawler.signals.connect(o.spider_opened, signal=signals.spider_opened)return odef spider_opened(self, spider):self.user_agent = getattr(spider, 'user_agent', self.user_agent)def process_request(self, request, spider):if self.user_agent:request.headers.setdefault(b'User-Agent', self.user_agent)

上图是scrapy自带的UserAgentMiddleware中间件,通过代码可以发现,如果我们没有在setting配置文件中设置headers的User-Agent,scrapy会把User-Agent设置为"Scrapy"。

原理

当我们通过 spider yield 一个 request 的时候,首先通过 spider middlewares 到达 scrapy engine,然后 engine 将 request 放到 scheduler 的队列中,通过 scheduler 调度队列中的 request ,scheduler 选中一个 request 后,将 request 通过 engine 传递给 downloader,在这之前,必然会经过 downloader middlewares,downloader 下载好之后,将 response 返回给 engine,engine 在将 response 返回给 spider,我们就可以在 spider 中调用 callback 进行解析,简单的流程大概就是这样。

那么,我们在将 request 提交给 downloader 进行下载之前,就需要将 User-Agent 进行变化,也就是每次都需要随机取一个 User-Agent 提交到 downloader 进行下载。在提交到 downloader 的时候,必然会经过 downloader middlewares,所以我们实现随机获取 User-Agent 的逻辑部分,可以在 downloader midllewares 这里实现。

第一种方法

可以把多个User-Agent作为一个配置在setting文件中

user_agent_list = ["ua1","ua2","ua3",
]

然后再编写downloader midllewares

class RandomUserAgentMiddleware(object):def __init__(self, crawler):super(RandomUserAgentMiddleware, self).__init__()self.user_agent_list = crawler.get("user_agent_list", [])@classmethoddef from_crawler(cls, crawler):return cls(crawler)def process_request(self, request, spider):#无效的方法request.headers.setdefault("User-Agent", random.choice(self.user_agent_list))#有效的方法request.headers['User-Agent'] = random.choice(self.user_agent_list)
注意:

上图代码在process_request方法中写了两种设置User-Agent的方法,其中上边那种方法经过测试是结果是无效的,所以采用下边那种方法。因为setdefault这个方法是:如果没有User-Agent 这个键才会设置User-Agent并把User-Agent的value设置为random.choice(self.user_agent_list),但其实代码运行到这里时,User-Agent 这个键是存在的,所以使用setdefault不会生效。如果这边有疑问可以评论提问我。

补充更正:

上边说的 代码在process_request方法中写了两种设置User-Agent的方法,其实都可以,之前之所以上边那行不能实现是因为我在setting中把scrapy自带的UserAgentMiddleware取消没有成功,原因是路径写错了,现给出正确配置方法:

DOWNLOADER_MIDDLEWARES = {'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None,'crawl_spider.middlewares.RandomUserAgentMiddleware': 543,
}

先把scrapy自带的UserAgentMiddleware置为None,再增加我们自己写的中间件便可,

这样做可以实现切换User-Agent的功能,但是第一需要自己维护一个大的User-Agent list在配置文件中,第二就是有局限性,毕竟维护的User-Agent不会有那么的大而全,所以这里介绍另一种方法。

第二种方法(推荐)

fake-useragent 这个库提供了我们随机选择useragent的功能。
感兴趣的同学可以深入研究下源码,源码很简单,这里只介绍怎么在scrapy中使用它。
话不多说上代码

class RandomUserAgentMiddleware(object):def __init__(self, crawler):super(RandomUserAgentMiddleware, self).__init__()self.ua = UserAgent()self.ua_type = crawler.settings.get("RANDOM_UA_TYPE", "random")@classmethoddef from_crawler(cls, crawler):return cls(crawler)def process_request(self, request, spider):def get_ua():return getattr(self.ua, self.ua_type)request.headers['User-Agent'] = get_ua()

首先我们在setting配置文件中设置一个变量RANDOM_UA_TYPE,它的功能是可以按照我们自己配置的值来选择useragent。

# 随机选择UA
RANDOM_UA_TYPE = "random"
# 只选择ie的UA
RANDOM_UA_TYPE = "ie"

当然了,最终我们还要把我们的RandomUserAgentMiddleware中间件配置到setting中:

DOWNLOADER_MIDDLEWARES = {'crawl_spider.middlewares.RandomUserAgentMiddleware': 543,
}

至此,完成了scrapy加随机User-Agent的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_723774.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JAVA系列】使用JavaScript实现网站访问次数统计代码

公众号:SAP Technical本文作者:matinal原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:【JAVA系列】使用JavaScript实现网站访问次数统计代码前言部分 大家可以关注我的公众号,公众号里的排版更好,…

夺命雷公狗—玩转SEO---33---DEDE网站安全

很多人都说dede不安全好多黑阔会黑掉她,但是说句实话,小弟10几年前就开始玩黑阔了,就连黑阔站长也是10年前就开始做了而且还是做过三个黑阔站点会员人数巅峰时期3万,同时在线超5000,时间流逝,我就不想多说以…

夺命雷公狗—玩转SEO---34---DEDE浅入百度搜索资源平台抓取和网站地图提交

百度搜索资源平台的地址是:https://ziyuan.baidu.com ,注册号会员账户后即可进入平台~~! 登录后,我们需要对网站进行验证,验证过后,我们来到抓取诊断: 抓取成功了,说明我们的网站可…

夺命雷公狗—玩转SEO---35---DEDE快排之LOGO和友情链接的玩法

LOGO是每个网站都必须要有的,所以我们需要用到一个技术,那么就是关键词与图片分离操作,从而提升排名~~! 我们首先需要做的就是找到logo 的标签,然后给 logo 的 a 标签外加上一个 div 。 原本我们的是这样的&am…

夺命雷公狗—玩转SEO---36---只需3步实现判断关键词难易度

我们在做排名的前期必须要先进行判断我们的词难度是否大~ ~! 第一我们打开百度指数 index.baidu.com: 对于一个企业站或者一个地区或者全国词来说200-300左右都是好平均的(难易度正常)200以下的偏简单的,我们的茂名旅…

夺命雷公狗—玩转SEO---37---查询网站收录且进行提升

我们经常需要查询我们的网站收录的情况,查询方法其实也很简单,通过 site: 即可进行查询,如下所示: 这些事目前已经被百度收录的情况,然后我们使用 尖叫青蛙 来进行查询,如下所示: 我们在左…

夺命雷公狗—玩转SEO---38---百度快照投诉从而更新快照

我们网页排名的是一个快照,使用我们网站上如果发生修改之后,我们需要及时通知搜索引擎爬虫过来索引新内容的快速操作~~! 正常来说蜘蛛他会在1周爬行一次,所以我们需要及时通知搜索引擎~ 操作方法其实也很简单,有两种方…

夺命雷公狗—玩转SEO---39---nofollow玩法的奥秘

nofollow其实是放在A标签里面的一个属性~~&#xff01; <a rel“nofollow”></a> nofollow 其实有一个较大的优势是在于防止权重的流失~~&#xff01; 列子&#xff1a; 比如我们自家的网站地址是www.usbdy.com &#xff0c;我们的的A标签中的地址是www.baidu.co…

夺命雷公狗—玩转SEO---40---提升网站出图率的技巧

出图&#xff0c;他分为两种&#xff0c;首页和内容页出图~~&#xff01; 首页我们最常见的就是LOGO图片了&#xff0c;我们的LOGO如果可以&#xff0c;尽量按照百度的要求上的规则来玩&#xff1a; 我们可以进入百度站长平台进行查询一下规则来玩&#xff0c;PC站点的LOGO比率…

夺命雷公狗—玩转SEO---41---H1标签的玩法

网站中除了 tiitle 标签后就到H标签了&#xff0c;这是一个比较重要的标签&#xff0c;因为蜘蛛会按照等级进行划分网站内容的重要性的&#xff0c;如先是 titile &#xff0c;然后就到H标签了。 H标签分为H1-H6&#xff0c;但是我们最多用到H3即可~~&#xff01; H标签…

夺命雷公狗—玩转SEO---42---快速交换友情链接

我们常见的交换友情链接的方式有别人网站上直接联系对方的QQ找站长1对1的进行交换&#xff0c;然后还有就是去找交换友情链接相关的QQ群&#xff0c;其实我们也可以快速通过一些平台进行换区&#xff0c;如下&#xff1a; 推荐1.链天下&#xff0c;http://www.huanlj.com&#…

夺命雷公狗—玩转SEO---43---外链提升网站权重

我们其实大家都知道外链是可以提升我们网站的权重的~~&#xff01; 而且购买一些老域名通过外链优势和域名历史快速排名上去&#xff0c;主要是外链作用太大了&#xff0c;而且还是信誉度的提升~~&#xff01; 我们发布外链是有原则的&#xff0c;如果没有优化过的网站我们都是…

夺命雷公狗—玩转SEO---44---外链群发原理

外链在优化的得分可以占到40%。&#xff08;重要&#xff09; 我们要了解我们的网站建站多长时间了&#xff0c;我们可以通过 http://www.link114.cn/whois 地址进行查询的&#xff1a; 如果我们需要查找外链其实也是好简单的&#xff1a; 我们可以通过些在线工具来进行判断…

夺命雷公狗—玩转SEO---45---浅入批量获得高频词

我们寻找高频词的时候是可以通过一些工具来为我们查询相关的高频词的&#xff0c;如下所示&#xff1a; 在这里面可以找到图谱分析&#xff1a; 然后我们将滚动条拉动到下方即可看到 查看高频词提取 &#xff0c;点击进去&#xff1a; 效果如下所示&#xff1a; 按照上图即可…

夺命雷公狗—玩转SEO---46---浅谈搜索引擎

目前我们常见的搜索引擎有&#xff1a;百度&#xff0c;谷歌&#xff0c;360&#xff0c;搜狗&#xff0c;必应等。。 他们其实也就不同公司的一款产品而已&#xff0c;如果他们想要赚钱&#xff0c;那就需要有更多的用户过来使用自家的产品。 使用的用户多了&#xff0c;就会产…

夺命雷公狗—玩转SEO---47---让页面更好的被搜索引擎发现,网站地图篇

网站地图篇&#xff0c;被动方式sitemap&#xff0c;必须做的&#xff0c;每天最少爬一次&#xff0c;慢慢等待~~&#xff01; 最好的方式&#xff0c;数据库提取&#xff0c;非软件&#xff0c;在线批量查询收录&#xff0c; http://www.link114.cn/whois 我们可以使用软件 …

夺命雷公狗—玩转SEO---48---让页面更好的被搜索引擎发现,外链篇

外链是提高收录的最好方式&#xff0c;比我们主动提交sitemap更好~~&#xff01; 前期主要是发送内容页即可&#xff0c;首页暂时可以少做点&#xff0c;因为网站首页是最容易被收录的~~&#xff01; 我们可以借助一些外链平台进行操作~~&#xff01; 这些外链都是可以通过查找…

夺命雷公狗—玩转SEO---49---让页面更好的被搜索引擎发现,主动推送篇

主动推送&#xff0c;其实主动推送可以分为两种方式&#xff0c;一中是通过软件来进行主动推送&#xff0c;还有一种是通过代码方式来进行推送~~&#xff01; 当然懂得一门编程语言说句实话&#xff0c;还是有一定的优势的~~&#xff01; 工具推送&#xff0c;其实大家可以参考…

夺命雷公狗—玩转SEO---50---让页面更好的被搜索引擎发现,自动推送篇

自动推送其实也是好简单的&#xff0c;直接登录百度站长平台&#xff1a; 然后拉动到下方点击一下自动推送&#xff0c;如下所示&#xff1a; 然后将这段代码放入我们网站的头部或者底部中去&#xff0c;因为网站打包部分头尾都是共享一个的&#xff0c;使用直接拉动去尾部即可…

夺命雷公狗—玩转SEO---51---建库,正排索引与倒排索引和浅入关键词密度

搜索引擎其实和我们书本上的目录原理是一样的&#xff0c;书本上我们是可以通过目录找到我们相应的内容&#xff0c; 比如导航站其实也就是一个索引的结构&#xff1a; 正排索引&#xff1a; 网站001 关键词A 关键词B 如此类推。。。。。。 网站002 关键词A …