Scrapy的請(qǐng)求設(shè)計(jì)跟requests相差很大,對(duì)比之下,能深刻感受到requests的好用,Scrapy則會(huì)撞見一些坑。
就比如提交一個(gè)空json給來獲取數(shù)據(jù)。
一個(gè)請(qǐng)求的requests版本
import requests
url = 'http://gs.amac.org.cn/amac-infodisc/api/pof/fund?rand=0.9006151119982766&page=1&size=50'
resp = requests.post(url, json={})
print(resp.json())

用scrapy實(shí)現(xiàn)
import scrapy
import json
class Spider(scrapy.Spider):
name = 'spider'
def start_requests(self):
url = 'http://gs.amac.org.cn/amac-infodisc/api/pof/fund?rand=0.9006151119982766&page=1&size=50'
yield scrapy.FormRequest(url, method='POST', callback=self.parse, body=json.dumps({}))
def parse(self, response):
print(json.loads(response.body.decode()))
if __name__ == '__main__':
from scrapy import cmdline
cmdline.execute('scrapy crawl spider'.split())

但是卻很不給力的請(qǐng)求失敗,body=json.dumps({}) 是scrapy標(biāo)準(zhǔn)的傳遞json數(shù)據(jù)方式。但是為什么沒成功呢?
通過requests找原因


我們可以看到請(qǐng)求頭和響應(yīng)頭里都被加上了Content-Type并帶有json子,但是在scrapy的請(qǐng)求頭中卻沒有,于是我推斷原因跟它有關(guān)。
試一下在scrapy請(qǐng)求頭中加上Content-Type

果然成功的獲取到了數(shù)據(jù)。