爬蟲學習筆記1---------requests庫
Unit 1 : Requests庫入門 (7 * 13)
(1)、安裝 pip install requests
測試
import requests
r = requests.get("http://www.baidu.com")
r.status_code
200
r.encoding = 'utf-8'
r.text #列印內容
(2)、request庫的7個主要方法對應HTTP的7個方法
- requests.request() 構造一個請求,基礎方法
requests.request(method,url,**kwargs)
method:請求方法,對應get/put/post等7種
url
**kwargs,13個控制訪問引數:
#1、params:字典或位元組序列,能增加到URL連結裡
kv = {'key1': 'value1','key2':'value2'}
r = requests.request('GET','http://python123.io/ws', params=kv)
print(r.url)
#http://python123.io/ws?key1=value1&key2=value2
#2、data:字典、位元組序列或檔案物件,作為Request的內容
kv = {'key1': 'value1','key2':'value2'}
r = requests.request('POST','http://httpbin.org/post', data = kv)
body = '主體內容'
r = requests.request('POST','http://httpbin.org/post', data = body)
#3、json:JSON格式的資料,作為Request的內容
kv = {'key1': 'value1','key2':'value2'}
r = requests.request('POST','http://httpbin.org/post', json = kv)
#4、headers:字典,HTTP定製頭,模擬任何瀏覽器
hd = {'user-agent:'Chrome/10'}
r = requests.request('POST','http://httpbin.org/post', headers = hd)
##高階功能:
#5、cookies:字典或CookieJar,Request中的cookie
#6、auth:元組,支援HTTP認證功能
#7、file:字典型別,傳輸檔案
fs = {'file':open('data.xls','rb')}
r = requests.request('POST','http://python123.io/ws',files=fs)
#8、timeout:設定超時時間,秒為單位
r = reqquests.request('GET','http://www.baidu.com', timeout=10)
#9、proxies:字典型別,設定訪問代理伺服器,可以增加登入認證,隱藏使用者原IP地址資訊,有效的防止對爬蟲的逆追蹤。
pxs = {'http':'http://user:[email protected]:1234','https':'https://10.10.10.1:4321'}
r = requests.request('GET','http://www.baidu.com',proxies=pxs)
##高階功能開關
#10、allow_redirects: True/False,預設為True,重定向的開關
#11、stream:True/False,預設為True,獲取立即下載的開關
#12、verify:True/Falsse,預設為True,認證SSL證書的開關
#13、cert:本地SSL證書路徑
- requests.get() 最常用,獲取HTML網頁,對應HTTP的GET,其它受限
r = requests.get(url) # .get()構造 Request物件
#返回 Response物件 r
requests.get(url,params=None,**kwargs)
#原始碼都是呼叫了request方法
##Response物件
import requests
r = requests.get("http://www.baidu.com")
print(r.status_code) #200
type(r)
r.text
r.encoding #charset欄位,如果header中不存在charset,則認為編碼為ISO-8859-1
r.apparent_encoding
#替換編碼方式
r.encoding = "utf-8"
r.text
r.headers
Response物件的屬性
r.status_code 返回狀態,200成功,404……失敗
r.text 字串形式的頁面內容
r.encoding 從HTTP header 中猜測的響應內容編碼方式
r.apparent_encoding 從內容文字中分析的編碼方式(備選編碼方式)
r.content HTTP響應內容的二進位制形式
- requests.head() 獲取HTML網頁頭,對應HTTP的HEAD
requests.head(url, **kwargs)
- requests.post() 向HTML網頁提交POST請求,對應HTTP的POST
requests.post(url, data=None, json=None, **kwargs)
向URL追加一個字典:
payload = {'key1': 'value1','key2':'value2'}
r = requests.post('http://httpbin.org/post',data = payload)
print(r.text) #向url POST一個字典,自動編碼為"form"(表單)
向URL追加一個data:
r = requests.post('http://httpbin.org/post',data = "ABC")
print(r.text) #向url POST,自動編碼為data,"data"="ABC"
- requests.put() 向HTML網頁提交PUT請求,對應HTTP的PUT
可覆蓋原有資料
requests.put(url, data=None, **kwargs)
- requests.patch() 向HTML網頁提交區域性修改請求,對應HTTP的PATCH
requests.patch(url, data=None, **kwargs)
- requests.delete() 向HTML網頁提交刪除請求,對應HTTP的DELETE
requests.delete(url, **kwargs)
(3)、爬取網頁的通用程式碼框架
Request庫異常處理
- requests.ConnectionError 網路連線錯誤異常,如DNS查詢失敗、防火牆拒絕連線等
- requests.HTTPError HTTP協議層面錯誤異常
- requests.URLRequired URL缺失異常
- requests.TooManyRedirects 超過最大重定向次數,產生重定向異常,複雜連線
- requests.ConnectTimeout 連線遠端伺服器超時異常
- requests.Timeout 請求URL超時
理解Requests庫的異常
r.raise_for_status() 如果不是200,產生異常requests.HTTPError
#通用程式碼框架
import requests
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status() #如果狀態不是200,引發HTTPError異常
r.encoding = r.apparent_encoding
return r.text
except:
return "產生異常"
#測試
if __name__ == "__main__":
url = "http://www.baidu.com"
print(getHTMLText(url))
(4)、HTTP協議
HTTP,Hypertext Tranfer Protocol,超文字傳輸協議,是一個基於"請求與響應"模式的、無狀態(前後響應沒有關係)的應用層(工作在TCP協議之上)協議。
一般採用URL作為定位網路資源的標識。
URL格式 http://host[:port][path]
- host:合法的Internet主機域名或IP地址
- port:埠號,預設為80
- path:請求資源的路徑
URL的理解:
URL是通過HTTP協議存取資源的Internet路徑,一個URL對應一個數據資源。
HTTP協議對資源的操作,方法:
- GET 請求獲取URL位置的資源
- HEAD 請求獲取URL位置資源的響應訊息報告,獲得頭部資訊
- POST 請求向URL位置的資源後附加新的資料(追加)
- PUT 請求向URL位置儲存一個資源 (覆蓋)
- PATCH 改變該資源處部分內容 (修改)
- DELETE 刪除該位置儲存的資源
PUT與PATCH區別:PATCH只用修改其中一個。
Unit 2 : 網路爬蟲“盜亦有道”
網路爬蟲尺寸:
小規模,資料量小 爬取速度不敏感 Requests庫 |
中規模,資料規模較大,爬取速度敏感 Scrapy庫 |
大規模,搜尋引擎 爬取速度關鍵 定製開發 |
爬取網頁,玩轉網頁 | 爬取網站,爬取系列網站 | 爬取全網 |
網路爬蟲“騷擾”,法律風險(伺服器上的資料有產權),個人隱私洩露。
網路爬蟲的限制
- 來源審查:判斷User-Agent進行限制
-
- 檢查來訪問HTTP協議頭的User-Agent域,只響應瀏覽器或友好爬蟲的訪問。
- 釋出公告:Robots協議:
-
- 告知爬蟲策略,要求遵守
Robots 協議:在網站根目錄下的robots.txt檔案。
案例:京東(https://www.jd.com/robots.txt):
User-agent: * Disallow: /?* Disallow: /pop/*.html Disallow: /pinpai/*.html?* User-agent: EtaoSpider Disallow: / User-agent: HuihuiSpider Disallow: / User-agent: GwdangSpider Disallow: / User-agent: WochachaSpider Disallow: / |
#robots基本語法:*代表所有,/代表根目錄
User-agent:*
Disallow:/
遵守方式:
- 網路爬蟲:自動或人工識別robots.txt,再進行內容爬取。
- 約束性:可以不遵守,但存在法律風險。
Unit 3 : Requests庫網路爬蟲例項
一 、京東商品資訊爬取
import requests
url = "https://item.jd.com/2967929.html"
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[:1000])
except:
print("爬取失敗")
二、亞馬遜商品
有反爬蟲程式,需要模擬瀏覽器的headers,新增user-agent:
import requests
url = "https://www.amazon.cn/gp/product/B01M8L5Z3Y"
try:
kv = {'user-agent':'Mozilla/5.0'}
r = requests.get(url, headers = kv)
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[1000:2000]
except:
print("爬取失敗")
三、百度/360搜尋關鍵詞提交
百度的關鍵詞介面:
import requests
url = "http://www.baidu.com/s"
kv = {'wd':'python'}
try:
r = requests.get(url, params = kv)
r.raise_for_status ()
r.encoding = r.apparent_encoding
print(r.text[2000:4000])
except:
print(r.url)
print("爬取失敗")
360關鍵字介面:
import requests
url = "http://www.so.com/s"
kv = {'q':'python'}
try:
r = requests.get(url, params = kv)
r.raise_for_status ()
r.encoding = r.apparent_encoding
print(len(r.text))
except:
print(r.url)
print("爬取失敗")
四、網路圖片的爬取和儲存
www.nationalgeographic.com.cn/photography/photo_of_the_day/3921.html
import requests
import os
url = "http://image.nationalgeographic.com.cn/2017/0211/20170211061910157.jpg"
root = "D://pics//"
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)
f.close()
print("檔案儲存成功")
else:
print("檔案已經存在")
except:
print("爬取失敗")
五、IP地址歸屬地的自動查詢
http://m.ip138.com/ip.asp?ip=ipaddress
import requests
url = "http://m.ip138.com/ip.asp?ip="
try:
r = requests.get(url + '202.102.111.110')
r.raise_for_status()
r.enconding = r.apparent_encoding
print(r.text[-500:])
except:
print("爬取失敗")
總結:以爬蟲視角看待網路資源,所有對資源的操作都是通過url連結來實現的 。
注: 可看慕課或b站上 嵩天老師講的python網路爬蟲與資訊提取課程