Python爬虫:关于scrapy模块的请求头

简介: Python爬虫:关于scrapy模块的请求头

内容简介

使用scrapy写爬虫的时候,会莫名其妙的被目标网站拒绝,很大部分是浏览器请求头的原因。

现在一起来看看scrapy的请求头,并探究设置方式


工具准备

开发环境python2.7 + scrapy 1.1.2

测试请求头网站:https://httpbin.org/get?show_env=1

json在线解析:https://www.json.cn/

浏览器请求头大全: http://www.useragentstring.com/

默认请求头

命令行执行,新建爬虫


scrapy startproject myspider
cd myspider
scrapy genspider scrapy_spider httpbin.org

我们通过对 https://httpbin.org/get?show_env=1 的请求,查看本次请求的浏览器信息,可以打开看一看是否是自己的浏览器信息


改写生成的scrapy_spider.py文件


import scrapy
class ScrapySpider(scrapy.Spider):
    name = "scrapy_spider"
    allowed_domains = ["httpbin.org"]
    start_urls = (
        # 请求的链接
        "https://httpbin.org/get?show_env=1",
    )
    def parse(self, response):
        # 打印出相应结果 
        print response.text
if __name__ == '__main__':
    from scrapy import cmdline
    cmdline.execute("scrapy crawl scrapy_spider".split())

如果是你正好使用mac本,正好使用pycharm可以按快捷键启动爬虫

shift + control + r

当然,如果是windows那就右键启动吧


将返回的文本复制到 https://www.json.cn/ 格式化成便于查看的json格式,下面操作亦然,不再赘述。


{
    "args":{
        "show_env":"1"
    },
    "headers":{
        "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
        "Accept-Encoding":"gzip,deflate",
        "Accept-Language":"en",
        "Connect-Time":"1",
        "Connection":"close",
        "Host":"httpbin.org",
        "Total-Route-Time":"0",
        "User-Agent":"Scrapy/1.1.2 (+http://scrapy.org)",
        "Via":"1.1 vegur",
        "X-Forwarded-For":"39.155.188.22",
        "X-Forwarded-Port":"443",
        "X-Forwarded-Proto":"https",
        "X-Request-Id":"9dcf91a6-0bed-4d9e-b2bd-b7c88b832d81",
        "X-Request-Start":"1529654403617"
    },
    "origin":"39.155.188.22",
    "url":"https://httpbin.org/get?show_env=1"
}

看到了吧,默认的请求头是


"User-Agent":"Scrapy/1.1.2 (+http://scrapy.org)"

修改请求头

既然这样的话,那我们修改下请求头,达到伪造的效果

打开下面的链接,选一个自己喜欢的请求头

http://www.useragentstring.com/pages/useragentstring.php?name=Chrome

这里使用chrome浏览器请求头


方式一:全局设置

此方式设置后,覆盖掉scrapy默认的请求头,全局生效,即所有爬虫都可以享受

settings.py文件中找到如下代码


# Crawl responsibly by identifying yourself (and your website) on the user-agent
# USER_AGENT = 'myspider (+http://www.yourdomain.com)'

解除注释,修改为自己的请求头


# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"

运行爬虫,验证效果


"User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",

方式二:爬虫设置

此方式设置后,单个爬虫生效,此爬虫的所有连接都享受


class ScrapySpider(scrapy.Spider):
    name = "scrapy_spider"
    allowed_domains = ["httpbin.org"]
    # 新添加的代码
    custom_settings = {
        "USER_AGENT": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",
    }
    # -----------
    start_urls = (
        "https://httpbin.org/get?show_env=1",
    )

再次访问,发现我们的请求头已经成功更换


"User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",

方式三:链接设置

此方法对单个链接生效, 只是此次请求的这个链接享受

在Request方法中设置headers参数


import scrapy
# 请求头
USER_AGENT = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"
class ScrapySpider(scrapy.Spider):
    name = "scrapy_spider"
    allowed_domains = ["httpbin.org"]
    start_urls = (
        "https://httpbin.org/get?show_env=1",
    )
    # 新加的代码
    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url, headers={"User-Agent": USER_AGENT})
    # ------------
    def parse(self, response):
        print response.text

测试效果


"User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",

方法四:中间件设置

此方法可以从整个项目中去修改请求头的设置规则,变化多端,不同的写法,可以配置出不同的设置方式,下面是一个比较简单的示例


我们参考scrapy默认处理请求头的中间件


from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware

编写中间件


# middlewares.py
class RandomUserAgentMiddleware(object):
    def process_request(self, request, spider):
        request.headers['User-Agent']= ""  # 绝对设置,其他设置都不生效

我们可以从下面找到默认设置


from scrapy.settings import default_settings

找到项目中对请求头起作用的中间件


'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': 400,

在settings.py 或者custom_settings替换原有的中间件


"

DOWNLOADER_MIDDLEWARES": {
        'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware':None,
        "myspider.middlewares.RandomUserAgentMiddleware": 400,
    }

这样可以从全局,或者局部替换掉请求头规则


作用优先级

如果作如下设置


# settings.py
USER_AGENT = "settings"
# scrapy_spider.py
custom_settings = {
        "USER_AGENT": "custom_settings",
    }
headers={"User-Agent": "header"}

运行效果为:


"User-Agent":"header"

注释掉headers


 
         

注释掉custom_settings


 
         

注释掉settings


"User-Agent":"Scrapy/1.1.2 (+http://scrapy.org)"

可见优先级为:

headers > custom_settings > settings.py > Scrapy默认


注意

注意User-Agent参数的写法


headers={"User-Agent": USER_AGENT})

如果写错了,很可能发生奇怪的事情


headers={"User_Agent": USER_AGENT}

请求头中多了Scrapy…


"User-Agent":"Scrapy/1.1.2 (+http://scrapy.org),Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",

其实,很好区分:

User-Agent: 浏览器请求头参数,html代码中经常用-

USER_AGENT: python变量


建议:

每次写浏览器参数,如果怕写错就打开自己的浏览器,随便测试一个页面,从里边复制


总结

image.png

表格从上至下,优先级逐渐增加,中间件除外,一般掌握三种方式就够用了:


settings.py

custom_settings

headers

作为从入门到实战的我,踩过不少坑,此文做了简单的总结,也分享了几个比较实用的网站。希望此文的分享能给大家提供一个少走弯路的捷径,那么此文的价值也就体现了。

相关文章
|
2月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
313 7
|
2月前
|
监控 安全 程序员
Python日志模块配置:从print到logging的优雅升级指南
从 `print` 到 `logging` 是 Python 开发的必经之路。`print` 调试简单却难维护,日志混乱、无法分级、缺乏上下文;而 `logging` 支持级别控制、多输出、结构化记录,助力项目可维护性升级。本文详解痛点、优势、迁移方案与最佳实践,助你构建专业日志系统,让程序“有记忆”。
234 0
|
2月前
|
JSON 算法 API
Python中的json模块:从基础到进阶的实用指南
本文深入解析Python内置json模块的使用,涵盖序列化与反序列化核心函数、参数配置、中文处理、自定义对象转换及异常处理,并介绍性能优化与第三方库扩展,助你高效实现JSON数据交互。(238字)
364 4
|
2月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
268 0
|
2月前
|
XML JSON 数据处理
超越JSON:Python结构化数据处理模块全解析
本文深入解析Python中12个核心数据处理模块,涵盖csv、pandas、pickle、shelve、struct、configparser、xml、numpy、array、sqlite3和msgpack,覆盖表格处理、序列化、配置管理、科学计算等六大场景,结合真实案例与决策树,助你高效应对各类数据挑战。(238字)
182 0
|
3月前
|
安全 大数据 程序员
Python operator模块的methodcaller:一行代码搞定对象方法调用的黑科技
`operator.methodcaller`是Python中处理对象方法调用的高效工具,替代冗长Lambda,提升代码可读性与性能。适用于数据过滤、排序、转换等场景,支持参数传递与链式调用,是函数式编程的隐藏利器。
123 4
|
9月前
|
数据采集 存储 数据可视化
分布式爬虫框架Scrapy-Redis实战指南
本文介绍如何使用Scrapy-Redis构建分布式爬虫系统,采集携程平台上热门城市的酒店价格与评价信息。通过代理IP、Cookie和User-Agent设置规避反爬策略,实现高效数据抓取。结合价格动态趋势分析,助力酒店业优化市场策略、提升服务质量。技术架构涵盖Scrapy-Redis核心调度、代理中间件及数据解析存储,提供完整的技术路线图与代码示例。
893 0
分布式爬虫框架Scrapy-Redis实战指南
|
8月前
|
数据采集 测试技术 C++
无headers爬虫 vs 带headers爬虫:Python性能对比
无headers爬虫 vs 带headers爬虫:Python性能对比
|
8月前
|
数据采集 前端开发 JavaScript
Scrapy结合Selenium实现搜索点击爬虫的最佳实践
Scrapy结合Selenium实现搜索点击爬虫的最佳实践
|
3月前
|
存储 数据库 开发者
Python SQLite模块:轻量级数据库的实战指南
本文深入讲解Python内置sqlite3模块的实战应用,涵盖数据库连接、CRUD操作、事务管理、性能优化及高级特性,结合完整案例,助你快速掌握SQLite在小型项目中的高效使用,是Python开发者必备的轻量级数据库指南。
287 0

推荐镜像

更多