requests模塊的入門使用
學習目標:
- 了解 requests模塊的介紹
- 掌握 requests的基本使用
- 掌握 response常見的屬性
- 掌握 requests.text和content的區別
- 掌握 解決網頁的解碼問題
- 掌握 requests模塊發送帶headers的請求
- 掌握 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
響應對應請求的cookieresponse.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”)
獲取網頁源碼的通用方式:
response.content.decode()
response.content.decode("GBK")
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.實現任意貼吧的爬蟲,保存網頁到本地
小結
- requests模塊的介紹:能夠幫助我們發起請求獲取響應
- requests的基本使用:
requests.get(url)
- 以及response常見的屬性:
response.text
響應體 str類型respones.content
響應體 bytes類型response.status_code
響應狀態碼response.request.headers
響應對應的請求頭response.headers
響應頭response.request._cookies
響應對應請求的cookieresponse.cookies
響應的cookie(經過了set-cookie動作)
- 掌握 requests.text和content的區別:text返回str類型,content返回bytes類型
- 掌握 解決網頁的解碼問題:
response.content.decode()
response.content.decode("GBK")
response.text
- 掌握 requests模塊發送帶headers的請求:
requests.get(url, headers={})
- 掌握 requests模塊發送帶參數的get請求:
requests.get(url, params={})
requests模塊的入門使用