
目錄
- 網路庫requests
- 發送HTTP請求
- GET請求
- POST請求
- 抓取二進制圖片
- 上傳檔案
- 處理Cookie
- 直接將Cookie設定到請求頭
- 通過請求頭,評論CSDN
- RequestsCookieJar()
- Session會話
- 使用代理
- 身份驗證
- 打包請求
- SLL證書驗證
網路庫requests
其實,我們有專門的網路庫進行直接的網路請求與處理,它就是requests庫,在我們開始講解與使用之前,需要通過如下命令進行安裝:
pip install requests
首先,我們先來看看requests庫可以進行哪些操作:
- 發送HTTP請求
- 上傳檔案
- 處理Cookie
- 支持Session會話
- 使用代理
- 身份驗證
- 打包請求
- SSL證書驗證
下面,我們來一一介紹這些操作具體是如何實作的,
發送HTTP請求
與urllib與urllib3一樣,HTTP請求常用的是GET請求與POST請求,
GET請求
其中,GET請求使用的方式是requests.get(),它可以設定引數params,也可以設定超時timeout,同時也可以設定請求頭headers,
示例如下:
import requests
url = "https://www.csdn.net/"
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
result = requests.get(url=url, timeout=1, headers=headers)
#列印網頁源代碼
print(result.text)
#列印回應狀態碼
print(result.status_code)
#列印Cookie
print(result.cookies)
#列印result型別
print(type(result))
運行之后,輸出如下:

POST請求
接著,我們來介紹POST請求,這里,我們同樣使用測驗網站http://httpbin.org/post,向它發送一些資料,示例如下:
import requests
url = "http://httpbin.org/post"
data = {
"name": "liyuanjing",
"age": "29"
}
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
result = requests.post(url=url, timeout=1, headers=headers, data=data)
# 列印網頁源代碼
print(result.text)
# 將其轉換為json
print(result.json())
運行之后,效果如下:

抓取二進制圖片
對于文本檔案的獲取,我們很簡單的通過text進行處理分析,但是假如我們是獲取的一張圖片顯然text是無法還原真實內容,
不僅如此,圖片的text是亂碼,所以,我們需要將獲取到的圖片二進制資料通過相應的API保存為檔案,示例代碼如下:
import requests
url = "https://img1.baidu.com/it/u=954496120,1621506021&fm=26&fmt=auto&gp=0.jpg"
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
result = requests.get(url=url, timeout=1, headers=headers)
with open('requests.png', 'wb') as f:
f.write(result.content)
運行之后,就會在程式目錄的統計目錄下生成一張圖片,當然圖片鏈接讀者可以自己去找,這里的鏈接暫時有效,
需要注意的是,response.text是Unicode編碼,而response.content是原始二進制位元組流,這一點要額外注意,如果網頁出現亂碼,可以使用response.encoding=”gbk”進行設定決議,
上傳檔案
與講解urllib3一樣,我們這里上傳檔案的服務器埠,由flask撰寫,我們先來看看服務器端的代碼:
import flask
import os
UPLOAD_FILE = 'uploads'
app = flask.Flask(__name__)
@app.route('/', methods=['POST'])
def upload_file():
file = flask.request.files['file']
if file:
file.save(os.path.join(UPLOAD_FILE, os.path.basename(file.filename)))
return '檔案上傳成功'
else:
return '檔案上傳失敗'
if __name__ == '__main__':
app.run()
運行此段代碼,默認會一致運行等待下去,
而使用requests進行檔案的上傳,也非常的簡單,因為檔案上傳是Post請求,我們只需要設定file引數,示例如下:
import requests
url = "http://127.0.0.1:5000"
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
files = {
"file": open('123.png', 'rb')
}
result = requests.post(url=url, files=files)
print(result.text)
運行之后,會在專案檔案uploads檔案夾下多一個123.png圖片,當然123上傳時的檔案必須存在,同時也要事先創建uploads檔案夾,
處理Cookie
一般來說,爬蟲分為2個部分:首先是登錄,然后才是爬取,而在登錄時,我們一般使用selenium,進行cookie的回傳,
接著使用requests進行爬取網頁的源代碼,因為selenium是一個專門的庫,后面我們會介紹,這里我們先假設我們獲取到了cookie,
直接將Cookie設定到請求頭
為了更有意思,我們在chrome按F12之后,用瀏覽器評論一個CSDN帖子,會捕捉到如下圖所示的請求資料:

這里,我們可以復制cookie資料到我們的headers之中,
同時下面有一個提交表單,其中,content是我們評論CSDN的內容,articleId是我們評論CSDN的帖子,讀者可以自己看看CSDN帖子是否有一串數字,
通過請求頭,評論CSDN
那么,我們可以仿照這個請求連接,通過requests完成CSDN的評論操作,示例代碼如下所示:
import requests
url = "https://blog.csdn.net/phoenix/web/v1/comment/submit"
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'cookie': 'CSDN登錄后回傳的cookie',
}
data = {
"commentId": "",
"content": "最近正在學習剛好能用上",
"articleId": "118750834",
}
result = requests.post(url=url, data=data, headers=headers)
print(result.status_code)
運行之后,控制臺會輸出200,同時評論帖子下面會多出一條評論資料,如下圖所示:

RequestsCookieJar()
除了通過請求頭設定Cookie進行訪問之外,其實我們的post()方法還有一個專門的cookies引數,它用于接收RequestsCookieJar物件,
示例如下:
import requests
url = "https://blog.csdn.net/phoenix/web/v1/comment/submit"
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}
cookieStr = 'CSDN登錄后回傳的cookie'
data = {
"commentId": "",
"content": "最近正在學習剛好能用上",
"articleId": "118517922",
}
jar = requests.cookies.RequestsCookieJar()
for cookie in cookieStr.split(";"):
key, value = cookie.split('=', 1)
jar.set(key, value)
result = requests.post(url=url, data=data, headers=headers, cookies=jar)
print(result.status_code)
這段代碼與前文運行效果一樣,這里不在輸出運行結果,僅僅只是cookie使用方式的不同形式,
Session會話
cookie資料保存在客戶端,session資料保存在服務器端,一個Session代表一個特定的客戶端,那么如何在特定的客戶端與服務器端的Session物件之間建立聯系呢?
通常就是不斷在客戶端與服務器端之間來回傳遞一個ID,通過這個ID,客戶端就能在服務器端找到對應的Session物件,
在實際的爬蟲專案中,有時候需要使用同一個客戶端來多次抓取頁面,就可以用到Session,示例代碼如下:
result = requests.post(url=url, data=data, headers=headers, cookies=jar)
session = requests.Session()
r2 = session.post(url=url, data=data, headers=headers, cookies=jar)
print(r2.status_code)
這里,我們將上面的Cookie代碼改一改即可,
使用代理
對于requests庫來說,使用代理非常簡單,因為get與post函式都有一個proxies引數,用于設定代理即可,示例如下:
import requests
url = "https://www.csdn.net/"
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}
proxies = {
'http': 'http://183.47.138.80:8888',
'http': 'http://125.78.226.217:8888'
}
result = requests.post(url=url, proxies=proxies)
需要注意的是,這里的代理IP博主測驗的時候是有效的,但讀者可能讀到的時候已經失效,讀者可以自己去網路搜尋免費的代理測驗,
除了基本的HTTP代理,Request還支持SOCKS協議的代理,這是一個可選的功能,若要使用,需要使用下面的命令安裝第三方庫,
pip install requests[socks]
安裝完成之后,替換proxies即可,
proxies = {
'http': 'socks5://user:pass@host:port',
'https': 'socks5://user:pass@host:port'
}
身份驗證
requests庫還提供了身份驗證功能,其中,get與post方法有一個auth引數專門用于身份驗證,傳入的引數是HTTPBasicAuth,示例代碼如下:
import requests
from requests.auth import HTTPBasicAuth
url = "https://www.csdn.net/"
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}
result = requests.post(url=url, auth=HTTPBasicAuth('name', 'password'))
print(result.status_code)
這里,只是給讀者展示如何通過代碼進行身份驗證,如果你自己撰寫服務器,可以通過如上代碼進行操作,這里就不撰寫了,
打包請求
不管是上面的get請求還是post請求,我們都是通過requests.get或者requests.post進行操作的,但其實我們可以將請求引數單獨列出來打包,
也就是,俗稱的封裝,示例代碼如下所示:
import requests
url = "https://www.csdn.net/"
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}
req = requests.Request('get', url=url, headers=headers)
session = requests.Session()
prepared = session.prepare_request(req)
result = session.send(prepared)
print(result.text)
這里,通過Request進行封裝請求資料,然后呼叫Session的prepare_request方法處理Request物件,并回傳一個requests.models.Response物件,
最后,通過Session.send方法發送Response物件,
SLL證書驗證
在requests請求中,有一個verify的引數,訪問HTTPS時,如果需要驗證SSL證書,可以不設定改資料,它默認為True表示驗證證書,
如果不需要驗證證書,可以設定verify等于False,那么就不會進行驗證,驗證的代碼很簡單,就是什么也不用做即可,代碼如下:
import requests
try:
url = "https://www.csdn.net/"
result = requests.get(url)
print(result.status_code)
except requests.exceptions.SSLError as e:
print(e.args[0])
如果你的網站沒有SLL證書,或者證書未經過權威機構認證,則會拋出SSLError例外,
如果你的網站有SLL證書,且經過了權威的認證,那么就不會拋出例外,
而如果你不想驗證證書的話,可以將代碼修改未如下代碼:
import requests
try:
urllib3.disable_warnings()
url = "https://www.csdn.net/"
result = requests.get(url, verify=False)
print(result.status_code)
except requests.exceptions.SSLError as e:
print(e.args[0])
不過,它會報InsecureRequestWarning警告資訊,如果需要禁止輸出警告資訊,可以使用urllib3.disable_warnings()進行屏蔽,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/289297.html
標籤:python
