Python爬蟲——Requests庫
Python爬蟲——Requests庫
Requests庫
-
HTTP協議
在說爬蟲之前,先了解了解什麼是HTTP協議。
HTTP–Hyper Text Transfer Protocol,超文字傳輸協議,是一種建立在TCP上的無狀態連線,整個基本的工作流程是客戶端傳送一個HTTP請求,說明客戶端想要訪問的資源和請求的動作,服務端收到請求之後,服務端開始處理請求,並根據請求做出相應的動作訪問伺服器資源,最後通過傳送HTTP響應把結果返回給客戶端。
URL格式:http://host [:port][path]
host: 合法的Internet主機域名或IP地址
port:埠號,預設則為80path:請求資源的路徑
HTTP協議對資源的操作
GET,HEAD,POST, PUT, PATCH, DELETE(請自行查閱相關資料)
在這裡強調一下GET與POST的區別:
- GET方式可以通過URL提交資料,待提交的資料是URL的一部分;採用POST方式,待提交的資料放置在HTML HEADER內
- GET方式提交的資料最多不超過1024位元組,POST沒有對提交內容的長度限制
- 安全性問題。使用GET時引數會顯示在URL中,而POST不會。所以,如果這些資料是敏感資料,建議採用POST方式
-
什麼是Requests庫?
requests庫是一個簡潔且簡單的處理HTTP請求的第三方庫。
由於是第三方庫,所以需要自行安裝,pip install requests即可。
-
Requests庫的主要方法
方法 描述 .request() 構造一個請求,以支援以下各種方法 .get() 獲取HTML網頁的主要方法,對應GET請求 .head() 獲取HTML網頁頭資訊 .post() 提交POST請求 .put() 提交PUT請求 .patch() 提交區域性修改請求 .delete() 提交刪除請求 關於GET,POST,PUT等方法,請自行學習HTML中的GET,POST,PUT等請求,便於加深理解。
-
什麼是response物件
和瀏覽器的互動一樣,request.get()等方法代表請求過程,它返回的Response物件代表響應。返回內容作為一個物件以便操作。
-
Respon物件的常用屬性與方法
屬性 描述 r.status_code 請求返回狀態,200(成功),404(失敗) r.text 響應內容的字串形式,即URL的頁面內容 r.encoding 從HTTPheader中猜測的響應內容編碼方式 r.apparent_encoding 從內容分析出的響應內容的編碼方式 r.content 響應內容的二進位制形式 r.headers 響應內容的頭部資訊 r.url 返回請求的URL
方法 | 描述 |
---|---|
r.json() | 如果HTTP響應內容包含JSON格式資料,則用該方法解析JSON資料 |
r.raise_for_status | 如果訪問狀態不是200,則產生HTTPError異常 |
注:HTTPheader中的charset欄位記錄了響應內容的編碼方式,如果為空,則預設編碼方式為“ISO-8859-1”,
直接列印內容會出現亂碼,需要修改其編碼方式。可通過r.encoding = r.apparent_encoding修改。
>>> import requests #import Requests庫
>>> r = requests.get("https://wwww.baidu.com") #使用get方法開啟百度連結
>>> type(r) #返回的是response物件
<class 'requests.models.Response'>
>>> r.status_code #檢視請求狀態
200
>>> r.text[:50] #響應內容
'<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head><met'
>>> r.encoding #編碼方式
'ISO-8859-1'
>>> r.apparent_encoding #從內容分析出的編碼方式
'utf-8'
>>> r.content #響應內容的二進位制形式
-
Requests庫的常用異常
異常 描述 ConnectionError 網路連線錯誤異常 HTTPError HTTP錯誤 URLRequired URL缺失異常 TooManyRedirects 超過最大重定向次數 ConnectTimeout 連結遠端伺服器超時 Timeout 請求URL超時 -
一般網頁爬取的通用框架(用於練習的小程式)
def getHTMLText(url): try: r = requests.get(url, timeout = 30) r.raise_for_status r.encoding = r.apparent_encoding return r.text except: return "爬取異常"
-
request方法詳細引數
requests.request(method,url,**kwargs)
method:指請求型別即,GET,POST,PUT等。
URL:訪問的URL
**kwarys,包含13個引數,以下是其詳細說明
params: 字典或位元組序列,作為引數增加到URL中
data: 字典,位元組序列或檔案物件,作為Request的內容
JSON : JOSN格式的資料,作為Request的內容headers:字典,HTTP定製頭(模擬瀏覽器進行訪問)
cokies:字典或CpplieJar,Request中的cookie
auth: 元組,支援HTTP認證功能
files:字典型別,傳輸檔案
timeout: 設定超時時間,秒為單位
proxies: 字典型別,設定訪問代理伺服器,可以增加登陸認證
allow_redirects: True//False,預設為True,重定向開關
stream: True/False,預設為True,獲取內容立即下載開關
verify: True/False,預設為True,認證SSL證書開關注意:Requests庫的其他請求方法,都是對request方法的封裝
請看GET的原始碼:
def get(url, params=None, **kwargs): r"""Sends a GET request. :param url: URL for the new :class:`Request` object. :param params: (optional) Dictionary, list of tuples or bytes to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response <Response>` object :rtype: requests.Response """ kwargs.setdefault('allow_redirects', True) return request('get', url, params=params, **kwargs) #通過呼叫request方法,得到get方法的返回值
講了這麼多,現在就來看看程式碼吧!
1.最基本的GET方法
requests.get(url, params = None, **kwargs)
其中params預設為None
>>> import requests >>> r = requests.get("https://www.baidu.com") >>> r.status_code 200 >>> r.encoding = r.apparent_encoding >>> r.text
帶引數的GET方法
>>> r = requests.get("https://www.baidu.com/s?wd=Python") >>> r.status_code 200 >>> r.encoding = r.apparent_encoding >>> r.text
2.通過params引數可以達到同樣的目的,params為字典型別,增加到URL中。
>>> data = {"wd" : "Python"} >>> r=requests.get("https://www.baidu.com/s?", params = data) >>> r.status_code 200 >>> r.url 'https://www.baidu.com/s?wd=Python'
上述兩種的結果是相同的,通過params引數傳遞一個字典內容,從而直接構造url
注意:第二種方式通過字典的方式的時候,如果字典中的引數為None則不會新增到url.3.解析JSON
注意需要匯入json庫,下面看程式碼:
>>> import json >>> import requests >>> r = requests.get("https://www.baidu.com") >>> r.status_code 200 >>> r.json() >>> #如果HTTP響應內容包含JSON格式資料,則用該方法解析JSON資料 #以上程式碼會報錯,原因是HTTP響應內容沒有JSON格式資料。這裡只是演示一下。
4.獲取二進位制資料
使用r.content
主要用於獲取視訊圖片等二進位制資源。
5.提交Headers
直接訪問某些網站(如,知乎)是無法訪問的,原因之一是其URL需要提交headers
>>> import requests >>> r = requests.get("https://www.zhihu.com") >>> r.status_code 400 #出現400,表示訪問出錯
Chrome的使用者代理如下:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36
將Chrome的頭部資訊新增到get中,注意使用字典格式
>>> import requests >>> headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36"} >>> r = requests.get("https://www.zhihu.com", headers = headers) >>> r.status_code 200 #User-Agent,使用者代理,簡稱 UA,它是一個特殊字串頭,使得伺服器能夠識別客戶使用的作業系統及版本、CPU 型別、瀏覽器及版本、瀏覽器渲染引擎、瀏覽器語言、瀏覽器外掛等
6.POST請求
requests.post(url, data = None, json = None, **kwargs)
通過在傳送post請求時新增一個data引數,data引數為字典型別。
>>> data = {"name":"germey", "age":"23"} >>> r = requests.post("http://httpbin.org/post", data = data) >>> r.status_code 200 >>> r.text '{\n "args": {}, \n "data": "", \n "files": {}, \n "form": {\n "age": "23", \n "name": "germey"\n }, \n "headers": {\n "Accept": "*/*", \n "Accept-Encoding": "gzip, deflate", \n "Connection": "close", \n "Content-Length": "18", \n "Content-Type": "application/x-www-form-urlencoded", \n "Host": "httpbin.org", \n "User-Agent": "python-requests/2.20.0"\n }, \n "json": null, \n "origin": "113.251.223.127", \n "url": "http://httpbin.org/post"\n}\n'
在form欄位中就添加了data資料
以上就是Requests庫的基本用法。
下面附上幾個mooc上的小例項
轉載請註明:https://blog.csdn.net/qq_43544492
Requests庫的更多用法,可以參考Requests庫的官方文件:http://docs.python-requests.org