在使用scrapy登錄豆瓣時蜘澜,發(fā)現(xiàn)其返回結(jié)果為亂碼响疚,使用各種方式對其response進(jìn)行轉(zhuǎn)碼,均無效装诡,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
測試發(fā)現(xiàn)postman下結(jié)果是正常鸦采,經(jīng)對比咕幻,發(fā)現(xiàn)其返回正文內(nèi)容編碼為br
,如:Content-Encoding: br
br 指的是 Brotli咱旱,是一種全新的數(shù)據(jù)格式,無損壓縮吐限,壓縮比極高(比gzip高的)。
默認(rèn)環(huán)境沒有提供br
編碼的支持诸典,因此亂碼。
其解決方法:
- 把默認(rèn)header中的
Accept-Encoding
中的br
去除 - 提供
br
壓縮格式支持舀寓。
解決方法一:把默認(rèn)header中的Accept-Encoding
中的br
去除肌蜻,結(jié)果如:
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
因為默認(rèn)scrapy中間件scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware
對壓縮內(nèi)容提供了支持(包括br格式)豆挽,但環(huán)境默認(rèn)沒有提供br
格式的解壓包導(dǎo)致。