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
果然成功的获取到了数据。
网友评论