首页 > 编程 > Python > 正文

python使用scrapy发送post请求的坑

2020-02-15 22:53:17
字体:
来源:转载
供稿:网友

使用requests发送post请求

先来看看使用requests来发送post请求是多少好用,发送请求

Requests 简便的 API 意味着所有 HTTP 请求类型都是显而易见的。例如,你可以这样发送一个 HTTP POST 请求:

>>>r = requests.post('http://httpbin.org/post', data = {'key':'value'})

使用data可以传递字典作为参数,同时也可以传递元祖

>>>payload = (('key1', 'value1'), ('key1', 'value2'))>>>r = requests.post('http://httpbin.org/post', data=payload)>>>print(r.text){ ... "form": {  "key1": [   "value1",   "value2"  ] }, ...}

传递json是这样

>>>import json>>>url = 'https://api.github.com/some/endpoint'>>>payload = {'some': 'data'}>>>r = requests.post(url, data=json.dumps(payload))

2.4.2 版的新加功能:

>>>url = 'https://api.github.com/some/endpoint'>>>payload = {'some': 'data'}>>>r = requests.post(url, json=payload)

也就是说,你不需要对参数做什么变化,只需要关注使用data=还是json=,其余的requests都已经帮你做好了。

使用scrapy发送post请求

通过源码可知scrapy默认发送的get请求,当我们需要发送携带参数的请求或登录时,是需要post、请求的,以下面为例

from scrapy.spider import CrawlSpiderfrom scrapy.selector import Selectorimport scrapyimport jsonclass LaGou(CrawlSpider):  name = 'myspider'  def start_requests(self):    yield scrapy.FormRequest(      url='https://www.******.com/jobs/positionAjax.json?city=%E5%B9%BF%E5%B7%9E&needAddtionalResult=false',      formdata={        'first': 'true',#这里不能给bool类型的True,requests模块中可以        'pn': '1',#这里不能给int类型的1,requests模块中可以        'kd': 'python'      },这里的formdata相当于requ模块中的data,key和value只能是键值对形式      callback=self.parse    )  def parse(self, response):    datas=json.loads(response.body.decode())['content']['positionResult']['result']    for data in datas:      print(data['companyFullName'] + str(data['positionId']))

官方推荐的 Using FormRequest to send data via HTTP POST

return [FormRequest(url="http://www.example.com/post/action",          formdata={'name': 'John Doe', 'age': '27'},          callback=self.after_post)]

这里使用的是FormRequest,并使用formdata传递参数,看到这里也是一个字典。

但是,超级坑的一点来了,今天折腾了一下午,使用这种方法发送请求,怎么发都会出问题,返回的数据一直都不是我想要的

return scrapy.FormRequest(url, formdata=(payload))

在网上找了很久,最终找到一种方法,使用scrapy.Request发送请求,就可以正常的获取数据。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表