【 爬蟲】Requests 庫的入門學習
此為北理嵩天老師mooc課程【網路爬蟲與資訊提取】的課程學習筆記,附帶一些其他書籍部落格的資料。
1、安裝 Requests 庫
使用命令列輸入:
pip install requests
或者:
python -m pip install requests
2 、requests 的常用方法
方法名稱 | 說明 |
---|---|
requests.request() | 最基礎的,構造請求,支撐其他方法的使用 |
.get() | 獲取 html 網頁的主要方法,對應GET |
.head() | 獲取html網頁頭資訊,對應HEAD |
.post() | 向html網頁提交post請求 |
.put() | 向網頁提交PUT請求 |
.patch | 向網頁提交區域性修改的請求 |
.delete() | 向網頁提交刪除的請求 |
requests.requests()為基礎方法
request.requests(method, url, **kwargs)
- method包含上述的get/put/post/options 等七種方法
- url為獲取頁面的連結
- **kwargs 為控制訪問的引數,共13個,可自主按需選擇
- params :字典或位元組序列,可以作為 引數 加入到url中
- data :物件,作為request的對應內容
- json:JSON格式的資料,作為Request的內容
- headers :字典,http定製的頭 欄位
- cookies :request中的cookie
- files :字典,向連結傳輸檔案
- auth :元祖,認證http功能
- timeout :設定超時時間,秒為單位
- proxies :字典型別,可以設定訪問的代理伺服器
- allow_redirects :開關,允許不允許重定向
- stream :檔案下不下載,預設下載
- verify :認證ssl
- cert :本地ssl路徑
具體說明可以轉到函式定義去檢視。
獲取資料可以使用head和get, head方法獲取的資訊頭部、即為摘要。get為全部資訊,內容詳細
傳送修改可以使用post、patch、put等方法。
r = requests.post(url,data = “”ABC“”)
patch 和 put的區別在於patch可以只提交需要更新的資料,而put需要將所有欄位資料重新提交,不更改的會被刪除。
post向url內容新增指定的表單、data等
r = requests.post(url,data = '字串"或字典鍵值對等)
get方法
構造向伺服器請求資源的requests物件,返回的的為response物件,包含各種資訊。
requests.get(url, params=None, **kwargs)
包含頁面連結、URL額外引數字典或位元組流格式、其他訪問控制可選引數。
Response 返回的常見屬性:非函式無()
屬性名稱 | 說明 |
---|---|
r.status_code | Http 請求的返回狀態,200成,404或其他為失敗。 |
r.text | Http相應內容的字串形式,url的頁面內容 |
r.encoding | 從HTTP的header中猜測的內容編碼方式,一般不含中文 |
r.apparent_encoding | 從內容中分析出相應內容的編碼方式,便於解析出中文 |
r.content | HTTP相應內容的二進位制形式 |
連線異常
常用的requests庫的異常,注意不是函式,無()
異常內容 | 說明 |
---|---|
requests.ConnectionError | 網路連線異常,dns查詢失敗,伺服器防火牆拒絕連線 |
requests.HTTPError | Http錯誤異常 |
requests.URLRequired | URL缺失異常 |
requests.TooManyRedirects | 使用者訪問url重定向次數過多 |
requests.ConnectTimeout | 僅指與遠端伺服器連線時的超時異常 |
requests.Timeout | 發起到獲得URL整個過程的超時異常 |
判斷返回的response型別的狀態是不是200,如果返回的不是200說明有錯誤,在程式中產生requests.HTTPError異常
r.raise_for_status()
3、網頁爬取
爬取網頁的通用程式碼框架:
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 = "https://www.csdn.net/"
print(getHTMLText(url))
示例3.1
爬取網頁時網站可以通過robots.txt和識別requests請求的header規範、約束爬蟲訪問。所以有些網站會識別你的requests請求,如果其中的headers為python相關時可能報錯、無法獲取資訊。此時人為構造鍵值對,改變使用者屬性
狀態碼503 說明訪問異常。
修改User-Agent 模擬為瀏覽器身份表示。加入到原來headers中,再去訪問。
kv = {"User-Agent":"Mozilla/5.0"}
url = "https://www.amazon.cn/dp/0545377579/ref=cngwdyfloorv2_recs_0/461-7699818-3098529?pf_rd_m=A1AJ19PSB66TGU&pf_rd_s=desktop-2&pf_rd_r=R9180B92B8TKWZC9QP4M&pf_rd_r=R9180B92B8TKWZC9QP4M&pf_rd_t=36701&pf_rd_p=db4e96ef-5fc1-47f8-92b2-b9a5e737b326&pf_rd_p=db4e96ef-5fc1-47f8-92b2-b9a5e737b326&pf_rd_i=desktop"
r = requests.get(url, headers = kv)
r.status_code
#輸出200,表示成功
示例3.2
向搜尋引擎提供關鍵詞,自動獲取檢索結果。
百度搜索的關鍵詞介面url連線為 http://www.baidu.com/s?wd=keyword
更改要搜尋的關鍵詞即可。以百度搜索CSDN為例
程式碼實現:
import requests
keyword = "CSDN"
try:
kv = {"wd":keyword}
r = requests.get("http://www.baidu.com/s",params=kv)
print(r.request.url)
r.raise_for_status()
print(len(r.text))
#輸出檢索到的內容位元組長度
except:
print("產生異常")
示例3.3
爬取網頁上的一張圖片,並儲存在電腦指定路徑內。
爬取一張帥氣的哈士奇美照。
不知道為什麼我在設定儲存的檔案路徑時資料夾層數過多就會爬取失敗,如果有大神瞭解原因,還望不吝賜教。
import requests
import os
url = "http://i.hao123.cn/attachment/info/201808/1533094309cjm12.jpg"
root = "E://pyrelat//"
#路徑資料夾層數再多一點時就報錯爬取失敗
path = root + url.split("/")[-1]
try:
if not os.path.exists(root):
os.mkdir(root)
if not os.path.exists(path):
kv = {"User-Agent": "Mozilla/5.0"}
r = requests.get(url, headers = kv)
with open(path, "wb") as f:
f.write(r.content)
f.close()
print("檔案儲存成功")
else:
print("檔案已經存在")
except:
print("爬取失敗")