scrapy豆瓣登录响应结果乱码问题

在使用scrapy登录豆瓣时,发现其返回结果为乱码,使用各种方式对其response进行转码,均无效,spider代码如下:

import scrapy

class DoubanSpider(scrapy.Spider):
    name = 'douban'
    allowed_domains = ['www.douban.com/people/210172987/']
    start_urls = ['https://www.douban.com/people/210172987/']

    def start_requests(self):
        url = "https://accounts.douban.com/j/mobile/login/basic"
        data = {
            "name":"138xxxxxx",
            "password": "xxxxxx",
            "remember": "false",
        }
        yield scrapy.FormRequest(url=url, formdata=data, callback=self.parse_login)

    def parse_login(self, response):
        print(response.text)

乱码如下:


Jietu20200203-135349.jpg

测试发现postman下结果是正常,经对比,发现其返回正文内容编码为br,如:Content-Encoding: br

br 指的是 Brotli,是一种全新的数据格式,无损压缩,压缩比极高(比gzip高的)。

默认环境没有提供br编码的支持,因此乱码。

其解决方法:

  • 把默认header中的Accept-Encoding中的br去除
  • 提供br压缩格式支持。

解决方法一:把默认header中的Accept-Encoding中的br去除,结果如:

DEFAULT_REQUEST_HEADERS = {
    'Accept': 'application/json,text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'zh-cn',
    'Accept-Encoding': 'gzip, deflate',
    'Connection': 'keep-alive',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.4 Safari/605.1.15'
}

解决方法二:提供br压缩格式支持: 安装Brotli
通过 pip安装即可,

pip install Brotli

因为默认scrapy中间件scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware对压缩内容提供了支持(包括br格式),但环境默认没有提供br格式的解压包导致。

你可能感兴趣的:(scrapy豆瓣登录响应结果乱码问题)