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

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

详细版本见个人博客:Python fake_useragent报错解决方案


在爬虫爬取过程中,我们常常会使用各种各样的伪装来降低被目标网站反爬的概率,其中随机更换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

    @classmethod
    def from_crawler(cls, crawler):
        o = cls(crawler.settings['USER_AGENT'])
        crawler.signals.connect(o.spider_opened, signal=signals.spider_opened)
        return o

    def 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", [])

    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler)

    def process_request(self, request, spider):
        #方法1
        request.headers.setdefault("User-Agent", random.choice(self.user_agent_list))
        #方法2
        request.headers['User-Agent'] = random.choice(self.user_agent_list)

settings.py中的配置方法:

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")

    @classmethod
    def 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的需求。


详细版本见个人博客:Python fake_useragent报错解决方案

scrapy设置随机User-agentscrapy爬取大量网页、设置爬虫请求并发数       对于爬虫攻城狮而言,爬虫的最大敌人就是反爬虫。在多次请求网页时(爬取大量url时),避免被地方封锁掉,User-agent代理的随机跳变就成了反爬虫的的第一步也是必须的一步的拉。 一:设置随机User-agent(User-agent文件自行准备)     scrapy里怎么随机跳变User-agent呢?当scrapy项目创建完成,执行爬虫程序时,首先会先读取setting文件... 阅读详情

相关推荐

python爬虫】在scrapy中利用代理IP(爬取BOSS直聘网)

同学们好,我又滚回来更新了,这一次我们要爬取的目标是BOSS直聘,BOSS直聘可以说是反爬虫一个很好的例子了,主要在于如果你访问他的次数过多,他就会出现验证码,要求你通过验证才能继续看,这样还算可以,但是如果你之后还继续访问过多,那么就会出现以下画面 直接连填写验证码的机会都没有,就是不给你看,这么做可以说是很霸气了,不过对方有招,我们也是不差的,既然对方来封我们的IP了,那么我们就不用这个IP...

MLXY123的博客 8721

random_website:只是一个有趣的随机网站

该项目是通过引导的。 您将在下面找到一些有关如何执行常见任务的信息。 您可以在找到本指南的最新版本。 目录 自动格式化代码 更改页面<title> 安装依赖项 导入组件 代码分割 添加样式表 后处理CSS 添加CSS预处理器(Sass,Less等) 添加图像,字体和文件 使用public文件夹 更改HTML 在模块系统之外添加资产 何时使用public文件夹 使用全局变量 添加引导程序使用自定义主题 增加流量 添加路由器 添加自定义环境变量 在HTML中引用环境变量 在Shell中添加临时环境变量 在.env添加开发环境变量 我可以使用装饰器吗? 使用AJAX请求获取数据 与API后端集成 节点 Ruby on Rails 在开发中代理API请求 配置代理后出现“无效的主机头”错误 手动配置代理 配置WebSocket代理 在开发中使用HTTPS 在服务器上生成动态<met

爬虫Scrapy框架学习(四)-中国保险监督委员会爬取案例

本案例使用的框架为CrawlSpider框架,与传统Spider框架相比能够快速的实现页面跳转的功能,且本案例描述了随机替换User-Agent的“反反”爬虫思想,值得读者细心研究。 使用scrapy genspider –t crawl cf “circ.gov.cn”创建爬虫 1.项目框架展示 2.项目爬取网页展示 3.cf.py文件 # -*- coding: utf-8 -*- i...

宋建国的博客 1674

在网页上随机产生超链接地址 2021-11-15

本文实例讲述了JS实现网页上随机产生超链接地址的方法。分享给大家供大家参考,具体如下: 这是一个JavaScript的应用,每刷新一次页面,会自动更换一次链接,虽然不常用,不过对Javascript随机函数Math.random() 的使用将直到引导作用。 <html> <head> <title>在网页上随机产生超链接地址</title> <script language="javascript"> url = new Array.

3110

html自动随机跳转网址,网页随机跳转代码

网页随机跳转代码zkx•2021 年 05 月 31 日Loading...```shell网页随机跳转var theAds = new Array("http://a.com","http://a.com","http://a.com","http://a.com","http://a.com");shu = theAds.length ;sx = parseInt(Math.random(...

weixin_29577845的博客 7599

Hong Kong:Domestic clothing exports decline sharply by 43.1% at $2.6bn in June

In June, 2005, the values of Hong Kongs total exports and imports of goods both showed distinct year-on-year increases. The Census and Statistics Department (C&SD) released today (July 26) the exter

chinatextile的专栏 3194

scrapy简单使用代理池和随机User-Agent

scrapy下载中间键middlewares.py中,写下如下代码,然后在设置文件settings.py设置DOWNLOADER_MIDDLEWARES = { # 'testip.middlewares.TestipDownloaderMiddleware': 543, 'testip.middlewares.RandomUserAgent': 10, 'testip.m...

半吊子python全栈 7万+

PythonScrapy爬虫实战--绕过网站的反爬

设置随机UA 修改middlewares.py from fake_useragent import UserAgent class RandomUserAgentMiddleware(object): def process_request(self, request, spider): ua = UserAgent() request.heade...

高级CtrlCV工程师 2200

爬虫学习:使用scrapy爬取猫眼电影

操作步骤 1.生成项目(在cmd或shell窗口运行以下3列代码) scrapy startproject movieinfo cd movieinfo scrapy genspider maoyanm 生成文件结构如下: 2.相关文件内容编辑 maoyanm.py # -*- coding: utf-8 -*- import scrapy from ...

weixin_30847865的博客 736

scrapy爬取网页时使用随机user-agent方法

转载 默认情况下scrapy采集时只能使用一种user-agent,这样容易被网站屏蔽,下面的代码可以从预先定义的user-agent的列表中随机选择一个来采集不同的页面 在settings.py中添加以下代码DOWNLOADER_MIDDLEWARES = { 'scrapy.contrib.downloadermiddleware.useragent.UserAgentMid

sakila的专栏 8434

Scrapy实战篇(二)之爬取链家网成交房源数据(下)

在上一小节中,我们已经提取到了房源的具体信息,这一节中,我们主要是对提取到的数据进行后续的处理,以及进行相关的设置。 数据处理 我们这里以把数据存储到mongo数据库为例。编写pipelines.py文件 import pymongo class MongoPipeline(object): collection = 'lianjia_house' #数据...

daxun0631的博客 219

怎么用Scrapy爬取网站图片?

使用Scrapy爬取网站图片并下载(使用XPATH路径来获取图片链接)。 对爬取成功的图片连接入库。

cnfengzheng的博客 1262

scrapy框架中间件配置代理

scrapy框架中间件配置代理import random#代理池PROXY_http = [ '106.240.254.138:80', '211.24.102.168:80',]PROXY_https =[ '218.57.146.212:8888', '139.217.24.50:3128',]class XiaohuaproDownloaderMiddleware(o...

weixin_30621919的博客 649

Scrapy爬虫:抓取大量斗图网站最新表情图片

一:目标 第一次使用Scrapy框架遇到很多坑,坚持去搜索,修改代码就可以解决问题。这次爬取的是一个斗图网站的最新表情图片www.doutula.com/photo/list,练习使用Scrapy框架并且使用随机user agent防止被ban,斗图表情包每日更新,一共可以抓取5万张左右的表情到硬盘中。为了节省时间我就抓取了1万多张。 二:Scrapy简介 ...

diaozhu1028的博客 368

Python】 知乎网全站用户爬虫 scrapy

全站爬虫有时候做起来其实比较容易,因为规则相对容易建立起来,只需要做好反爬就可以了,今天咱们爬取知乎。继续使用scrapy当然对于这个小需求来说,使用scrapy确实用了牛刀,不过毕竟这个系列到这个阶段需要不断使用scrapy进行过度,so,我写了一会就写完了。 你第一步找一个爬取种子,算作爬虫入口 https://www.zhihu.com/people/zhang-jia-wei/follow...

Python追梦 375

scrapy使用fake-useragent库设置user-agent

安装fake-useragent库(useragent的库) pip install fake-useragent 在middlewares.py文件中导入fake-useragent库 from fake_useragent import UserAgent 在middlewares.py文件中编写一个middleware中间件, from fake_useragent import UserAgent from scrapy.downloadermiddlewares.userage

水月灯花的博客 1814

Scrapy(4)spider 帮助你寻找最美小姐姐

我们都知道我们平常想下载一些漂亮的图片来装饰自己的桌面,可是找到了都是需要收费的网站,真的很恼火,所以今天小编,可能要带大家实现这么一个工具,可以用来爬取某个网站的好看的图片兴不兴奋啊,...

人生代码 ---- 公众号 620
上一篇: Python如何爬取不确定页数的网页
下一篇: Windows几个隐私设置
dta0502
博客等级 码龄11年 210粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值