Python爬蟲—requests庫get和post方法使用


Python爬蟲—requests庫get和post方法使用

requests庫是一個常用於http請求的模塊,性質是和urllib,urllib2是一樣的,作用就是向指定目標網站的后台服務器發起請求,並接收服務器返回的響應內容。

1. 安裝requests庫

  • 使用pip install requests安裝
    如果再使用pip安裝python模塊出現timeout超時異常,可使用國內豆瓣源進行安裝。
pip install  requests -i https://pypi.douban.com/simple
  • 手動下載安裝包安裝
    同樣的,某些庫安裝出現異常便可采取這種逛淘寶的操作方式。不過,當你在選擇的時候一定要注意實際項目所需求的python庫的版本,以免后期出現問題。
    網站:https://pypi.org

2.requests.get()方法使用

所謂的get方法,便是利用程序使用HTTP協議中的GET請求方式對目標網站發起請求,同樣的還有POST,PUT等請求方式,其中GET是我們最常用的,通過這個方法我們可以了解到一個請求發起到接收響應的過程。(HTTP常見請求方式:http://www.noob.com/http/http-methods.html
實現方式:

import requests

start_url = 'https://www.baidu.com'
response = requests.get(url=start_url)
print(response)    # 返回值:<Response [200]>

這是一個最簡單實現請求的方式,最后返回一個響應對象,響應對象中攜帶的數值便是HTTP狀態碼,你可以根據這些狀態碼的值來判定請求的成功以及推測失敗的原因。(HTTP狀態碼:http://www.noob.com/http/http-status-codes.html
這並不是一個完整的請求,因為服務器在接收到你的程序的請求信息時,它可以明確的從Request headers中看到你是在用程序發起請求接收響應,為了完善我們的請求,可以自定義請求頭信息,利用get()方法的headers參數。
我們可以從瀏覽器的F12開發者工具中Network下找到請求網址的headers信息,保存下來作為我們自定義參數。如:

import requests
# 目標url
start_url = 'https://www.baidu.com'
# 自定義headers
headers = {"Host": "www.baidu.com",
           "Referer": "https://www.baidu.com",
           "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36",
           "X-Requested-With": "XMLHttpRequest"
           }

response = requests.get(url=start_url, headers=headers)
print(response)    # 返回值:<Response [200]>

不同的網站對於請求頭中的字段信息有着不同的要求,某些關鍵字段需要在html源碼中去尋找,然后自己組織定義到headers中完成請求。
對於一些特定的網站會對某一時間段內你所在ip的請求次數坐監測,從而判斷此請求是否為非人類發出的,get()方法同樣為我們提供了在請求時更換ip的操作方式,只需要像自定義headers一樣定義我們的可用ip即可,如下:

import requests

start_url = 'https://www.baidu.com'

headers = {"Host": "www.baidu.com",
           "Referer": "https://www.baidu.com",
           "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36",
           "X-Requested-With": "XMLHttpRequest"
           }
# 自定義代理ip,此處的ip需要自行更換,只需要將ip和port按格式拼接即可,可以去網上免費代理中尋找:http://www.xicidaili.com/nn
proxies = {"https": "https://127.0.0.1:1080", "http": "http://127.0.0.1:1080"}

response = requests.get(url=start_url, headers=headers, proxies=proxies)

print(response)   # 返回值:<Response [200]>

除此之外get還有很多請求參數,如timeout你可以設置請求時間,如果超過這個時間變自行結束請求,可以利用此判斷請求代理的相應效率,避免在某些錯誤請求上浪費過多的時間。

3.requests.post()方法使用—構造formdata表單

post請求方式的使用和get方式並沒有很大的區別,本質的區別在於它傳遞參數的方式並不像get方式一樣,通過在url中拼接字段來發送給服務器,他采取了一種相較之下更為安全的操作方式,通過form表單的方式來向服務器傳遞查詢條件。我們同樣可以通過瀏覽器的F12開發者工具或者fiddler抓包工具來看到formdata這個字段,從中獲取form表單中的字段信息,很多登錄操作就是基於此。操作方式如下:

import requests

url = 'https://en.artprecium.com/catalogue/vente_309_more-than-unique-multiples-estampes/resultat'

headers = {
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
    "Accept-Language": "zh",
    "Cache-Control": "max-age=0",
    "Connection": "keep-alive",
    "Cookie": "PHPSESSID=m2hbrvp548cg6v4ssp0l35kcj7; _ga=GA1.2.2052701472.1532920469; _gid=GA1.2.1351314954.1532920469; __atuvc=3%7C31; __atuvs=5b5e9a0418f6420c001",
    "Host": "en.artprecium.com",
    "Upgrade-Insecure-Requests": "1",
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
}
# 構造form表單
data = {"IdEpoque": "",
        "MotCle": "",
        "Order": "",
        "LotParPage": "All",
        "IdTypologie": ""}

response = requests.post(url=url, data=data, headers=headers, timeout=10)

print(response)   # 返回值:<Response [200]>

上面是一個電商網站的post請求查詢的案例,當我們對頁面顯示商品數量進行更改時發現我們的url並沒有發生改變,此時,我們便可以分析此動作是由ajax異步加載或者是通過post的請求方式來更改,我們可以通過開發者工具來獲取我們想要的信息。

目標網址測試

圖片描述

我們可以很容易的看到請求頭信息和form表單信息,通過修改LotParPage字段信息可以獲得不同數量商品的響應,在實際操作過程中要通過自己的測試確定headers中所必需的字段和自定義我們的form表單從而完成請求,對於post的其他參數和get大致相同,基本通用,有興趣的話可以去官方查看requests的api文檔。

4.requests.post()方法使用—發送json數據

post除了構造表單以外還可以像通過像服務器發送json信息的方式獲取正確的請求,利用的便是中post(json={"key":"value"})的方式,操作流程大致與post發送form表單相似,案例是一個國外網站的demo,雖然全是一些看不懂的文字,但是無傷大雅,看個流程就好,目標網址:http://anticvarium/auction/archive
從這個頁面中我們可以得到一個專場列表頁,每個專場中有許多商品,當我們直接去請求每個專場的URL時不會得到任何結果,我們可以從開發者工具中找到他的真實接口,如下圖所示
圖片描述
我們在看它像服務器傳遞的信息:
圖片描述
通過以上的分析,我們可以

url = 'http://anticvarium/angular'

headers = {
    "Host": "anticvarium",
    "Connection": "keep-alive",
    "Content-Length": "14",
    "Origin": "http://anticvarium",
    "X-CSRF-TOKEN": "u1InfvhE23slcmReIJlgvI7IGzb3xQEvXHQbP3Bc",
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
    "Content-Type": "application/json;charset=UTF-8",
    "Accept": "application/json, text/plain, */*",
    "X-Requested-With": "XMLHttpRequest",
    "Referer": "http://anticvarium/auction/show/66",
    "Accept-Language": "zh",
    "Cookie": "_ga=GA1.2.819821684.1533003173; _gid=GA1.2.258681840.1533003173; _ym_uid=1533003182951117996; _ym_d=1533003182; _ym_isad=2; _ym_visorc_35976415=w; tmr_detect=0%7C1533004777867; laravel_session=eyJpdiI6InZNSTlWSlYyUW1BaitUWTNBSjJKckE9PSIsInZhbHVlIjoibWprTDFxeTZZc0lOS2VTcmxIdzZJSkwwTVFXOHphN2FwTysxbXNHSDkybXE0VUZYakpTUlZ5Ykh6U2pFTTVJTWdWUHBUaVJwVGl1Q3RlTjdRQUhKNEE9PSIsIm1hYyI6IjQ5NmIwMGYxNDllZDFiNTY2ZmFjYWY5NjEyOTQ4MTZjYzQzNmFiY2EyMzFiOTY1Mzg3ODUyZTllN2U0MTQwYTEifQ%3D%3D",
}

response = requests.post(url, headers=headers, json={"auction": 66})
print(response)    # 返回值:<Response [200]>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM