1. 程式人生 > >Python爬蟲——Requests庫

Python爬蟲——Requests庫

Python爬蟲——Requests庫

Requests庫

  • HTTP協議

    在說爬蟲之前,先了解了解什麼是HTTP協議。

    HTTP–Hyper Text Transfer Protocol,超文字傳輸協議,是一種建立在TCP上的無狀態連線,整個基本的工作流程是客戶端傳送一個HTTP請求,說明客戶端想要訪問的資源和請求的動作,服務端收到請求之後,服務端開始處理請求,並根據請求做出相應的動作訪問伺服器資源,最後通過傳送HTTP響應把結果返回給客戶端。

    URL格式:http://host [:port][path]

    host: 合法的Internet主機域名或IP地址
    port:埠號,預設則為80

    path:請求資源的路徑

    HTTP協議對資源的操作

    GET,HEAD,POST, PUT, PATCH, DELETE(請自行查閱相關資料)

    在這裡強調一下GET與POST的區別:

    1. GET方式可以通過URL提交資料,待提交的資料是URL的一部分;採用POST方式,待提交的資料放置在HTML HEADER內
    2. GET方式提交的資料最多不超過1024位元組,POST沒有對提交內容的長度限制
    3. 安全性問題。使用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