1. 程式人生 > >requests模塊的入門使用

requests模塊的入門使用

應對 字符串 byte sge requests 狀態 地址 cookies 頁面

學習目標:
  1. 了解 requests模塊的介紹
  2. 掌握 requests的基本使用
  3. 掌握 response常見的屬性
  4. 掌握 requests.text和content的區別
  5. 掌握 解決網頁的解碼問題
  6. 掌握 requests模塊發送帶headers的請求
  7. 掌握 requests模塊發送帶參數的get請求

1 為什麽要重點學習requests模塊,而不是urllib

  • requests的底層實現就是urllib
  • requests在python2 和python3中通用,方法完全一樣
  • requests簡單易用
  • Requests能夠自動幫助我們解壓(gzip壓縮的等)響應內容

2 requests的作用

作用:發送網絡請求,返回響應數據

中文文檔 : http://docs.python-requests.org/zh_CN/latest/index.html

通過觀察文檔來學習:如何使用requests來發送網絡請求

3 requests模塊發送簡單的get請求、獲取響應

需求:通過requests向百度首頁發送請求,獲取百度首頁的數據

import requests 

# 目標url
url = ‘https://www.baidu.com‘ 

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

# 打印響應內容
print(response.text)
response的常用屬性:
  • response.text 響應體 str類型
  • respones.content 響應體 bytes類型
  • response.status_code 響應狀態碼
  • response.request.headers 響應對應的請求頭
  • response.headers 響應頭
  • response.request.cookies 響應對應請求的cookie
  • response.cookies 響應的cookie(經過了set-cookie動作)
思考:text是response的屬性還是方法呢?
  • 一般來說名詞,往往都是對象的屬性,對應的動詞是對象的方法
3.1 response.text 和response.content的區別
  • response.text

    • 類型:str
    • 解碼類型: requests模塊自動根據HTTP 頭部對響應的編碼作出有根據的推測,推測的文本編碼
    • 如何修改編碼方式:response.encoding=”gbk”
  • response.content

    • 類型:bytes
    • 解碼類型: 沒有指定
    • 如何修改編碼方式:response.content.deocde(“utf8”)

獲取網頁源碼的通用方式:

  1. response.content.decode()
  2. response.content.decode("GBK")
  3. response.text

以上三種方法從前往後嘗試,能夠100%的解決所有網頁解碼的問題

所以:更推薦使用response.content.deocde()的方式獲取響應的html頁面

3.2 練習:把網絡上的圖片保存到本地

我們來把www.baidu.com的圖片保存到本地

思考:
  • 以什麽方式打開文件
  • 保存什麽格式的內容

分析:

  • 圖片的url: https://www.baidu.com/img/bd_logo1.png
  • 利用requests模塊發送請求獲取響應
  • 以2進制寫入的方式打開文件,並將response響應的二進制內容寫入
import requests

# 圖片的url
url = ‘https://www.baidu.com/img/bd_logo1.png‘ 

# 響應本身就是一個圖片,並且是二進制類型
response = requests.get(url) 

# print(response.content)

# 以二進制+寫入的方式打開文件
with open(‘baidu.png‘, ‘wb‘) as f: 
    # 寫入response.content bytes二進制類型
    f.write(response.content)

4 發送帶header的請求

我們先寫一個獲取百度首頁的代碼

import requests

url = ‘https://www.baidu.com‘

response = requests.get(url)

print(response.content)

# 打印響應對應請求的請求頭信息
print(response.request.headers)
4.1 思考

對比瀏覽器上百度首頁的網頁源碼和代碼中的百度首頁的源碼,有什麽不同?

代碼中的百度首頁的源碼非常少,為什麽?

4.2 為什麽請求需要帶上header?

模擬瀏覽器,欺騙服務器,獲取和瀏覽器一致的內容

4.3 header的形式:字典

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"}

4.4 用法

requests.get(url, headers=headers)

4.5 完整的代碼
import requests

url = ‘https://www.baidu.com‘

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)

5 發送帶參數的請求

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

5.1 什麽叫做請求參數:

例1: http://www.webkaka.com/tutorial/server/2015/021013/

例2:https://www.baidu.com/s?wd=python&a=c

例1中沒有請求參數!例2中?後邊的就是請求參數

5.2 請求參數的形式:字典

kw = {‘wd‘:‘長城‘}

5.3 請求參數的用法

requests.get(url,params=kw)

5.4 關於參數的註意點

在url地址中, 很多參數是沒有用的,比如百度搜索的url地址,其中參數只有一個字段有用,其他的都可以刪除 如何確定那些請求參數有用或者沒用:挨個嘗試! 對應的,在後續的爬蟲中,越到很多參數的url地址,都可以嘗試刪除參數

5.5 兩種方式:發送帶參數的請求

5.5.1 對https://www.baidu.com/s?wd=python發起請求可以使用requests.get(url, params=kw)的方式
# 方式一:利用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 = ‘https://www.baidu.com/s?wd=python‘ 

# 最後有沒有問號結果都一樣
url = ‘https://www.baidu.com/s?‘ 

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

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

# 當有多個請求參數時,requests接收的params參數為多個鍵值對的字典,比如 ‘?wd=python&a=c‘-->{‘wd‘: ‘python‘, ‘a‘: ‘c‘}

print(response.content)
5.5.2 也可以直接對https://www.baidu.com/s?wd=python完整的url直接發送請求,不使用params參數
# 方式二:直接發送帶參數的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 = ‘https://www.baidu.com/s?wd=python‘

# kw = {‘wd‘: ‘python‘}

# url中包含了請求參數,所以此時無需params
response = requests.get(url, headers=headers)

6 作業

1.獲取新浪首頁,查看response.text 和response.content.decode()的區別

2.實現任意貼吧的爬蟲,保存網頁到本地


小結

  1. requests模塊的介紹:能夠幫助我們發起請求獲取響應
  2. requests的基本使用:requests.get(url)
  3. 以及response常見的屬性:
    • response.text 響應體 str類型
    • respones.content 響應體 bytes類型
    • response.status_code 響應狀態碼
    • response.request.headers 響應對應的請求頭
    • response.headers 響應頭
    • response.request._cookies 響應對應請求的cookie
    • response.cookies 響應的cookie(經過了set-cookie動作)
  4. 掌握 requests.text和content的區別:text返回str類型,content返回bytes類型
  5. 掌握 解決網頁的解碼問題:
    • response.content.decode()
    • response.content.decode("GBK")
    • response.text
  6. 掌握 requests模塊發送帶headers的請求:requests.get(url, headers={})
  7. 掌握 requests模塊發送帶參數的get請求:requests.get(url, params={})

requests模塊的入門使用