知識點一:Requests的詳解及其基本使用方法
-
什么是requests庫
Requests庫是用Python編寫的,基於urllib,采用Apache2 Licensed開源協議的HTTP庫,相比urllib庫,Requests庫更加方便,可以節約我們大量的工作,完全滿足HTTP測試需求。
Requests是用python語言基於urllib編寫的,采用的是Apache2 Licensed開源協議的HTTP庫如果你看過上篇文章關於urllib庫的使用,你會發現,其實urllib還是非常不方便的,
而Requests它會比urllib更加方便,可以節約我們大量的工作。(用了requests之后,你基本都不願意用urllib了)一句話,requests是python實現的最簡單易用的HTTP庫,建議爬蟲使用requests庫。
默認安裝好python之后,是沒有安裝requests模塊的,需要單獨通過pip安裝
-
安裝
pip insatll request
-
Requests庫的用法詳解
-
試例
import requests response = requests.get('http://www.baidu.com/')#首先調用requests的get方法 print(type(response)) print(response.status_code) print(type(response.text)) print(response.text)#不需要解碼就可以直接打印信息print(response.cookies) print(response.cookies)
-
各種請求方式(HTTP測試網站:http://httpbin.org/)
import requests requests.post('http://httpbin.org/post') requests.put('http://httpbin.org/put') requests.delete('http://httpbin.org/delete') requests.head('http://httpbin.org/get') requests.options('http://httpbin.org/get')
-
請求
-
GET請求
-
基本get請求
import requests response = requests.get('http://httpbin.org/get') print(response.text)#對比urllib,無需用decode解碼
-
帶參GET請求
import requests response = requests.get('http://httpbin.org/get?name=Arise&age=22') print(response.text)
另一種寫法:
import requests data = { 'name':'Arise', 'age':22 }
#直接使用requests.get的params參數即可實現以上的操作 response = requests.get('http://httpbin.org/get',params = data) print(response.text) -
解析JSON
import requests response = requests.get('http://httpbin.org/get') print(type(response.text)) print(response.json()) #可以對比一下Json轉化的和直接調用response的Json方法的區別print(response.json()) print(type(response.json()))
另一種方式比較:
import requests import json response = requests.get('http://httpbin.org/get') print(type(response.text)) print(response.json()) print(json.loads(response.text)) print(type(response.json()))
-
獲取二進制數據(圖片,音頻的下載)
import requests response2 = requests.get('https://github.com/favicon.ico')
print(type(response2.text),type(response2.content)) print(response2.text) print(response2.content)將圖片抓取下來:
import requests response2 = requests.get('https://github.com/favicon.ico') with open('E://favicon.ico','wb')as f: f.write(response2.content) f.close()
-
添加headers
-
沒有headers時,有可能獲取不了網頁源代碼
import requests #不加headers有可能會被禁,造成爬取失敗 response = requests.get('http://www.zhihu.com/explore') print(response.text)
獲取的結果:
<html> <head><title>400 Bad Request</title></head> <body bgcolor="white"> <center><h1>400 Bad Request</h1></center> <hr><center>openresty</center> </body> </html>
-
有headers情況下,獲取網頁源代碼
import requests headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36'} response = requests.get('http://www.zhihu.com/explore', headers=headers) print(response.text)
獲取的結果:
<!DOCTYPE html> <html lang="zh-CN" dropEffect="none" class="no-js no-auth "> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> <meta name="renderer" content="webkit" /> <meta http-equiv="X-ZA-Response-Id" content="1f0be26a2a6632839cfb9ce762ba9d07"> <meta http-equiv="X-ZA-Experiment" content="default:None,ge3:ge3_9,ge2:ge2_1,nwebQAGrowth:experiment,is_office:false,nweb_growth_people:default,is_show_unicom_free_entry:unicom_free_entry_off,app_store_rate_dialog:close,android_profile_panel:panel_b,search_advert_position:1,live_store:ls_a2_b2_c1_f2,nweb_search:nweb_search_heifetz,search_hybrid_tabs:pin-3#album-7,new_live_feed_mediacard:new,hybrid_zhmore_video:yes,new_mobile_column_appheader:new_header,search_tab:collapse,rt:y,ad_r:a,growth_search:s2,qaweb_related_readings_content_control:close,android_pass_through_push:all,new_sign_bg:new,new_mobile_app_header:true,np:1,android_search_tab_style:search_tab_style_b,u_re:0,android_db_recommend_action:open,zcm-lighting:zcm,android_db_feed_hash_tag_style:button,mobile_feed_guide:block,qrcode_login:qrcode,is_new_noti_panel:no,nweb_search_suggest:default"> <title>發現 - 知乎</title> ... ... ... ...
-
-
-
POST請求
-
基本POST請求
import requests data ={'name':'Arise','age':22} response = requests.post('http://httpbin.org/post',data = data) print(response.text)
獲取的結果:
{ "args": {}, "data": "", "files": {}, "form": { "age": "22", "name": "Arise" }, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Connection": "close", "Content-Length": "17", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "python-requests/2.18.4" }, "json": null, "origin": "112.91.182.26", "url": "http://httpbin.org/post" }
-
加headers的請求
import requests data ={'name':'Arise','age':22} headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'} response2 = requests.post('http://httpbin.org/post',data = data,headers = headers) print(response2.json())
獲取的結果:
{'args': {}, 'data': '', 'files': {}, 'form': {'age': '22', 'name': 'Arise'}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'close', 'Content-Length': '17', 'Content-Type': 'application/x-www-form-urlencoded', 'Host': 'httpbin.org', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}, 'json': None, 'origin': '112.91.182.26', 'url': 'http://httpbin.org/post'}
-
-
-
響應
-
response屬性
import requests #常用的response屬性 headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'} response3 = requests.get('http://www.jianshu.com',headers = headers) print(type(response3.status_code),response3.status_code) print(type(response3.headers),response3.headers) print(type(response3.cookies),response3.cookies) print(type(response3.url),response3.url) print(type(response3.history),response3.history)
獲得的結果:
<class 'int'> 200 <class 'requests.structures.CaseInsensitiveDict'> {'Date': 'Tue, 07 Aug 2018 03:47:28 GMT', 'Server': 'Tengine', 'Content-Type': 'text/html; charset=utf-8', 'Transfer-Encoding': 'chunked', 'X-Frame-Options': 'DENY', 'X-XSS-Protection': '1; mode=block', 'X-Content-Type-Options': 'nosniff', 'ETag': 'W/"679a5982b15c1b6676846b75321c20c4"', 'Cache-Control': 'max-age=0, private, must-revalidate', 'Set-Cookie': 'locale=zh-CN; path=/', 'X-Request-Id': 'afbf2087-b6d0-42e9-8c10-f5fc13a8568e', 'X-Runtime': '0.007606', 'Strict-Transport-Security': 'max-age=31536000; includeSubDomains; preload', 'Content-Encoding': 'gzip', 'X-Via': '1.1 wj29:0 (Cdn Cache Server V2.0), 1.1 PSlndlwtvb8:10 (Cdn Cache Server V2.0), 1.1 PSgdgzwt5yu38:1 (Cdn Cache Server V2.0)', 'Connection': 'keep-alive', 'X-Dscp-Value': '0'} <class 'requests.cookies.RequestsCookieJar'> <RequestsCookieJar[<Cookie locale=zh-CN for www.jianshu.com/>]> <class 'str'> https://www.jianshu.com/ <class 'list'> [<Response [301]>]
-
狀態碼判斷
import requests response4 = requests.get('http://www.baidu.com') exit() if not response4.status_code ==requests.codes.ok else print('Requst Successfully') #判斷響應的狀態碼,如果為200,打印“Request Sucessfully”,否則退出!
另一種方式:
import requests response4 = requests.get('http://www.baidu.com') exit() if not response4.status_code ==200 else print('Requst Successfully') #exit() if not response4.status_code ==requests.codes.ok else print('Requst Successfully')
一些狀態碼對應的內容:
1 100: ('continue',), 2 101: ('switching_protocols',), 3 102: ('processing',), 4 103: ('checkpoint',), 5 122: ('uri_too_long', 'request_uri_too_long'), 6 200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\o/', '✓'), 7 201: ('created',), 8 202: ('accepted',), 9 203: ('non_authoritative_info', 'non_authoritative_information'), 10 204: ('no_content',), 11 205: ('reset_content', 'reset'), 12 206: ('partial_content', 'partial'), 13 207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'), 14 208: ('already_reported',), 15 226: ('im_used',), 16 17 Redirection. 18 300: ('multiple_choices',), 19 301: ('moved_permanently', 'moved', '\o-'), 20 302: ('found',), 21 303: ('see_other', 'other'), 22 304: ('not_modified',), 23 305: ('use_proxy',), 24 306: ('switch_proxy',), 25 307: ('temporary_redirect', 'temporary_moved', 'temporary'), 26 308: ('permanent_redirect', 27 'resume_incomplete', 'resume',), # These 2 to be removed in 3.0 28 29 Client Error. 30 400: ('bad_request', 'bad'), 31 401: ('unauthorized',), 32 402: ('payment_required', 'payment'), 33 403: ('forbidden',), 34 404: ('not_found', '-o-'), 35 405: ('method_not_allowed', 'not_allowed'), 36 406: ('not_acceptable',), 37 407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'), 38 408: ('request_timeout', 'timeout'), 39 409: ('conflict',), 40 410: ('gone',), 41 411: ('length_required',), 42 412: ('precondition_failed', 'precondition'), 43 413: ('request_entity_too_large',), 44 414: ('request_uri_too_large',), 45 415: ('unsupported_media_type', 'unsupported_media', 'media_type'), 46 416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'), 47 417: ('expectation_failed',), 48 418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'), 49 421: ('misdirected_request',), 50 422: ('unprocessable_entity', 'unprocessable'), 51 423: ('locked',), 52 424: ('failed_dependency', 'dependency'), 53 425: ('unordered_collection', 'unordered'), 54 426: ('upgrade_required', 'upgrade'), 55 428: ('precondition_required', 'precondition'), 56 429: ('too_many_requests', 'too_many'), 57 431: ('header_fields_too_large', 'fields_too_large'), 58 444: ('no_response', 'none'), 59 449: ('retry_with', 'retry'), 60 450: ('blocked_by_windows_parental_controls', 'parental_controls'), 61 451: ('unavailable_for_legal_reasons', 'legal_reasons'), 62 499: ('client_closed_request',), 63 64 Server Error. 65 500: ('internal_server_error', 'server_error', '/o\', '✗'), 66 501: ('not_implemented',), 67 502: ('bad_gateway',), 68 503: ('service_unavailable', 'unavailable'), 69 504: ('gateway_timeout',), 70 505: ('http_version_not_supported', 'http_version'), 71 506: ('variant_also_negotiates',), 72 507: ('insufficient_storage',), 73 509: ('bandwidth_limit_exceeded', 'bandwidth'), 74 510: ('not_extended',), 75 511: ('network_authentication_required', 'network_auth', 'network_authentication'),
1 1.信息提示 2 3 0代表本地響應成功 4 5 100 - Continue 初始的請求已經接受,客戶應當繼續發送請求的其余部分 6 7 101 - Switching Protocols 服務器將遵從客戶的請求轉換到另外一種協議 8 9 2.請求成功 10 11 200 - OK 一切正常,對GET和POST請求的應答文檔跟在后面 12 13 201 - Created 服務器已經創建了文檔,Location頭給出了它的URL 14 15 202 - Accepted 已經接受請求,但處理尚未完成 16 17 203 - Non-Authoritative Information 文檔已經正常地返回,但一些應答頭可能不正確,因為使用的是文檔的拷貝,非權威性信息 18 19 204 - No Content 沒有新文檔,瀏覽器應該繼續顯示原來的文檔。如果用戶定期地刷新頁面,而Servlet可以確定用戶文檔足夠新,這個狀態代碼是很有用的 20 21 205 - Reset Content 沒有新的內容,但瀏覽器應該重置它所顯示的內容。用來強制瀏覽器清除表單輸入內容 22 23 206 - Partial Content 客戶發送了一個帶有Range頭的GET請求,服務器完成了它 24 25 3.重定向 26 27 300 - Multiple Choices 客戶請求的文檔可以在多個位置找到,這些位置已經在返回的文檔內列出。如果服務器要提出優先選擇,則應該在Location應答頭指明。 28 29 301 - Moved Permanently 客戶請求的文檔在其他地方,新的URL在Location頭中給出,瀏覽器應該自動地訪問新的URL。 30 31 302 - Found 類似於301,但新的URL應該被視為臨時性的替代,而不是永久性的。注意,在HTTP1.0中對應的狀態信息是“Moved Temporatily”。出現該狀態代碼時,瀏覽器能夠自動訪問新的URL,因此它是一個很有用的狀態代碼。注意這個狀態代碼有時候可以和301替換使用。例如,如果瀏覽器錯誤地請求 http://host/~user (缺少了后面的斜杠),有的服務器返回301,有的則返回302。嚴格地說,我們只能假定只有當原來的請求是GET時瀏覽器才會自動重定向。請參見307。 32 33 303 - See Other 類似於301/302,不同之處在於,如果原來的請求是POST,Location頭指定的重定向目標文檔應該通過GET提取(HTTP 1.1新)。 34 35 304 - Not Modified 客戶端有緩沖的文檔並發出了一個條件性的請求(一般是提供If-Modified-Since頭表示客戶只想比指定日期更新的文檔)。服務器告訴客戶,原來緩沖的文檔還可以繼續使用。 36 37 305 - Use Proxy 客戶請求的文檔應該通過Location頭所指明的代理服務器提取 38 39 307 - Temporary Redirect 和302(Found)相同。許多瀏覽器會錯誤地響應302應答進行重定向,即使原來的請求是POST,即使它實際上只能在POST請求的應答是303時才能重定向。由於這個原因,HTTP 1.1新增了307,以便更加清除地區分幾個狀態代碼:當出現303應答時,瀏覽器可以跟隨重定向的GET和POST請求;如果是307應答,則瀏覽器只能跟隨對GET請求的重定向。 40 41 4.客戶端錯誤 42 43 400 - Bad Request 請求出現語法錯誤。 44 45 401 - Unauthorized 訪問被拒絕,客戶試圖未經授權訪問受密碼保護的頁面。應答中會包含一個WWW-Authenticate頭,瀏覽器據此顯示用戶名字/密碼對話框,然后在填寫合適的Authorization頭后再次發出請求。IIS 定義了許多不同的 401 錯誤,它們指明更為具體的錯誤原因。這些具體的錯誤代碼在瀏覽器中顯示,但不在 IIS 日志中顯示: 46 47 401.1 - 登錄失敗。 48 49 401.2 - 服務器配置導致登錄失敗。 50 51 401.3 - 由於 ACL 對資源的限制而未獲得授權。 52 53 401.4 - 篩選器授權失敗。 54 55 401.5 - ISAPI/CGI 應用程序授權失敗。 56 57 401.7 – 訪問被 Web 服務器上的 URL 授權策略拒絕。這個錯誤代碼為 IIS 6.0 所專用。 58 59 403 - Forbidden 資源不可用。服務器理解客戶的請求,但拒絕處理它。通常由於服務器上文件或目錄的權限設置導致。禁止訪問:IIS 定義了許多不同的 403 錯誤,它們指明更為具體的錯誤原因: 60 61 403.1 - 執行訪問被禁止。 62 63 403.2 - 讀訪問被禁止。 64 65 403.3 - 寫訪問被禁止。 66 67 403.4 - 要求 SSL。 68 69 403.5 - 要求 SSL 128。 70 71 403.6 - IP 地址被拒絕。 72 73 403.7 - 要求客戶端證書。 74 75 403.8 - 站點訪問被拒絕。 76 77 403.9 - 用戶數過多。 78 79 403.10 - 配置無效。 80 81 403.11 - 密碼更改。 82 83 403.12 - 拒絕訪問映射表。 84 85 403.13 - 客戶端證書被吊銷。 86 87 403.14 - 拒絕目錄列表。 88 89 403.15 - 超出客戶端訪問許可。 90 91 403.16 - 客戶端證書不受信任或無效。 92 93 403.17 - 客戶端證書已過期或尚未生效。 94 95 403.18 - 在當前的應用程序池中不能執行所請求的 URL。這個錯誤代碼為 IIS 6.0 所專用。 96 97 403.19 - 不能為這個應用程序池中的客戶端執行 CGI。這個錯誤代碼為 IIS 6.0 所專用。 98 99 403.20 - Passport 登錄失敗。這個錯誤代碼為 IIS 6.0 所專用。 100 101 404 - Not Found 無法找到指定位置的資源。這也是一個常用的應答 102 103 404.0 -(無) – 沒有找到文件或目錄 104 105 404.1 - 無法在所請求的端口上訪問 Web 站點 106 107 404.2 - Web 服務擴展鎖定策略阻止本請求 108 109 404.3 - MIME 映射策略阻止本請求 110 111 405 - Method Not Allowed 請求方法(GET、POST、HEAD、DELETE、PUT、TRACE等)對指定的資源不適用,用來訪問本頁面的 HTTP 謂詞不被允許(方法不被允許) 112 113 406 - Not Acceptable 指定的資源已經找到,但它的MIME類型和客戶在Accpet頭中所指定的不兼容,客戶端瀏覽器不接受所請求頁面的 MIME 類型 114 115 407 - Proxy Authentication Required 要求進行代理身份驗證,類似於401,表示客戶必須先經過代理服務器的授權 116 117 408 - Request Timeout 在服務器許可的等待時間內,客戶一直沒有發出任何請求。客戶可以在以后重復同一請求 118 119 409 - Conflict 通常和PUT請求有關。由於請求和資源的當前狀態相沖突,因此請求不能成功。 120 121 410 - Gone 所請求的文檔已經不再可用,而且服務器不知道應該重定向到哪一個地址。它和404的不同在於,返回407表示文檔永久地離開了指定的位置,而404表示由於未知的原因文檔不可用 122 123 411 - Length Required 服務器不能處理請求,除非客戶發送一個Content-Length頭 124 125 412 - Precondition Failed 請求頭中指定的一些前提條件失敗器認為自己能夠稍后再處理該請求,則應該提供一個Retry-After頭 126 127 414 - Request URI Too Long URI太長 128 129 415 – 不支持的媒體類型 130 131 416 – Requested Range Not Satisfiable 服務器不能滿足客戶在請求中指定的Range頭 132 133 417 – 執行失敗 134 135 423 – 鎖定的錯誤 136 137 5.服務器錯誤 138 139 500 - Internal Server Error 服務器遇到了意料不到的情況,不能完成客戶的請求。 140 141 500.12 - 應用程序正忙於在 Web 服務器上重新啟動。 142 143 500.13 - Web 服務器太忙。 144 145 500.15 - 不允許直接請求 Global.asa。 146 147 500.16 – UNC 授權憑據不正確。這個錯誤代碼為 IIS 6.0 所專用。 148 149 500.18 – URL 授權存儲不能打開。這個錯誤代碼為 IIS 6.0 所專用。 150 151 500.100 - 內部 ASP 錯誤。 152 153 501 - Not Implemented 服務器不支持實現請求所需要的功能,頁眉值指定了未實現的配置。例如,客戶發出了一個服務器不支持的PUT請求。 154 155 502 - Bad Gateway 服務器作為網關或者代理時,為了完成請求訪問下一個服務器,但該服務器返回了非法的應答。 亦說Web 服務器用作網關或代理服務器時收到了無效響應。 156 157 502.1 - CGI 應用程序超時。 158 159 502.2 - CGI 應用程序出錯。 160 161 503 - Service Unavailable 服務不可用,服務器由於維護或者負載過重未能應答。例如,Servlet可能在數據庫連接池已滿的情況下返回503。服務器返回503時可以提供一個Retry-After頭。這個錯誤代碼為 IIS 6.0 所專用。 162 163 504 - Gateway Timeout 網關超時,由作為代理或網關的服務器使用,表示不能及時地從遠程服務器獲得應答。(HTTP 1.1新) 。 164 165 · 505 - HTTP Version Not Supported 服務器不支持請求中所指明的HTTP版本。
-
-
高級操作
-
文件上傳
file = {'file':open('favicon.ico','rb')}#將之前抓取的github圖標以二進制格式讀取 response = requests.post('http://httpbin.org/post',files = file) print(response.text)
獲取的內容:
{ "args": {}, "data": "", "files": { "file": "data:application/octet-stream;base64,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AAAAAAAAKysrBhYWGUcWFhiVFRUYvxUVGNkWFhfzFhYX8xUVGNkVFRi/FhYYlRYWGUcrKysGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" }, "form": {}, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Connection": "close", "Content-Length": "6665", "Content-Type": "multipart/form-data; boundary=f955136a56ab4e4880a9e7de31f96a96", "Host": "httpbin.org", "User-Agent": "python-requests/2.18.4" }, "json": null, "origin": "112.91.182.26", "url": "http://httpbin.org/post" }
-
獲取cookie
import requests response = requests.get('http://www.baidu.com') #相比urllib,就不需要聲明任何變量print(response.cookies) print(response.cookies) for key,value in response.cookies.items(): print(key + '=' + value)
獲得的內容:
<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]> BDORZ=27315
-
會話維持(一般用於模擬登陸)
import requests requests.get('http://httpbin.org/cookies/set/number/123456789')#為網站的訪問設置cookie response = requests.get('http://httpbin.org/cookies')#與上面的行為時獨立的,所以獲取不到任何與cookie相關的信息 print(response.text)
{ "cookies": {} }
可以發現,我們傳入的cookie,然而並沒有獲取到,這是因為沒有確定是一個會話。解決方法如下:
import requests s = requests.Session()#通過聲明Session對象,在使用這個對象發起兩次GET請求(相當於同一個瀏覽器發出來的請求) s.get('http://httpbin.org/cookies/set/number/123456789') response = s.get('http://httpbin.org/cookies') print(response.text)
{ "cookies": { "number": "123456789" } }
-
證書驗證
import requests response = requests.get('https://www.12306.cn') print(response.status_code) #因為這個網站的https證書,不是官方的,認為是偽證書,會報錯
解決方法:
import requests response = requests.get('https://www.12306.cn',verify=False)#設置參數解決 print(response.status_code)
或者:
import requests #通過一下兩行代碼即可把警報消除,即使verify=False,報警還是存在的 from requests.packages import urllib3 urllib3.disable_warnings() #首先會檢測證書是否合法,通過verify就可以設置成False就可關閉錯誤提示 response = requests.get('https://www.12306.cn',verify = False) print(response.status_code)
-
代理設置
import requests proxies = { "http":"http://hk.tiyun.tk:4613", "https":"https://hk.tiyun.tk:4613" } response = requests.get('http://www.taobao.com',proxies = proxies) print(response.status_code)
-
有密碼的設置:
import requests proxies = { "http":"http://user:password@hk.tiyun.tk:4613", "https":"https://user:password@hk.tiyun.tk:4613", } response = requests.get('http://www.taobao.com',proxies = proxies) print(response.status_code)
-
socket代理設置
- 安裝
pip install requests[socks]
- 使用
import requests proxies = { 'http':'socks5//127.0.0.1:1080/pac?auth=HgT2fpms98njlh9QGpsP&t=201803030916114202', 'https':'socks5//127.0.0.1:1080/pac?auth=HgT2fpms98njlh9QGpsP&t=201803030916114202', } response = requests.get('http://www.taobao.com',proxies = proxies) print(response.status_code)
-
-
超時設置
#可以通過修改時間或是訪問國外網站,會出現ReaTimeout報警 import requests from requests.exceptions import ReadTimeout try: response = requests.get('http://www.baidu.com',timeout = 0.1) print(response.status_code) except ReadTimeout: print('TIMEOUT')
-
認證設置(登錄驗證)
import requests from requests.auth import HTTPBasicAuth #也可以是auth={'user','123'}以字典的形式傳入 r = requests.get('http://120.27.34.24.9001',auth = HTTPBasicAuth('user','123')) print(r.status_cde)
-
異常處理(官方文檔)
import requests #首先先捕獲ReadTimeout,網絡不通捕獲ConnectionError,抓取異常捕獲RequestException from requests.exceptions import ReadTimeout,ConnectionError,RequestException try: response1 = requests.get('http://httpbin.org/get',timeout = 0.1) print(response.status_code) except ReadTimeout: print('TIMEOUUT') except ConnectionError: print('Connection Error') except RequestException: print('Error')
-