此爲北理嵩天老師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("爬取失敗")