目錄
requests庫(kù)是一個(gè)常用于http請(qǐng)求的模塊,性質(zhì)是和urllib,urllib2是一樣的,作用就是向指定目標(biāo)網(wǎng)站的后臺(tái)服務(wù)器發(fā)起請(qǐng)求,并接收服務(wù)器返回的響應(yīng)內(nèi)容。
pip install requests -i https://pypi.douban.com/simple
所謂的get方法,便是利用程序使用HTTP協(xié)議中的GET請(qǐng)求方式對(duì)目標(biāo)網(wǎng)站發(fā)起請(qǐng)求,同樣的還有POST,PUT等請(qǐng)求方式,其中GET是我們最常用的,通過(guò)這個(gè)方法我們可以了解到一個(gè)請(qǐng)求發(fā)起到接收響應(yīng)的過(guò)程。(HTTP常見(jiàn)請(qǐng)求方式:http://www.noob.com/http/http-methods.html)
實(shí)現(xiàn)方式:
import requestsstart_url = 'https://www.baidu.com'response = requests.get(url=start_url)print(response) # 返回值:<Response [200]>
這是一個(gè)最簡(jiǎn)單實(shí)現(xiàn)請(qǐng)求的方式,最后返回一個(gè)響應(yīng)對(duì)象,響應(yīng)對(duì)象中攜帶的數(shù)值便是HTTP狀態(tài)碼,你可以根據(jù)這些狀態(tài)碼的值來(lái)判定請(qǐng)求的成功以及推測(cè)失敗的原因。(HTTP狀態(tài)碼:http://www.noob.com/http/http-status-codes.html)
這并不是一個(gè)完整的請(qǐng)求,因?yàn)榉?wù)器在接收到你的程序的請(qǐng)求信息時(shí),它可以明確的從Request headers中看到你是在用程序發(fā)起請(qǐng)求接收響應(yīng),為了完善我們的請(qǐng)求,可以自定義請(qǐng)求頭信息,利用get()方法的headers參數(shù)。
我們可以從瀏覽器的F12開(kāi)發(fā)者工具中Network下找到請(qǐng)求網(wǎng)址的headers信息,保存下來(lái)作為我們自定義參數(shù)。如:
import requests# 目標(biāo)urlstart_url = 'https://www.baidu.com'# 自定義headersheaders = {'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]>
不同的網(wǎng)站對(duì)于請(qǐng)求頭中的字段信息有著不同的要求,某些關(guān)鍵字段需要在html源碼中去尋找,然后自己組織定義到headers中完成請(qǐng)求。
對(duì)于一些特定的網(wǎng)站會(huì)對(duì)某一時(shí)間段內(nèi)你所在ip的請(qǐng)求次數(shù)坐監(jiān)測(cè),從而判斷此請(qǐng)求是否為非人類(lèi)發(fā)出的,get()方法同樣為我們提供了在請(qǐng)求時(shí)更換ip的操作方式,只需要像自定義headers一樣定義我們的可用ip即可,如下:
import requestsstart_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按格式拼接即可,可以去網(wǎng)上免費(fèi)代理中尋找:http://www.xicidaili.com/nnproxies = {'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還有很多請(qǐng)求參數(shù),如timeout你可以設(shè)置請(qǐng)求時(shí)間,如果超過(guò)這個(gè)時(shí)間變自行結(jié)束請(qǐng)求,可以利用此判斷請(qǐng)求代理的相應(yīng)效率,避免在某些錯(cuò)誤請(qǐng)求上浪費(fèi)過(guò)多的時(shí)間。
post請(qǐng)求方式的使用和get方式并沒(méi)有很大的區(qū)別,本質(zhì)的區(qū)別在于它傳遞參數(shù)的方式并不像get方式一樣,通過(guò)在url中拼接字段來(lái)發(fā)送給服務(wù)器,他采取了一種相較之下更為安全的操作方式,通過(guò)form表單的方式來(lái)向服務(wù)器傳遞查詢(xún)條件。我們同樣可以通過(guò)瀏覽器的F12開(kāi)發(fā)者工具或者fiddler抓包工具來(lái)看到formdata這個(gè)字段,從中獲取form表單中的字段信息,很多登錄操作就是基于此。操作方式如下:
import requestsurl = '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',}# 構(gòu)造form表單data = {'IdEpoque': '', 'MotCle': '', 'Order': '', 'LotParPage': 'All', 'IdTypologie': ''}response = requests.post(url=url, data=data, headers=headers, timeout=10)print(response) # 返回值:<Response [200]>
上面是一個(gè)電商網(wǎng)站的post請(qǐng)求查詢(xún)的案例,當(dāng)我們對(duì)頁(yè)面顯示商品數(shù)量進(jìn)行更改時(shí)發(fā)現(xiàn)我們的url并沒(méi)有發(fā)生改變,此時(shí),我們便可以分析此動(dòng)作是由ajax異步加載或者是通過(guò)post的請(qǐng)求方式來(lái)更改,我們可以通過(guò)開(kāi)發(fā)者工具來(lái)獲取我們想要的信息。
目標(biāo)網(wǎng)址測(cè)試
我們可以很容易的看到請(qǐng)求頭信息和form表單信息,通過(guò)修改LotParPage字段信息可以獲得不同數(shù)量商品的響應(yīng),在實(shí)際操作過(guò)程中要通過(guò)自己的測(cè)試確定headers中所必需的字段和自定義我們的form表單從而完成請(qǐng)求,對(duì)于post的其他參數(shù)和get大致相同,基本通用,有興趣的話(huà)可以去官方查看requests的api文檔。
post除了構(gòu)造表單以外還可以像通過(guò)像服務(wù)器發(fā)送json信息的方式獲取正確的請(qǐng)求,利用的便是中post(json={'key':'value'})的方式,操作流程大致與post發(fā)送form表單相似,案例是一個(gè)國(guó)外網(wǎng)站的demo,雖然全是一些看不懂的文字,但是無(wú)傷大雅,看個(gè)流程就好,目標(biāo)網(wǎng)址:http://anticvarium/auction/archive
從這個(gè)頁(yè)面中我們可以得到一個(gè)專(zhuān)場(chǎng)列表頁(yè),每個(gè)專(zhuān)場(chǎng)中有許多商品,當(dāng)我們直接去請(qǐng)求每個(gè)專(zhuān)場(chǎng)的URL時(shí)不會(huì)得到任何結(jié)果,我們可以從開(kāi)發(fā)者工具中找到他的真實(shí)接口,如下圖所示
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]>
聯(lián)系客服