欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python利用requests庫模擬post請(qǐng)求時(shí)json的使用教程

 更新時(shí)間:2018年12月07日 08:47:25   作者:NewJune  
這篇文章主要介紹了python利用requests庫模擬post請(qǐng)求時(shí)json的使用 ,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

我們都見識(shí)過requests庫在靜態(tài)網(wǎng)頁的爬取上展現(xiàn)的威力,我們?nèi)粘R姷米疃嗟臑間et和post請(qǐng)求,他們最大的區(qū)別在于安全性上:

1、GET是通過URL方式請(qǐng)求,可以直接看到,明文傳輸。

2、POST是通過請(qǐng)求header請(qǐng)求,可以開發(fā)者工具或者抓包可以看到,同樣也是明文的。 3.GET請(qǐng)求會(huì)保存在瀏覽器歷史紀(jì)錄中,還可能會(huì)保存在Web的日志中。

  兩者用法上也有顯著差異(援引自知乎):

1、GET用于從服務(wù)器端獲取數(shù)據(jù),包括靜態(tài)資源(HTML|JS|CSS|Image等等)、動(dòng)態(tài)數(shù)據(jù)展示(列表數(shù)據(jù)、詳情數(shù)據(jù)等等)。

2、POST用于向服務(wù)器提交數(shù)據(jù),比如增刪改數(shù)據(jù),提交一個(gè)表單新建一個(gè)用戶、或修改一個(gè)用戶等。

對(duì)于Post請(qǐng)求,我們可以通過瀏覽器開發(fā)者工具或者其他外部工具來進(jìn)行抓包,得到請(qǐng)求的URL、請(qǐng)求頭(request headers)以及請(qǐng)求的表單data信息,這三樣恰恰是我們用requests模擬post請(qǐng)求時(shí)需要的,典型的寫法如下:

  response=requests.post(url=url,headers=headers,data=data_search)

  由于post請(qǐng)求很多時(shí)候是配合Ajax(異步加載)技術(shù)一起使用的,我們抓包時(shí),可以直接選擇XHR(XmlHttpRequest)-ajax的一種對(duì)象,幫助我們?yōu)V掉其他的一些html、css、js類文件,如下圖所示(截取自Chrome):

雙擊點(diǎn)開,就可以在頁面右邊的Headers頁下看到General、Response Headers、Request Headers、Form Data幾個(gè)模塊,

其中General模塊能看到請(qǐng)求的方法和請(qǐng)求的URL以及服務(wù)器返回的狀態(tài)碼(200(成功) 服務(wù)器已成功處理了請(qǐng)求。通常,這表示服務(wù)器提供了請(qǐng)求的網(wǎng)頁。)

而Response Headers部分,可以看到緩存控制、服務(wù)器類型、返回內(nèi)容格式、有效期等參數(shù)(筆者截圖所示,返回的為json文件):

Request Header模塊是非常重要的,可以有效地將我們的爬取行為模擬成瀏覽器行為,應(yīng)對(duì)常規(guī)的服務(wù)器反爬機(jī)制:

其中Content-Type、Cookie以及User-Agent字段較為重要,需要我們構(gòu)造出來(其他字段大多數(shù)時(shí)候,不是必須)

由于Cookie字段記錄了用戶的登陸信息,每次都不同,且同一個(gè)cookie存在一定有效期,當(dāng)我們結(jié)合Selenium來組合爬取頁面信息時(shí),可以通過selenium完成網(wǎng)頁的登陸校驗(yàn),然后利用selenium提取出cookie,再轉(zhuǎn)換為瀏覽器能識(shí)別的cookie格式,通常代碼如下所示:

cookies = driver.get_cookies() #利用selenium原生方法得到cookies
ret=''
for cookie in cookies:
  cookie_name=cookie['name']
  cookie_value=cookie['value']
  ret=ret+cookie_name+'='+cookie_value+';' #ret即為最終的cookie,各cookie以“;”相隔開

緊接著,我們需要構(gòu)造headers部分(即請(qǐng)求頭),我們挑重點(diǎn)的幾個(gè)字段進(jìn)行構(gòu)造:

headers={
  'Host':'**********.com',
  'Referer':'http://****************/check/index.do',
  'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
  'X-Requested-With':'XMLHttpRequest',
  'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',
  'Cookie':ret #需要登陸后捕獲cookie并調(diào)用
}

我們?cè)诰W(wǎng)頁中點(diǎn)擊“確定”按鈕,網(wǎng)頁則會(huì)異步加載,后臺(tái)發(fā)出post請(qǐng)求,取到j(luò)son文件并渲染到網(wǎng)頁表單中,比如我們根據(jù)需求填寫了部分字段(這些就是我們post請(qǐng)求的data信息),然后觀察后臺(tái)的form data信息:

后臺(tái)Form data 捕獲到的data參數(shù)如圖:

類似于字典格式,其中condition鍵對(duì)應(yīng)的value較為復(fù)雜——列表中包含字典,字典中還有部分函數(shù),其中字符串中既有單引號(hào)又有雙引號(hào)交錯(cuò)。屬于關(guān)鍵信息,page決定了網(wǎng)頁的翻頁在第幾頁,而rows則表示每次請(qǐng)求的數(shù)據(jù)限定的最大行數(shù)。

本例中問題的關(guān)鍵是,如何把想要的信息(譬如來源于excel配置文件)傳遞到condition字段對(duì)應(yīng)的值內(nèi),確保Form data信息靈活可配置,大抵用法如下:

data_search={
  'page':1,
  'rows':15,
  'condition':
  """[\
    {"column":"BPM_DEF_NAME","exp":"like","value":""},\
    {"column":"DELETE_STATUS","exp":"=","value":0},\
    {"column":"TO_CHAR(TO_DATE(CREATE_DATE,'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD')","exp":">=","value":"YYYY-MM-DD"},\
    {"column":"TO_CHAR(TO_DATE(CREATE_DATE,'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD')","exp":"<=","value":"YYYY-MM-DD"},\
    {"column":"CHECK_TYPE","exp":"like","value":"2"},\
    {"column":"LOCKED_STATUS","exp":"=","value":0},\
    {"column":"DELETE_STATUS","orderType":"default","orderKey":"","direction":"ASC"}\
  ]""",  #考慮到該字段已經(jīng)有單引號(hào)、雙引號(hào),所以只能用三引號(hào)來包住這部分代表字符串
  'additionalParams':'{}'
}
data_search_condition=json.loads(data_search['condition'])  #將字符串轉(zhuǎn)為列表,方便更新列表(列表中每個(gè)元素都是一個(gè)單個(gè)字典)元素
#刷新字典
data_search_condition[0]['value']=businessName
data_search_condition[2]['value']=str(startDate)
data_search_condition[3]['value']=str(endDate)
data_search['condition']=json.dumps(data_search_condition) #將列表重新轉(zhuǎn)回字符串,作為data_search字典中鍵“condition”對(duì)應(yīng)的“value”,然后更新字典

上述代碼中,data_search其實(shí)為字典對(duì)象,其鍵“condition”對(duì)應(yīng)的值(三引號(hào)包住部分)為字符串,本質(zhì)是json格式,我們?nèi)绾螌?duì)這部分動(dòng)態(tài)傳參呢?

這里需要用到python json包中常用的loads和dumps方法:

1、json.loads()是將json格式對(duì)象,轉(zhuǎn)化Python可識(shí)別的字典對(duì)象。解碼python json格式,可以用這個(gè)模塊的json.loads()函數(shù)的解析方法。

2、json.dumps()是將一個(gè)Python數(shù)據(jù)類型列表進(jìn)行json格式的編碼解析,可以將一個(gè)list列表對(duì)象,進(jìn)行了json格式的編碼轉(zhuǎn)換。

3、json.dump和json.dumps很不同,json.dump主要用來json文件讀寫,和json.load函數(shù)配合使用。

上面實(shí)例中,就是將data_search['condition'](json,字符串)轉(zhuǎn)換為列表,然后根據(jù)列表定位到底層的每個(gè)dict字典,最后根據(jù)dict[Key]=value的方法進(jìn)行更新(傳參),更新完之后的列表,再通過json.dumps反向轉(zhuǎn)回字符串,這樣整個(gè)data_search字典中參數(shù)就可以靈活配置,通過外部引入了。

剩下的工作就很簡單,交給強(qiáng)大的Requests包完成就好,示例代碼如下:

def get_page(data_search,url): #定義頁面解析的函數(shù),返回值為json格式
  try:
    response=requests.post(url=url,headers=headers,data=data_search)
    if response.status_code==200:
      return response.json()
  except requests.ConnectionError as e:
    print('Error',e.args)

我們還可以把json格式內(nèi)容存到本地(data.json)格式文件或者txt文本,并按照特定縮進(jìn)(indent=4)進(jìn)行規(guī)則排版,格式化內(nèi)容,此時(shí)要用到j(luò)son.dump()方法,示例代碼如下:

for pageNum in range(1,1000):
  data_search['page']=str(pageNum)
  pageContent=get_page(data_search=data_search,url=url)
  with open('data.json','w',encoding="utf-8") as json_file:
    json.dump(pageContent,json_file,ensure_ascii = False,indent=4)
  if pageContent==None:
    print("無符合條件的單據(jù)!") 
    time.sleep(3)
    sys.exit(0)

格式化后的json看上去直觀不少:

   最后感慨一句:爬蟲是門技術(shù)活,任何一個(gè)技術(shù)理解地不夠透徹,碰到復(fù)雜的問題,可能就要花上很長時(shí)間去試錯(cuò),譬如本文示例中的字典、json包幾個(gè)功能的使用,稍微出錯(cuò),就無法請(qǐng)求到對(duì)的數(shù)據(jù)!

PS:特別強(qiáng)調(diào)一點(diǎn),有的時(shí)候requests.post()方法中data字段不填或者填寫有誤,服務(wù)器有時(shí)也會(huì)返回200狀態(tài)碼以及相應(yīng)內(nèi)容。這種情況下,我們一定要與手工操作得到的json文件進(jìn)行對(duì)比,看看我們的傳參(多測試幾組不同的參數(shù),看返回json內(nèi)容是否不同)是否真的起到作用,以免空歡喜一場!

總結(jié)

以上所述是小編給大家介紹的python利用requests庫模擬post請(qǐng)求時(shí)json的使用教程 ,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 詳解利用Python制作中文漢字雨效果

    詳解利用Python制作中文漢字雨效果

    這篇文章主要介紹了如何利用Python中的Pygame模塊實(shí)現(xiàn)中文漢字雨效果,文中通過示例代碼介紹的非常詳細(xì),感興趣的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03
  • 利用Python打造一個(gè)多人聊天室的示例詳解

    利用Python打造一個(gè)多人聊天室的示例詳解

    這篇文章主要介紹的是利用Python實(shí)現(xiàn)的一個(gè)簡易的多人聊天室,文中的示例代碼講解詳細(xì),對(duì)學(xué)習(xí)Python有一定的幫助,感興趣的可以學(xué)習(xí)一下
    2021-12-12
  • Python中super函數(shù)用法實(shí)例分析

    Python中super函數(shù)用法實(shí)例分析

    這篇文章主要介紹了Python中super函數(shù)用法,結(jié)合實(shí)例形式詳細(xì)分析了Python中super函數(shù)的功能、調(diào)用父類相關(guān)原理、操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-03-03
  • Python?中enum的使用方法總結(jié)

    Python?中enum的使用方法總結(jié)

    這篇文章主要介紹了Python?中enum的使用方法總結(jié),枚舉在許多編程語言中常被表示為一種基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)使用,下文更多詳細(xì)內(nèi)容需要的小伙伴可以參考一下
    2022-03-03
  • python中的被動(dòng)信息搜集

    python中的被動(dòng)信息搜集

    這篇文章主要介紹了python中的被動(dòng)信息搜集的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-04-04
  • Python MD5文件生成碼

    Python MD5文件生成碼

    用python實(shí)現(xiàn)文件md5生成碼核心實(shí)現(xiàn)代碼。
    2009-01-01
  • Python標(biāo)準(zhǔn)庫之collections包的使用教程

    Python標(biāo)準(zhǔn)庫之collections包的使用教程

    這篇文章主要給大家介紹了Python標(biāo)準(zhǔn)庫之collections包的使用教程,詳細(xì)介紹了collections中多個(gè)集合類的使用方法,相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面隨小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-04-04
  • pandas選擇或添加列生成新的DataFrame操作示例

    pandas選擇或添加列生成新的DataFrame操作示例

    這篇文章主要為大家介紹了pandas選擇或添加列生成新的DataFrame實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Python實(shí)現(xiàn)天氣查詢軟件

    Python實(shí)現(xiàn)天氣查詢軟件

    今天給大家?guī)硪粋€(gè)不是那么實(shí)用的小工具-天氣查詢,文中詳細(xì)介紹了如何實(shí)用Python實(shí)現(xiàn)天氣查詢系統(tǒng),需要的朋友可以參考下
    2021-06-06
  • 詳解Django模版中加載靜態(tài)文件配置方法

    詳解Django模版中加載靜態(tài)文件配置方法

    這篇文章主要介紹了Django模版中加載靜態(tài)文件配置方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-07-07

最新評(píng)論