本文转载自以下网站: Scrapy 中设置随机 User-Agent 的方法汇总 https://www.makcyun.top/web_scraping_withpython14.html

一行代码搞定 Scrapy 中的随机 UA 设置。

摘要:爬虫过程中的反爬措施非常重要,其中设置随机 User-Agent 是一项重要的反爬措施,Scrapy 中设置随机 UA 的方式有很多种,有的复杂有的简单,本文就对这些方法进行汇总,提供一种只需要一行代码的设置方式。

最近使用 Scrapy 爬一个网站,遇到了网站反爬的情况,于是开始搜索一些反爬措施,了解到设置随机 UA 来伪装请求头是一种常用的方式,这能够做到一定程度上避免网站直接识别出你是一个爬虫从而封掉你。设置随机 UA 的方法有挺多种,有的需要好多行代码,有的却只需要一行代码就搞定了,接下来就来介绍下。

▌常规设置 UA

首先,说一下常规情况不使用 Scrapy 时的用法,比较方便的方法是利用 fake_useragent包,这个包内置大量的 UA 可以随机替换,这比自己去搜集罗列要方便很多,下面来看一下如何操作。

首先,安装好fake_useragent包,一行代码搞定:

pip install fake-useragent

然后,就可以测试了:

from fake_useragent import UserAgent
ua = UserAgent()
for i in range(10):
print(ua.random)

这里,使用了 ua.random 方法,可以随机生成各种浏览器的 UA,见下图:

如果只想要某一个浏览器的,比如 Chrome ,那可以改成 ua.chrome,再次生成随机 UA 查看一下:

以上就是常规设置随机 UA 的一种方法,非常方便。

下面,我们来介绍在 Scrapy 中设置随机 UA 的几种方法。

先新建一个 Project,命名为 wanojia,测试的网站选择为:http://httpbin.org/get

首先,我们来看一下,如果不添加 UA 会得到什么结果,可以看到显示了scrapy,这样就暴露了我们的爬虫,很容易被封。

下面,我们添加上 UA 。

▌直接设置 UA

第一种方法是和上面程序一样,直接在主程序中设置 UA,然后运行程序,通过下面这句命令可以输出该网站的 UA,见上图箭头处所示,每次请求都会随机生成 UA,这种方法比较简单,但是每个 requests 下的请求都需要设置,不是很方便,既然使用了 Scrapy,它提供了专门设置 UA 的地方,所以接下来我们看一下如何单独设置 UA。

response.request.headers['User-Agent']

▌手动添加 UA

第二种方法,是在 settings.py 文件中手动添加一些 UA,然后通过 random.choise 方法随机调用,即可生成 UA,这种方便比较麻烦的就是需要自己去找 UA,而且增加了代码行数量。

▌middlewares.py 中设置 UA

第三种方法,是使用 fake-useragent 包,在 middlewares.py 中间件中改写 process_request() 方法,添加以下几行代码即可。

from fake_useragent import UserAgent
class RandomUserAgent(object):
def process_request(self, request, spider):
ua = UserAgent()
request.headers['User-Agent'] = ua.random

然后,我们回到 settings.py 文件中调用自定义的 UserAgent,注意这里要先关闭默认的 UA 设置方法才行。

DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
'wandoujia.middlewares.RandomUserAgent': 543,
}

可以看到,我们成功得到了随机 UA。

▌一行代码设置 UA

可以看到,上面几种方法其实都不太方便,代码量也比较多,有没有更简单的设置方法呢?

有的,只需要一行代码就搞定,利用一款名为 scrapy-fake-useragent 的包。

先贴一下该包的官方网址:https://pypi.org/project/scrapy-fake-useragent/,使用方法非常简单,安装好然后使用就行了。

执行下面的命令进行安装,然后在 settings.py 中启用随机 UA 设置命令就可以了,非常简单省事。

pip install scrapy-fake-useragent
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, # 关闭默认方法
'scrapy_fake_useragent.middleware.RandomUserAgentMiddleware': 400, # 开启
}

我们输出一下 UA 和网页 Response,可以看到成功输出了结果。

以上就是 Scrapy 中设置随机 UA 的几种方法,推荐最后一种方法,即安装 scrapy-fake-useragent 库,然后在 settings 中添加下面这一行代码即可:

'scrapy_fake_useragent.middleware.RandomUserAgentMiddleware': 400,

另外,反爬措施除了设置随机 UA 以外,还有一种非常重要的措施是设置随机 IP,我们后续再进行介绍。

设置随机 User-Agent的更多相关文章

  1. Scrapy学习篇(十一)之设置随机User-Agent

    大多数情况下,网站都会根据我们的请求头信息来区分你是不是一个爬虫程序,如果一旦识别出这是一个爬虫程序,很容易就会拒绝我们的请求,因此我们需要给我们的爬虫手动添加请求头信息,来模拟浏览器的行为,但是当我 ...

  2. [改善Java代码]不要随便设置随机种子

    建议30: 不要随便设置随机种子 随机数在太多的地方使用了,比如加密.混淆数据等,我们使用随机数是期望获得一个唯一的.不可仿造的数字,以避免产生相同的业务数据造成混乱.在Java项目中通常是通过Mat ...

  3. Scrapy学习篇(十二)之设置随机IP代理(IPProxy)

    当我们需要大量的爬取网站信息时,除了切换User-Agent之外,另外一个重要的方式就是设置IP代理,以防止我们的爬虫被拒绝,下面我们就来演示scrapy如何设置随机IPProxy. 设置随机IPPr ...

  4. Python中random模块在主函数中设置随机种子是否对于调用的函数中的随机值产生影响?

    一个问题,加入我有一个工程文件,在main函数里面调用random模块,设置随机种子,主函数中的随机种子的设置是否会影响主函数所调用的函数中的随机值? 实际上这个问题非常重要,比如你在跑网络的时候,初 ...

  5. Scrapy 设置随机 User-Agent

    方式一:在每个 Spider中设置(针对单个Spider) class TencentSpider(scrapy.Spider): name = 'tencent' allowed_domains = ...

  6. 如何使用JMeter来实现更大批量的并发的解决方案(即如何设置controller和Agent)

    http://www.testwo.com/blog/6373 近期在用JMeter进行负载测试的 时候,发现使用单台机器模拟测试超过比如500个进程的并发就有些力不从心或者说不能如实的反应实际情况, ...

  7. php设置随机ip访问

    当我们请求一个站点的时候,http报文头会携带一些ip信息,我们通过伪造这些信息,就可以形成不同ip访问请求的效果. header的头部CLIENT-IP和X-FORWARDED-FOR我们都设置为想 ...

  8. JAVA基础之设置随机成语验证码

    package com.oracle; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import ja ...

  9. 设置随机启动--《用delphi开发共享软件》-15.1任务管理器

    在设置窗体中 chkAutoStart: TCheckBox; 在设置窗体中 chkAutoStart: TCheckBox; procedure TFrmSetup.FormCreate(Sende ...

随机推荐

  1. input子系统驱动学习之中的一个

        刚開始学习linux这门课就被分配编写一个设备的input子系统驱动.这对我的确有点困难.只是实际的操作中发现困难远比我想象的要大的多.本以为依照老师课上的步骤就行非常快的完毕这项任务.后来发 ...

  2. 从头认识Spring-2.7 自己主动检測Bean(1)-@Component @Repository @Service @Controller

    这一章节我们来讨论一下自己主动检測Bean. 1.domain 厨师类: package com.raylee.my_new_spring.my_new_spring.ch02.topic_1_19; ...

  3. HDU1573 X问题【一元线性同余方程组】

    题目链接: http://acm.hdu.edu.cn/showproblem.php? pid=1573 题目大意: 求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X ...

  4. 一个伟大的发现,装X一下。笔记本win7系统64位机器执行unity 时,屏幕模糊解决的方法

    笔者笔记本win7系统64位机器执行unity 时.往往切换时unity界面屏幕模糊,后来发现此时须要下载DirectXRuntimes201006x64,安装就可以.

  5. 您必须先调用“WebSecurity.InitializeDatabaseConnection”方法。。。

    有如下代码: [Authorize] public ActionResult Index() { ViewBag.ShowList = ShowList.GetShowList(WebSecurity ...

  6. Codeforces--629A--Far Relative’s Birthday Cake(暴力模拟)

    Far Relative's Birthday Cake Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d &a ...

  7. 认证与授权协议对比:OAuth2、OpenID、SMAL

    认证授权是目前大多数系统都必须要实现都功能,认证就是验证用户都身份,授权就是验证身份后对受限资源的访问控制.最开始是单个平台要做,后来在互联网时代到来,一个账户可登陆多个平台,然后是各种开放平台账户共 ...

  8. 洛谷 P3112 后卫马克 —— 状压DP

    题目:https://www.luogu.org/problemnew/show/P3112 状压DP...转移不错. 代码如下: #include<iostream> #include& ...

  9. Java常用类及反射,类加载

    1.系统相关类 Java提供了System类和Runtime类来与程序运行的平台进行交互 A.System类代表当前Java程序的运行平台 a. System类是一个final类,该类的所有属性和方法 ...

  10. 初识Java,Java语言概述

    Java语言是SUN(斯坦福大学网络公司)公司1995年推出的一门高级编程语言,由此James Gosling被公认为Java语言之父.Java语言起初运用在小型的家用电子产品上,后来随着互联网的发展 ...