原文地址https://www.cnblogs.com/zhaof/p/7345856.html

总架构理解Middleware

通过scrapy官网最新的架构图来理解:

这个图较之前的图顺序更加清晰,从图中我们可以看出,在spiders和ENGINE提及ENGINE和DOWNLOADER之间都可以设置中间件,两者是双向的,并且是可以设置多层.

关于Downloader Middleware我在http://www.cnblogs.com/zhaof/p/7198407.html   这篇博客中已经写了详细的使用介绍。

如何实现随机更换User-Agent

这里要做的是通过自己在Downlaoder Middleware中定义一个类来实现随机更换User-Agent,但是我们需要知道的是scrapy其实本身提供了一个user-agent这个我们在源码中可以看到如下图:

from scrapy import signals
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的user_agent=‘Scrapy’,并且这里在这个类里有一个类方法from_crawler会从settings里获取USER_AGENT这个配置,如果settings配置文件中没有配置,则会采用默认的Scrapy,process_request方法会在请求头中设置User-Agent.

关于随机切换User-Agent的库

github地址为:https://github.com/hellysmile/fake-useragent
安装:pip install fake-useragent

基本的使用例子:

from fake_useragent import UserAgentua = UserAgent()print(ua.ie)
print(ua.chrome)
print(ua.Firefox)
print(ua.random)
print(ua.random)
print(ua.random)

这里可以获取我们想要的常用的User-Agent,并且这里提供了一个random方法可以直接随机获取,上述代码的结果为:

关于配置和代码

这里我找了一个之前写好的爬虫,然后实现随机更换User-Agent,在settings配置文件如下:

DOWNLOADER_MIDDLEWARES = {'jobboleSpider.middlewares.RandomUserAgentMiddleware': 543,'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
}RANDOM_UA_TYPE= 'random'

这里我们要将系统的UserAgent中间件设置为None,这样就不会启用,否则默认系统的这个中间会被启用
定义RANDOM_UA_TYPE这个是设置一个默认的值,如果这里不设置我们会在代码中进行设置,在middleares.py中添加如下代码:

class RandomUserAgentMiddleware(object):'''随机更换User-Agent'''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.setdefault('User-Agent',get_ua())

上述代码的一个简单分析描述:
1. 通过crawler.settings.get来获取配置文件中的配置,如果没有配置则默认是random,如果配置了ie或者chrome等就会获取到相应的配置
2. 在process_request方法中我们嵌套了一个get_ua方法,get_ua其实就是为了执行ua.ua_type,但是这里无法使用self.ua.self.us_type,所以利用了getattr方法来直接获取,最后通过request.heasers.setdefault来设置User-Agent

通过上面的配置我们就实现了每次请求随机更换User-Agent

转载于:https://www.cnblogs.com/111testing/p/10325440.html

Python爬虫从入门到放弃(二十三)之 Scrapy的中间件Downloader Middleware实现User-Agent随机切换...相关推荐

  1. Python爬虫从入门到放弃(十三)之 Scrapy框架的命令行详解

    这篇文章主要是对的scrapy命令行使用的一个介绍 创建爬虫项目 scrapy startproject 项目名 例子如下: localhost:spider zhaofan$ scrapy star ...

  2. Python爬虫新手入门教学(二十):爬取A站m3u8视频格式视频

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 前文内容 Python爬虫新手入门教学(一):爬取豆瓣电影排行信息 Python爬虫新手入门 ...

  3. Python爬虫新手入门教学(二):爬取小说

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 https://space. ...

  4. Python爬虫从入门到放弃(十二)之 Scrapy框架的架构和原理

    原文地址https://www.cnblogs.com/zhaof/p/7173397.html 这一篇文章主要是为了对scrapy框架的工作流程以及各个组件功能的介绍 Scrapy目前已经可以很好的 ...

  5. python爬虫从入门到放弃,含案例分析,超详细讲解(一)

    Python爬虫 1.认识爬虫 1.1.概述 网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者) 按照一定规律,自动地抓取万维网信息的程序或者脚本. 1.2.应用场景 ...

  6. python爬虫从入门到放弃(一)初识爬虫

    在家里呆了几个月,重新拾起python爬虫,想着搞点东西(爱情电影)看看,发现爬虫真的是好开心. 网络爬虫是什么呢? 网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者) ...

  7. Python爬虫从入门到放弃(十一)之 Scrapy框架整体的一个了解

    这里是通过爬取伯乐在线的全部文章为例子,让自己先对scrapy进行一个整理的理解 该例子中的详细代码会放到我的github地址:https://github.com/pythonsite/spider ...

  8. python爬虫原理-python爬虫从入门到放弃(二)之爬虫的原理

    在上文中我们说了:爬虫就是请求网站并提取数据的自动化程序.其中请求,提取,自动化是爬虫的关键!下面我们分析爬虫的基本流程 爬虫的基本流程 发起请求 通过HTTP库向目标站点发起请求,也就是发送一个Re ...

  9. python爬虫从入门到放弃(二)之爬虫的原理

    在上文中我们说了:爬虫就是请求网站并提取数据的自动化程序.其中请求,提取,自动化是爬虫的关键!下面我们分析爬虫的基本流程 爬虫的基本流程 发起请求 通过HTTP库向目标站点发起请求,也就是发送一个Re ...

  10. Python爬虫从入门到放弃(二十)之 Scrapy分布式原理

    原文地址https://www.cnblogs.com/zhaof/p/7306374.html 关于Scrapy工作流程回顾 Scrapy单机架构 上图的架构其实就是一种单机架构,只在本机维护一个爬 ...

最新文章

  1. scheduled 一秒钟执行一次_spring boot的Scheduled帮你实现定时任务,spring boot实践(11)...
  2. CVPR 2021 | 视觉目标检测大模型GAIA:面向行业的视觉物体检测一站式解决方案
  3. (笔记) (ARM) QQ2440 开发板改为 GT2440 (Linux) (开发板)
  4. DMN 1.1 XML:使用Drools 7.0从建模到自动化
  5. Linux定期执行xshell脚本(入门)
  6. 使用HttpUnit进行集成测试
  7. break和continue的区别和执行过程
  8. [leetcode] 11.盛最多水的容器
  9. CAS 服务端的搭建
  10. 【C补充】指向指针或函数的指针
  11. win10相机打不开,显示错误代码0xA00F4246(0x800706D9)
  12. uni-app开始时间结束时间(结束时间大于开始时间)picker编写
  13. 融云「音视频架构实践」技术专场【内含完整PPT】
  14. win10打开计算机加载很慢,解析为何win10系统中我的电脑打开速度很慢
  15. 卡内基梅隆大学计算机硕士专业,2020年卡内基梅隆大学专业设置
  16. soho新工作 新娘秘書
  17. PS 之AD命令之Get-ADuser!
  18. 网络工程师笔记——安全攻击类型
  19. 【无标题】积跬步,以致千里;积小流,以成江海。
  20. mac OS 命令行升级软件系统的命令

热门文章

  1. Cocos2d-xV3.17.2 win32平台模板源码详注
  2. GitLab+Nornor3.0.0完成CI/CD流水线配置(更新版)
  3. MPLS virtual private network PE-CE之间的路由协议(静态、RIP、IS-IS)
  4. OSPFv3中LSA详解(四)——Link LSA详解
  5. VMware Workstation 15 解锁Mac OS安装
  6. springboot 项目 测试环境在独立的tomcat部署
  7. 走进JavaWeb技术世界4:Servlet 工作原理详解
  8. 《Effective C#》读书笔记——条目23:理解接口方法和虚方法的区别使用C#表达设计...
  9. 成都市交委与摩拜科技联手 助推智慧城市建设
  10. 2016年大数据Spark“蘑菇云”行动之spark streaming消费flume采集的kafka数据Directf方式...