python日記——網絡爬蟲之requests庫
- 網絡爬蟲與信息提取流程圖
- HTTP協議
1、HTTP,Hypertext Transfer Protocol,超文本傳輸協議,HTTP是一個基於“請求與響應”模式的、無狀態的應用層協議,HTTP協議採用URL作爲定位網絡資源的標識,URL格式如下:http://host[:port][path]
host: 合法的Internet主機域名或IP地址
port: 端口號,缺省端口爲80
path: 請求資源的路徑
2、HTTP協議對資源的操作:
- Requests庫入門
1、Requests庫的七個主要方法:
requests.request(method, url, *kwargs) 方法是requests庫其餘六個方法的基礎,它們都是通過requests.request()封裝而成,因此,掌握requests.request()方法便可以掌握其餘六種方法:
∙ method : 請求方式,對應get/put/post等7種
∙ url : 擬獲取頁面的url鏈接
∙ *kwargs: 控制訪問的參數,共13個
(1)params : 字典或字節序列,作爲參數增加到url中
(2)data : 字典、字節序列或文件對象,作爲Request的內容
(3)json : JSON格式的數據,作爲Request的內容
(4)headers : 字典,HTTP定製頭
(5)cookies : 字典或CookieJar,Request中的cookie
(6)auth : 元組,支持HTTP認證功能
(7)files : 字典類型,傳輸文件
(8)timeout : 設定超時時間,秒爲單位
(9)proxies : 字典類型,設定訪問代理服務器,可以增加登錄認證
(10)allow_redirects : True/False,默認爲True,重定向開關
(11)stream : True/False,默認爲True,獲取內容立即下載開關
(12)verify : True/False,默認爲True,認證SSL證書開關
(13)cert : 本地SSL證書路徑
2、Requests庫的2個重要對象:
Response對象的屬性:
注意:
r.encoding:如果header中不存在charset,則認爲編碼爲ISO‐8859‐1,r.text根據r.encoding顯示網頁內容;
r.apparent_encoding:根據網頁內容分析出的編碼方式,可以看作是r.encoding的備選。
3、爬取網頁的通用代碼框架:
網絡連接有風險,異常處理很重要
(1)理解Requests庫的異常:
r.raise_for_status()在方法內部判斷r.status_code是否等於200,不需要
增加額外的if語句,該語句便於利用try‐except進行異常處理
(2)通用代碼框架:
- 網絡爬蟲的“盜亦有道”
1、網絡爬蟲的尺寸:
2、網絡爬蟲引發的問題:
性能騷擾、法律風險、隱私泄露
3、網站如何限制網絡爬蟲:
(1)來源審查:判斷User‐Agent進行限制
檢查來訪HTTP協議頭的User‐Agent域,只響應瀏覽器或友好爬蟲的訪問
(2)發佈公告:Robots協議
作用:網站告知網絡爬蟲哪些頁面可以抓取,哪些不行
形式:在網站根目錄下的robots.txt文件
- 爬蟲案例:
1、入門案例
import requests as rq
url = 'https://www.baidu.com/'
try:
r = rq.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[0:500])
except:
print("發生異常!")
2、修改頭部信息隱藏自身,防止被ban
kv = {'user-agent':'Mozilla/5.0'}
r = rq.get(url,header=kv)
3、根據url接口傳入對應參數
百度的關鍵詞接口:
http://www.baidu.com/s?wd=keyword
360的關鍵詞接口:
http://www.so.com/s?q=keyword
kv = {'wd':'python'}
r = rq.get(url,params=kv)
4、圖片抓取:
import requests as rq
import os
url = 'http://image.nationalgeographic.com.cn/2017/0211/20170211061910157.jpg'
path = 'D://Temp//abc.jpg'
try:
r = rq.get(url)
r.raise_for_status()
with open(path,'wb') as f:
f.write(r.content)#圖片以二進制形式保存
f.close()
print("文件保存成功!")
except:
print("發生異常!")
本文部分內容參考於北京理工大學嵩天老師相關課程