首頁 > 軟體

Python爬蟲Requests庫的使用詳情

2022-08-16 18:02:10

一、Requests庫的7個主要的方法

1.request()

構造請求,支撐以下的基礎方法

2.get()

獲取HTML頁面的主要方法,對應於http的get

3.head()

獲取HTML頁面的頭部資訊的主要方法,對應於http的head

 

-​​以很少的流量獲取索要資訊的概要內容​

4.post()

向HTML提交post請求的方法,對應於http的post

 

-​​向URLpost一個字典將自動編碼為form(表單)​

 

-​​向URLpost一個字串自動編碼為data​

5.put()

向HTML提交put請求的方法,對應於http的put

6.patch()

向HTML提交區域性修改的請求,對應於http的patch

7.delete()

向HTML提交刪除請求,對應於http的delete

以下程式碼是描述的request方法中的13個控制存取引數:

import requests

# **kwargs:控制存取的引數,均為可選項,不僅僅是針對request,其他六中方法依舊適用

# params:字典或位元組序列,作為引數增加到URL中,可以通過該引數篩選資料
kv = {"key1":"value1","key2":"value2"}
r = requests.request('GET','http://python123.io/ws',params=kv)
print(r.url)
# https://python123.io//ws?key1=value1&key2=value2

# data:字典、位元組序列或檔案物件,作為Request的內容;提交時,作為資料內容新增到當前的連線下
kv = {"key1":"value1","key2":"value2"}
r = requests.request('POST','http://python123.io/ws',params=kv)
body = '主體內容'
r = requests.request('POST','http://python123.io/ws',params=body)

# json:JSON格式的資料,作為Request的內容
kv = {"key1":"value1"}
r = requests.request('POST','http://python123.io/ws',json=kv)

# headers:字典,HTTP客製化頭,模擬需要的瀏覽器來進行存取
hd = {"user-agent":"Chrome/10"}
r = requests.request('POST','http://python123.io/ws',headers=hd)

# cookies:字典或CookieJar,Request中的cookie
# auth:元組,支援HTTP認證功能
# files:字典型別,傳輸檔案;將某個檔案提交到連線上
fs = {"file":open('data.xls','rb')}
r = requests.request('POST','http://python123.io/ws',file=fs)

# timeout:設定超時時間,秒為單位;在規定的時間內沒有接收到響應將會顯示timeout異常
r = requests.request('POST','http://www.baidu.com',timeout=10)

# proxies:字典型別,設定存取代理伺服器,可以增加登入認證
pxs = {'http':'http://user:pass@10.10.10.1:1234', #當我們進入HTTP協定的網站時增加登入認證
'https':'https://10.10.10.1.4321' } #當我們進入HTTPS協定的網站時,直接使用代理伺服器的IP地址;可以有效掩蓋爬蟲的原IP地址
r = requests.request('GET','http://python123.io/ws',proxies=pxs)

# allow_redirects:True/False,預設為True,重定向開關
# stream:True/False,預設為True,獲取內容立刻下載的開關
# verify:True/False,預設為True,認證SSL證書開關
# cert:本地SSL證書路徑

二、Response物件的屬性

status_code

HTTP請求的返回狀態碼,200表示成功,400表示失敗

text

HTTP響應內容的字串形式,即URL對應的頁面內容

encoding

從HTTPheader中猜測的響應內容編碼方式

 

-​​如果header中不存在charset,則認為編碼是ISO-8859-1​

apparent_encoding

從內容中分析出的響應內容編碼方式(備選編碼方式)

 

-​​從內容中分析出可能的編碼形式​

content

HTTP響應內容的二進位制形式

import requests

#構造一個向伺服器請求資源的Response物件
r = requests.get(url="http://www.baidu.com")

print(r.status_code) #列印請求狀態碼
#200
print(type(r)) #列印請求物件型別
#<class 'requests.models.Response'>
print(r.headers) #列印請求物件的頭部資訊
#{'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Sat, 27 Jun 2020 09:03:41 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:27:32 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}

print(r.text)
print(r.encoding) #ISO-8859-1
print(r.apparent_encoding) #備用編碼utf-8
r.encoding = "utf-8"
print(r.text)

直接解析會出現亂碼,將字元設為apparent_encoding時會結局問題。

三、爬取網頁通用程式碼

try:
r = requests.get(url,timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return "產生異常!"

作用:r.raise_for_status()函數判斷當前請求返回狀態碼,當返回狀態碼不為200時,產生異常並能夠被except捕獲

import requests

# (定義方法)封裝函數
def getHTMLText(url):
try:
r = requests.get(url,timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return "程式碼錯誤,產生異常!"

if __name__ =="__main__":
url = "http://www.baidu.com"
print(getHTMLText(url)) #正常顯示爬取的頁面資訊

if __name__ =="__main__":
url = "www.baidu.com" #缺失了
print(getHTMLText(url)) #程式碼錯誤,產生異常!

四、Resquests庫的常見異常

requests.ConnectionError

網路連線錯誤異常,如DNS查詢失敗、拒絕連線等

requests.HTTPError

HTTP錯誤異常

requests.URLRequired

URL缺失異常

requests.TooManyRedirects

超過最大重定向次數,產生重定向異常

requests.ConnectTimeout

連線遠端伺服器超時異常

requests.Timeout

請求URL超時,產生超時異常

五、Robots協定展示

import requests
# (定義方法)封裝函數
def getHTMLText(url):
try:
r = requests.get(url,timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return "程式碼錯誤,產生異常!"

if __name__ =="__main__":
url = "http://www.baidu.com/robots.txt"
print(getHTMLText(url)) #正常顯示爬取的頁面資訊,顯示出robots協定對於不同型別爬蟲的限制

六、案例展示

1.爬取京東商品資訊

在爬取後,我們發現在控制檯中返回了帶有login?的一個href,並沒有具體的資訊內容。但是在爬取主頁時,可以直接獲取主頁具體資訊。個人認為是由於無法識別是否已經登陸而導致的,後續學習中會跟進知識點及解決方法。(若有大佬會的,感謝評論!)

2.爬取網上圖片並儲存

import requests
import os

url = "http://image.ngchina.com.cn/2019/0523/20190523103156143.jpg"
root = "F:/圖片/" #根目錄
path = root + url.split('/')[-1] #以最後一個/後的文字命名
try:
if not os.path.exists(root): #如果不存在根目錄檔案,則建立根目錄資料夾
os.mkdir(root) #該方法只能建立一級目錄,如要建立多層,可以遍歷迴圈建立
if not os.path.exists(path):
r = requests.get(url)
with open(path,'wb') as f:
f.write(r.content) #r.content返回的是2進位制編碼,將其寫入
f.close()
print("檔案已成功儲存!")
else:
print("檔案已存在~")
except:
print("爬取失敗!!!")

到此這篇關於Python爬蟲Requests庫的使用詳情的文章就介紹到這了,更多相關Python Requests庫內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com