使用requests發(fā)送post請求
先來看看使用requests來發(fā)送post請求是多少好用,發(fā)送請求
Requests 簡便的 API 意味著所有 HTTP 請求類型都是顯而易見的。例如,你可以這樣發(fā)送一個 HTTP POST 請求:
>>>r = requests.post('http://httpbin.org/post', data = {'key':'value'})
使用data可以傳遞字典作為參數(shù),同時也可以傳遞元祖
>>>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)
也就是說,你不需要對參數(shù)做什么變化,只需要關(guān)注使用data=還是json=,其余的requests都已經(jīng)幫你做好了。
使用scrapy發(fā)送post請求
通過源碼可知scrapy默認發(fā)送的get請求,當我們需要發(fā)送攜帶參數(shù)的請求或登錄時,是需要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傳遞參數(shù),看到這里也是一個字典。
但是,超級坑的一點來了,今天折騰了一下午,使用這種方法發(fā)送請求,怎么發(fā)都會出問題,返回的數(shù)據(jù)一直都不是我想要的
return scrapy.FormRequest(url, formdata=(payload))
在網(wǎng)上找了很久,最終找到一種方法,使用scrapy.Request發(fā)送請求,就可以正常的獲取數(shù)據(jù)。
新聞熱點
疑難解答