Scrapy的請求設計跟requests相差很大,對比之下,能深刻感受到requests的好用,Scrapy則會撞見一些坑。
就比如提交一個空json給來獲取數據。
一個請求的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實現
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())
但是卻很不給力的請求失敗,body=json.dumps({})
是scrapy標準的傳遞json數據方式。但是為什么沒成功呢?
通過requests找原因
我們可以看到請求頭和響應頭里都被加上了Content-Type
并帶有json
子,但是在scrapy的請求頭中卻沒有,于是我推斷原因跟它有關。
試一下在scrapy請求頭中加上Content-Type
果然成功的獲取到了數據。