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

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

[TOC]html

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

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) 實現方式:laravel

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信息,保存下來做爲咱們自定義參數。如:web

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便可,以下:ajax

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你能夠設置請求時間,若是超過這個時間變自行結束請求,能夠利用此判斷請求代理的相應效率,避免在某些錯誤請求上浪費過多的時間。json

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

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

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]>
相關文章
相關標籤/搜索