使用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發送請求,就可以正常的獲取數據。
新聞熱點
疑難解答