首页 > 其他分享 >scrapy 响应文本乱码(不支持Brotli解压)

scrapy 响应文本乱码(不支持Brotli解压)

时间:2024-01-31 11:14:35浏览次数:17  
标签:body encoding zlib Brotli 乱码 scrapy br

一.介绍

  在scrapy中,默认不支持Brotli解压,当发现响应乱码时,如何分析确定是由Brotli压缩引起的呢?

    1)是看请求头是否有'Accept-Encoding': "gzip, deflate, br" 中的br,如果去掉br 再请求网页,如果响应不成功,则表示服务端只支持br压缩格式,如果成功则看是否乱码。

    2)  添加中间件调试查看,使用的是哪种压缩格式,关键代码如下

    custom_settings = {
        'DOWNLOADER_MIDDLEWARES':{
            #加上中间件,主要用于查看是什么类型的压缩
            'realtime_python_crawler.middlewares_custom.myCompression_dm.myHtmlCompression':500
            }
     }

    在创建一个myCompression_dm.py文件,在return时打入断点调试进去

from scrapy.downloadermiddlewares.httpcompression import HttpCompressionMiddleware    

class myHtmlCompression(HttpCompressionMiddleware):

    def process_response(self, request, response, spider):
       return super().process_response(request, response, spider)

    HttpCompressionMiddleware中间件中源码中解缩代码如下: 

    def _decode(self, body, encoding):
        if encoding == b"gzip" or encoding == b"x-gzip":
            body = gunzip(body)

        if encoding == b"deflate":
            try:
                body = zlib.decompress(body)
            except zlib.error:
                # ugly hack to work with raw deflate content that may
                # be sent by microsoft servers. For more information, see:
                # http://carsten.codimi.de/gzip.yaws/
                # http://www.port80software.com/200ok/archive/2005/10/31/868.aspx
                # http://www.gzip.org/zlib/zlib_faq.html#faq38
                body = zlib.decompress(body, -15)
        if encoding == b"br" and b"br" in ACCEPTED_ENCODINGS:
            body = brotli.decompress(body)
        if encoding == b"zstd" and b"zstd" in ACCEPTED_ENCODINGS:
            # Using its streaming API since its simple API could handle only cases
            # where there is content size data embedded in the frame
            reader = zstandard.ZstdDecompressor().stream_reader(io.BytesIO(body))
            body = reader.read()
        return body

  解决方法,如果确定是br压缩格式引起的,就安装pip install Brotli, 这样响应就不会乱码

    

标签:body,encoding,zlib,Brotli,乱码,scrapy,br
From: https://www.cnblogs.com/MrHSR/p/17998785

相关文章

  • windows上使用python2.7获取svn info,中文路径乱码问题
    #-*-coding:utf-8-*-from__future__importunicode_literalsimportsubprocessimportcmdimportosos.environ['LANG']='en_US.UTF-8'classSVNCommand(cmd.Cmd):defdo_svninfo(self,folder_path):#构建svninfo命令......
  • git客户端中文乱码,解决方案
    git命令如下所示: 解决方案gitconfigcore.quotepathfalse 解决后: 参考:修复gitdiff正文中文乱码-简书(jianshu.com)git中文名转义带来的麻烦;git配置之core.quotepath;git中文乱码-yaowenxu-博客园(cnblogs.com)......
  • requests响应文本乱码解决办法
    1.请求百度首页,响应文本页面标题乱码乱码原因:requests获取响应文本之前,会有一个解码的过程,解码就有编码格式,编码格式在响应头content-type里获取,未获取到或者未获取成功,会随便使用默认的编码格式,可能会造成乱码2.查看原本的编码格式图片上运行结果显示原本的编码格式未获取......
  • GET&POST请求和响应的中文乱码解决方案
    Serlvet程序的请求和响应乱码问题get请求与post请求数据乱码publicclassRequestAPIServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{//获取请求......
  • pytest运行结果乱码处理
    pytest终端打印结果,中文乱码,解决方式:(我个人觉得第一种方式好)第一种方式:在pytest.ini文件中添加一行代码:disable_test_id_escaping_and_forfeit_all_rights_to_community_support=True第二种方式,conftest.py中添加钩子函数pytest_collection_modifyitemsdefpytest_collecti......
  • Scrapy爬虫框架
    网络爬虫框架:ScrapyScrapy是一个非常优秀的爬虫框架,通过Scrapy框架,可以非常轻松的实现强大的爬虫系统。一、Scrapy简介Scrapy主要包括如下6个部分:ScrapyEngine:用来处理整个系统的数据流,触发各种事件。Scheduler:从URL队列中取出一个URL。Downloader:从internet上下载web资源......
  • Visual Studio + QT环境 界面中文乱码问题及解决
    情况:  头文件开头加入预编译语句#pragmaexecution_character_set("utf-8") 效果:  参考:VS2019+qt解决中文乱码问题  ......
  • 【Python】解压压缩包(处理中文乱码问题)
    支持中文编码fromzipfileimportZipFiledefsupport_gbk(zip_file):name_to_info=zip_file.NameToInfo#copymapfirstforname,infoinname_to_info.copy().items():real_name=name.encode('cp437').decode('gbk')......
  • 读取Execl数据到Datatable或DataSet时 日期单元格出现乱码的解决方案
    Execl某单元格数据为2012-1-10读取到DataTable变为40918不是正确的2012-1-10其实excel在转换格式的时候就自动把日期变成数字了,那这个数字是怎么来的呢?如果你把日期改成1900年1月1日,那么你可以看到他的转换结果是1,以此类推,39902是哪一天就明白了吧解决方法一://strValu......
  • 从python 单机版爬虫 scrapy 到 分布式scrapy-redis 爬虫用最简单的步骤创建实例
    scrapy是很强大的模块化爬虫框架,具有很高的灵活性,使用频率很高,使用该框架能大大提高开发效率,scrapy-redis是在scrapy框架开发了组件,替换队列部分,实现多台服务器并行运行爬虫,提高爬取速度。下面是用最简单的例子从建立普通scrapy爬虫,然后数据保存mysql,最后简单替换几行就能使用s......