第二章 網絡爬蟲之規則(Requests篇)
●Requests庫入門
- 特點:簡單、簡潔,一行代碼即可從網站上擷取資源。
- 安裝方法:CMD視窗->pip install requests
- Requests庫的主要方法:
1、requsets.request()方法
使用格式:requests. request(method, url, **kwargs)
-method:請求方式,對應HTTP協定GET PUT/POST等7種請求功能
-url:拟擷取頁面的url連結
-kwargs:控制通路的參數,共13個,均為可選項
**kwargs參數:
1)params:字典或位元組序列,作為參數增加到url中,帶入參數通路url;
>>> kv ={'key1':'valuel','key2':'value2'}
>>> r=requests.request('GET','http://python123.io/ws',params=kv)
>>> print(r.url)
https://python123.io/ws?key1=valuel&key2=value2
2)data:字典、位元組序列或檔案對象,作為 Request的内容,向伺服器提供、送出資源時使用;
>>> kv ={'key1':'valuel','key2':'value2'}
>>> r=requests.request('POST','http://python123.io/ws',data=kv)
>>> body = '主題内容'
>>> r=requests.request('POST','http://python123.io/ws',data=body)
3)json:JSON格式的資料,作為Request的內容;
>>> kv ={'key1':'valuel','key2':'value2'}
>>> r=requests.request('POST','http://python123.io/ws',json=kv)
4)headers:字典,HTTP定制頭,通路HTTP協定頭;
>>> hd={'user-agent':'Chrome/10'}
>>> r=requests.request('POST','http://python123.io/ws',headers=hd)
5)cookies:字典或 CookieJar,Request中的 cookie;
6)auth:元組,支援HTTP認證功能;
7)files:字典類型,傳輸檔案,向連結送出檔案;
>>>fs={'file':open('data.xls','rb')}
>>> r=requests.request('POST','http://python123.io/ws',files=fs)
8)timeout:設定逾時時間,秒為機關,時間内請求内容未回報,生成timeout異常;
9)proxies:字典類型,設定通路代理伺服器,可以增加登入認證,有效隐藏爬取網站原IP,防止逆追蹤;
>>>pxs={'http':'http://user:[email protected]:1234'
'https':'https://10.10.10.1:4321'}
>>> r=requests.request('GET','http://python123.io/ws',proxies=pxs)
10)allow_redirects:True/ False,預設為True,重定向開關;
11)stream:True/false,預設為True,擷取内容立即下載下傳開關;
12)verify:True/ False,預設為True,認證SSL證書開關;
13)cert:本地SSL證書路徑。
2、requests.get()方法
使用格式:requests.get(url, params=None, **kwargs)
-url:拟擷取頁面的ur連結
-params:url中的額外參數,字典或位元組流格式,可選
-kwargs:12個控制通路的參數,除params
實作原理:get(url)構造一個向伺服器請求資源的Request對象,傳回一個包含伺服器資源的Response對象,即Response對象包含爬蟲傳回的内容。
Response對象屬性:
r.apparent_encoding的編碼比r.encoding更加準确。
‘utf-8’編碼方式可解析中文,ISO-8859-1編碼方式不可解析中文。
3、requests.head()方法
使用格式:requests.head(url, **kwargs)
-url:拟擷取頁面的ur連結
-kwargs:13個控制通路的參數
4、requests.post()方法
使用格式:requests.post(url, data=None,json=None,**kwargs)
-url:拟更新頁面的ur連結
-data:字典、位元組序列或檔案, Request的内容
-json:JSON格式的資料, Request的内容
-kwargs:11個控制通路的參數,除data、json
5、requests.put()方法
使用格式:requests.put(url, data=None,**kwargs)
-url:拟更新頁面的ur連結
-data:字典、位元組序列或檔案, Request的内容
-kwargs:12個控制通路的參數,除data
6、requests.patch()方法
使用格式:requests.patch(url, data=None,**kwargs)
-url:拟更新頁面的ur連結
-data:字典、位元組序列或檔案, Request的内容
-kwargs:12個控制通路的參數,除data
7、requests.delete()方法
使用格式:requests.delete(url, **kwargs)
-url:拟删除頁面的ur連結
-kwargs:13個控制通路的參數
-
爬取網頁的通用代碼架構:
1、Requests庫的異常:
處理異常方法:r.raise_for_status() —如果不是200,産生異常 requests.HTTPError
2、爬取網頁的通用代碼架構:
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))
-
HTTP協定:
1、HTTP, Hypertext Transfer Protocol,超文本傳輸協定。
2、HTTP是一個基于“請求與響應”模式的、無狀态的應用層協定。
-“請求與響應”模式:使用者發送請求,伺服器做相關響應
-無狀态:第一次請求與第二次請求之間無關聯
-應用層:該協定工作在TCP協定之上
3、HTTP協定采用URL作為定位網絡資源的辨別。
1) URL格式:http://host[:port][path]
-host:合法的Internet主機域名或IP位址
-port:端口号,預設端口為80
-path:請求資源的路徑
2)URL是通過HTTP協定存取資源的Internet路徑,一個URL對應一個資料資源。
4、HTTP協定對資源的操作:
1)PUT與PATCH差別:
采用PATCH,僅向URL送出局部資料更新請求,可節省網絡帶寬。
采用PUT,必須将是以資料一并送出到URL,未送出資料被删除。
2)HEAD方法用很少的網絡流量,擷取網絡資源的概要資訊。
3)POST方法向伺服器送出新增資料,向URL POST一個字典、鍵值對自動編碼為form(表單)。
●網絡爬蟲的盜亦有道
- 網絡爬蟲的尺寸
規模 特點 開發 應用範圍 小規模 資料量小,爬取速度不敏感 Requests庫 爬取網頁,玩轉網頁 中規模 資料規模較大,爬取速度敏感 Scrapy庫 爬取網頁,爬取系列網站 大規模 搜尋引擎,爬取速度關鍵 定制開發 爬取全網 -
爬蟲引起的問題
1)網絡爬蟲的“騷擾”:受限于編寫水準和目的,網絡爬蟲将會為web伺服器帶來巨大的資源開銷;
2)網絡爬蟲的法律風險:伺服器上的資料有産權歸屬,網絡爬蟲擷取資料後牟利将帶來法律風險;
3)網絡爬蟲洩露隐私:網絡爬蟲可能具備突破簡單通路控制的能力,獲得被保護資料進而洩露個人隐私。
-
網絡爬蟲的限制
1)來源審查:判斷User-Agent進行限制
檢查來訪HTTP協定頭的User-Agent域,隻響應浏覽器或友好爬蟲的通路。
2)釋出公告: Robots協定
告知所有爬蟲網站的爬取政策,要求爬蟲遵守。
Robots協定(Robots exclusion standard網絡爬蟲排除标準):
作用:網站告知網絡爬蟲哪些頁面可以抓取,哪些不行。
形式:在網站根目錄下的 robots.txt檔案。
基本文法: User-agent:*
Disallow:/
#注釋,*代表所有,/代表根目錄
使用:
網絡爬蟲:自動或人工識别 robots.txt,再進行內容爬取。
限制性: Robots協定是建議但非限制性,網絡爬蟲可以不遵守,但存在法律風險。遵守建議如下:
通路量很小:可以遵守;通路量較大:建議遵守 非商業且偶爾:建議遵守;商業利益:必須遵守 必須遵守 爬取網頁,玩轉網頁 爬取網頁,爬取系列網站 爬取全網
●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("爬取失敗")
- 亞馬遜商品資訊擷取(通過判斷對網站通路的App頭部headers,對網絡爬蟲限制):
import requests url="https://www.amazoncn/gp/product/bo1m8l5z3y" 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搜尋關鍵詞送出:
搜尋引擎關鍵詞送出接口,修改keyword向搜尋引擎送出關鍵詞
百度的關鍵詞接口:
http://www.baidu.com/s?wd=keyword
360的關鍵詞接囗:
http://www.so.com/s?q=keyword
import requests keyword ="Python" try: kv ={'wd': keyword} r = requests.get("http://www.baiducom/s",params=kv) print(r.request.url) r.raise_for_status() print (len(r.text)) except: print("爬取失敗")
-
網絡圖檔爬取:
網絡圖檔連結的格式:http://www.example.com/picture.jpg
import requests import os url="https://up.enterdesk.com/edpic_360_360/5c/d8/1e/5cd81eca3361148bdf4a528964a4ff9f.jpg" path = "F:\\"+url.split('/')[-1] print(path) try: if not os.path.exists(path): r = requests.get(url) print(r) with open(path, 'wb')as f: f.write(r.content) print("檔案儲存成功") f.close() else: print("檔案已存在") except: print("爬取失敗")
-
IP位址歸屬地的自動查詢:
python不具有查詢IP位址歸屬地的功能庫,通過網絡資源實作。比如:http://m.ip138.com
import requests url="http://m.ip138.com/ip.asp?ip=" try: r = requests.get(url+'202.204.80.112') r.raise_for_status() r.ncoding =r.apparent_encoding print(r.text[-500:]) except: print("爬取失敗")