入門學Python一定要知道的requests模組安裝及使用

coyan發表於2021-09-09

主要學習requests這個http模組,該模組主要用於傳送請求獲取響應,該模組有很多的替代模組,比如說urllib模組,但是在工作中用的最多的還是requests模組,requests的程式碼簡潔易懂,相對於臃腫的urllib模組,使用requests編寫的爬蟲程式碼將會更少,而且實現某一功能將會簡單。因此建議大家掌握該模組的使用。

requests模組

我們來學習如何在程式碼中實現我們的爬蟲

1. requests模組介紹

requests文件

** 1.1 requests模組的作用:**

傳送http請求,獲取響應資料

1.2 requests模組是一個第三方模組,需要在你的python(虛擬)環境中額外安裝

pip/pip3 install requests

1.3 requests模組傳送get請求

    需求:透過requests向百度首頁傳送請求,獲取該頁面的原始碼

    執行下面的程式碼,觀察列印輸出的結果

1.2.1-簡單的程式碼實現

import requests

目標url

url = ''

向目標url傳送get請求

response = requests.get(url)

列印響應內容

print(response.text)

知識點:掌握 requests模組傳送get請求

2. response響應物件
----------------

觀察上邊程式碼執行結果發現,有好多亂碼;這是因為編解碼使用的字符集不同早造成的;我們嘗試使用下邊的辦法來解決中文亂碼問題

# 1.2.2-response.content
import requests 

# 目標url
url = '' 

# 向目標url傳送get請求
response = requests.get(url)

# 列印響應內容
# print(response.text)
print(response.content.decode()) # 注意這裡!

1.response.text是requests模組按照chardet模組推測出的編碼字符集進行解碼的結果

2.網路傳輸的字串都是bytes型別的,所以response.text = response.content.decode('推測出的編碼字符集')

3.我們可以在網頁原始碼中搜尋charset,嘗試參考該編碼字符集,注意存在不準確的情況

**2.1 response.text 和response.content的區別:**

response.text

型別:str

解碼型別: requests模組自動根據HTTP 頭部對響應的編碼作出有根據的推測,推測的文字編碼

response.content

型別:bytes

解碼型別: 沒有指定
**2.2 透過對response.content進行decode,來解決中文亂碼**

response.content.decode() 預設utf-8

response.content.decode("GBK")

常見的編碼字符集

*   utf-8
*   gbk
*   gb2312
*   ascii (讀音:阿斯克碼)
*   iso-8859-1

**2.3 response響應物件的其它常用屬性或方法**

> response = requests.get(url)中response是傳送請求獲取的響應物件;response響應物件中除了text、content獲取響應內容以外還有其它常用的屬性或方法:

response.url響應的url;有時候響應的url和請求的url並不一致

response.status_code 響應狀態碼

response.request.headers 響應對應的請求頭

response.headers 響應頭

response.request._cookies 響應對應請求的cookie;返回cookieJar型別

response.cookies 響應的cookie(經過了set-cookie動作;返回cookieJar型別

response.json()自動將json字串型別的響應內容轉換為python物件(dict or list)

# 1.2.3-response其它常用屬性
import requests

# 目標url
url = ''

# 向目標url傳送get請求
response = requests.get(url)

# 列印響應內容
# print(response.text)
# print(response.content.decode()) 			# 注意這裡!
print(response.url)							# 列印響應的url
print(response.status_code)					# 列印響應的狀態碼
print(response.request.headers)				# 列印響應物件的請求頭
print(response.headers)						# 列印響應頭
print(response.request._cookies)			# 列印請求攜帶的cookies
print(response.cookies)						# 列印響應中攜帶的cookies



```

3. requests模組傳送請求
------------------

**3.1 傳送帶header的請求**

```
我們先寫一個獲取百度首頁的程式碼

import requests

url = ''

response = requests.get(url)

print(response.content.decode())

列印響應對應請求的請求頭資訊

print(response.request.headers)

**3.1.1 思考**

對比瀏覽器上百度首頁的網頁原始碼和程式碼中的百度首頁的原始碼,有什麼不同?

檢視網頁原始碼的方法:

    右鍵-檢視網頁原始碼 或

    右鍵-檢查

對比對應url的響應內容和程式碼中的百度首頁的原始碼,有什麼不同?

檢視對應url的響應內容的方法:

    右鍵-檢查

    點選 Net work

    勾選 Preserve log

    重新整理頁面

    檢視Name一欄下和瀏覽器位址列相同的url的Response

程式碼中的百度首頁的原始碼非常少,為什麼?

需要我們帶上請求頭資訊

    回顧爬蟲的概念,模擬瀏覽器,欺騙伺服器,獲取和瀏覽器一致的內容

請求頭中有很多欄位,其中User-Agent欄位必不可少,表示客戶端的作業系統以及瀏覽器的資訊
**3.1.2 攜帶請求頭髮送請求的方法**

requests.get(url, headers=headers)

headers引數接收字典形式的請求頭

請求頭欄位名作為key,欄位對應的值作為value

**3.1.3 完成程式碼實現**

從瀏覽器中複製User-Agent,構造headers字典;完成下面的程式碼後,執行程式碼檢視結果

import requests

url = ''

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}

# 在請求頭中帶上User-Agent,模擬瀏覽器傳送請求
response = requests.get(url, headers=headers) 

print(response.content)

# 列印請求頭資訊
print(response.request.headers)


```

**3.2 傳送帶引數的請求**

```
我們在使用百度搜尋的時候經常發現url地址中會有一個 ?,那麼該問號後邊的就是請求引數,又叫做查詢字串

```

3.2.1 在url攜帶引數

直接對含有引數的url發起請求

```
import requests

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}

url = '/s?wd=python'

response = requests.get(url, headers=headers)


```

**3.2.2 透過params攜帶引數字典**

1.構建請求引數字典

2.向介面傳送請求的時候帶上引數字典,引數字典設定給params

```
import requests

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}

# 這是目標url
# url = '/s?wd=python'

# 最後有沒有問號結果都一樣
url = '/s?'

# 請求引數是一個字典 即wd=python
kw = {'wd': 'python'}

# 帶上請求引數發起請求,獲取響應
response = requests.get(url, headers=headers, params=kw)

print(response.content)


```

**3.3 在headers引數中攜帶cookie**

```
網站經常利用請求頭中的Cookie欄位來做使用者訪問狀態的保持,那麼我們可以在headers引數中新增Cookie,模擬普通使用者的請求。我們以github登陸為例:

```

**3.3.1 github登陸抓包分析**

```
開啟瀏覽器,右鍵-檢查,點選Net work,勾選Preserve log

訪問github登陸的url地址 

輸入賬號密碼點選登陸後,訪問一個需要登陸後才能獲取正確內容的url,比如點選右上角的Your profile訪問

確定url之後,再確定傳送該請求所需要的請求頭資訊中的User-Agent和Cookie

```

![](~tplv-k3u1fbpfcp-zoom-1.image)

**3.3.2 完成程式碼**

```
從瀏覽器中複製User-Agent和Cookie

瀏覽器中的請求頭欄位和值與headers引數中必須一致

headers請求引數字典中的Cookie鍵對應的值是字串

import requests

url = ''

構造請求頭字典

headers = { # 從瀏覽器中複製過來的User-Agent 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36', # 從瀏覽器中複製過來的Cookie 'Cookie': 'xxx這裡是複製過來的cookie字串' }

請求頭引數字典中攜帶cookie字串

resp = requests.get(url, headers=headers)

print(resp.text)

**3.3.3 執行程式碼驗證結果**

在列印的輸出結果中搜尋title,html中的標題文字內容如果是你的github賬號,則成功利用headers引數攜帶cookie,獲取登陸後才能訪問的頁面

![](~tplv-k3u1fbpfcp-zoom-1.image)

知識點:掌握 headers中攜帶cookie

**3.4 cookies引數的使用**

上一小節我們在headers引數中攜帶cookie,也可以使用專門的cookies引數

cookies引數的形式:字典

cookies = {"cookie的name":"cookie的value"}

該字典對應請求頭中Cookie字串,以分號、空格分割每一對字典鍵值對

等號左邊的是一個cookie的name,對應cookies字典的key

等號右邊對應cookies字典的value

cookies引數的使用方法

response = requests.get(url, cookies)

將cookie字串轉換為cookies引數所需的字典:

cookies_dict = {cookie.split('=')[0]:cookie.split('=')[-1] for cookie in cookies_str.split('; ')}

注意:cookie一般是有過期時間的,一旦過期需要重新獲取

import requests

url = ''

# 構造請求頭字典
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'
}
# 構造cookies字典
cookies_str = '從瀏覽器中copy過來的cookies字串'

cookies_dict = {cookie.split('=')[0]:cookie.split('=')[-1] for cookie in cookies_str.split('; ')}

# 請求頭引數字典中攜帶cookie字串
resp = requests.get(url, headers=headers, cookies=cookies_dict)

print(resp.text)


```

知識點:掌握 cookies引數的使用

**3.5 cookieJar物件轉換為cookies字典的方法**

```
使用requests獲取的resposne物件,具有cookies屬性。該屬性值是一個cookieJar型別,包含了對方伺服器設定在本地的cookie。我們如何將其轉換為cookies字典呢?

轉換方法

cookies_dict = requests.utils.dict_from_cookiejar(response.cookies)

其中response.cookies返回的就是cookieJar型別的物件

requests.utils.dict_from_cookiejar函式返回cookies字典


作者:白又白i
連結:
來源:掘金
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2236/viewspace-2796642/,如需轉載,請註明出處,否則將追究法律責任。

相關文章