在使用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)
乱码如下:
测试发现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
格式的解压包导致。