一句話歸納本文:html
本節講解Requests庫的常見使用,以及一個實戰項目: 扒取某一篇微信文章裏全部的圖片,視頻,音頻 尤爲在扒取視頻和音頻的時候思考很是好玩~python
配圖:順道給涼了的大A站上香:git
引言:github
剛學爬蟲沒多久的時候就知道requests這個HTTP庫了,不過 由於本身以爲學習新的庫須要必定的時間成本,並且自帶的 urllib寫寫小爬蟲夠用,就沒去深刻學,在寫上一節的 時候評論有人就提到了requests,除了那個Referer的坑 外,在使用urllib的時候就遇到一些很繁瑣的東西了, 舉幾個例子:chrome
還有一點urllib默認不支持壓縮,要返回壓縮格式,必須在 請求頭裏寫明 accept-encoding,而後獲取返回數據時要在 響應頭裏是否有accept-encoding以此判斷是否須要解碼, 很是繁瑣...json
固然你能夠本身對urllib進行一些經常使用的封裝,以此規避此類 問題。恰逢前幾天,看到我妹蹲在電腦前在呆呆地重複作些 什麼事情,好奇的問了下她:api
我妹:瀏覽器
保存微信文章裏的圖片,音頻,視頻啊,寫公司的文章要用到。bash
我:這麼呆???微信
是的,她就這樣重複每一篇文章:
右鍵圖片保存,視頻打開chrome f12找到flash裏的視頻連接, 而後再發到v.ranks.xin/解析,獲得下載的url,再進行下載 做爲技術宅的歐尼醬,確定要寫個小腳原本幫她脫離這種 重複性的勞動,做爲交換條件,她須要打掃一週衛生。
因此就有了這個實戰例子~ (PS:某寶上有這樣的工具,居然賣10塊錢,還有人買,2333)
(本節只講述經常使用的姿式,更多內容可到官方文檔中翻閱~)
做者:Kenneth Reitz Gayhub地址:github.com/kennethreit… 官方倉庫:github.com/requests/re… 官方文檔:www.python-requests.org/en/master/
Feature Support:
有些聽都聽不懂,感受很牛逼的樣子,不方,跟着小豬擼一遍就好~ 先經過 pip install request 安裝一波庫,而後就能夠開始玩了!
# 1.支持各類請求方式:GET,POST,PUT,DELETE,HEAD,OPTION
r1 = requests.get("http://xxx", params={"x": 1, "y": 2})
r2 = requests.post("http://xxx", data={"x": 1, "y": 2})
r3 = requests.put("http://xxx")
r4 = requests.delete("http://xxx")
r5 = requests.head("http://xxx")
r6 = requests.options("http://xxx")
複製代碼
注意:
json
**參數傳遞dict,自動會把dict轉換爲json字符串!file
**參數,如post(url, files={'file': open('report.xls', 'rb')})請求的相關設置:
headers
={'xxx':'yyy'}proxies
={'https':'xxx'}timeout
=15處理返回結果
注:由requests發起的請求,當相應內容通過gzip或deflate壓縮時, requests會自動解包,能夠得到經過content得到byte方式的響應結果。
status_code
:獲取狀態碼reason
:狀態信息url
:獲取請求的urlcontent
: 獲取byte類型的返回結果,至關於urllib.urlopen().read;raw
:得到原始的返回結果,請求裏須要設置**stream=True
**;text
:獲取str類型的返回結果,會自動根據響應頭部的字符編碼進行解碼; 能夠調用r.encoding
得到編碼方式,或者在調text以前先r.encoding='編碼' 設置編碼類型,text就會按照對應的編碼進行解析;json
:解析序列化爲JSON格式的數據,直接就能夠['xxx']拿數據了, 若是解析錯誤會拋出異常:ValueError: No JSON object could be decoded除此以外還能夠調用headers得到響應頭好比:
r = requests.get('http://gank.io/api/data/福利/50/1')
# 直接根據鍵得到值
print(r.headers.get('Date'))
# 遍歷得到請求頭裏全部鍵值
for key, value in r.headers.items():
print(key + " : " + value)
複製代碼
若是是想獲取請求頭信息的話:調用r.request.headers
就能夠獲取了。 除此以外還有raise_for_status()
,當響應碼不是200的時候,會拋出 HTTPError異常,可用於響應碼校驗;
Cookie:
經過r.cookies
便可得到RequestsCookieJar對象,行爲與字典相似; 若是想帶着cookies去訪問,能夠在請求裏添加**cookies=
{'xxx':'yyy'}參數; 也能夠經過requests.cookies.RequestsCookieJar()**調用set方法進行構造, 好比:jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere'),能夠調用下述方法遍歷cookies:
for c in r.cookies:
print(c.name + ":" + c.value)
複製代碼
附:CookieJar與字典間的互轉
# 字典 -> CookieJar
cookies = requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True)
# CookieJar-> 字典
cookies = requests.utils.dict_from_cookiejar(r.cookies)
複製代碼
重定向與請求歷史:
除了HEAD請求,Requests會自動處理全部重定向,能夠在執行請求的時候 使用**allow_redirects=False
禁止重定向,能夠調用history
**函數追蹤請求 歷史,一個Response對象的列表,按照最老到最近的請求進行排序。
錯誤與異常:
注:Requests 顯式拋出 的異常都繼承自requests.exceptions.RequestException
ConnectionError
**異常Timeout
**異常TooManyRedirects
**異常Session會話對象:
用於跨請求保持一些參數,最多見的就是保留cookies, Session對象還提供了Cookie持久化和鏈接池功能,
s = request.Session() # 創建會話
s.post('http://xxx.login',data={'xx':'xx'}) # 登陸網址
s.get('http://xxx.user') # 登陸後才能訪問的網址
s.close() # 關閉會話
複製代碼
推理分析環節:
隨手打開一個微信連接:mp.weixin.qq.com/s/JHioeDcop…
能夠經過下面這段代碼拿到:
而後呢,圖片多是PNG,JPEG或者GIF,觀察data-src能夠看到: 尾部有個wx_fmt=jpeg,**split['='][-1]**就能拿到文件格式,圖片名的 話:url.split("/")[-2],就有了這樣一段下載圖片的代碼:
這個就須要取巧了,直接看網頁結構的話:
src裏的連接粘貼賦值是不能打開的,這個mpvoice貌似是採用的是 js渲染模塊方案,安卓狗表示不知道是什麼,有興趣的能夠看下這篇 文章:m.dian321.com/keji/117479… 感受一時半夥也找不出規則,要不走一波手機抓包?
嘖嘖,原來就這麼簡單,全部只須要拿到mediaid就能夠啦, 而恰好就是voice_encode_fileid屬性,而後音頻名就直接用 時間戳.mp3的格式來命名把,因此有了下面兩段代碼:
這個就很差搞了,內嵌在iframe裏,貌似是一個flash播放器
複製了下url,網頁從新打開:
一樣是拿不到,手機抓一波包?
看到vkey這麼長,猜都猜到是加密後的東西了,要去推敲不知 得花到何年何月了,有沒有什麼取巧的辦法呢?對了,差點忘 了我妹用的那個視頻連接獲取網站 [http://v.ranks.xin/] 22了
貼視頻地址,而後解析視頻,就能夠獲得可下載的視頻超連接了, 把前面那個src的連接貼下,清下chrome解析那裏,而後準備抓包, 點下解析後,能夠看到發出了一個這樣的請求:
點開,咦,這不是上一節咱們剛瞭解的Ajax動態加載技術嗎?
一點不方,還有點雞凍,(≧▽≦)/ 看下Preview,喲喲,這難道是咱們想要的超連接?
複製粘貼,右鍵看下可否另存爲?
穩如狗,接着就來一波解析,還有下載視頻的代碼咯:
核心的東西就這些啦,接着就簡單了,寫一個無限While循環, 而後獲取用戶的輸入,而後輸入Q直接exit()就能夠了~
隨手試兩篇文章,運行結果:
能夠,很Gay,都抓到了,美滋滋~ 另外若是出現Max retries exceeded with url這樣的異常,可能就是 你的requests庫太舊了,能夠走一波:pip install --upgrade requests 進行升級。
腳本是有了,你也不可能在我妹電腦上裝個Python環境吧? 能夠經過pyinstaller來生成一波exe文件,而後就能夠在我 妹的渣渣win本上運行了。
鍵入:pip install pyinstaller,安裝pyinstaller
新建一個文件夾,而後把咱們的腳本拷進去,咱們還能夠弄個應用圖標:
接着命令行走一波:
pyinstaller -F -i wechat.ico CatchWeChatRes.py
複製代碼
執行成功後能看到文件夾下多了幾個文件:
若是正常生成了exe文件的話,是能夠在dist目錄下找到的。
雙擊執行,貼個文章的url:
成功下載到本地,沒毛病~
Tips:
-i 是可選參數,表明有錯誤也繼續執行 -w 若是不須要命令行,能夠加上-w
編譯中途出現過這個錯誤:
執行不了腳本,後來發現是手多在文件裏import了無關模塊,刪掉就能夠了;
原本昨天就應該寫完了,由於公司搬家的緣由,還有由於太冷 起不了牀的緣由,拖到下午才補完,尷尬~
後面會學Python裏自帶的圖形化模塊Tkinter,到時再拼湊一個 簡單的圖形化界面界面吧~
本節源碼下載
來啊,Py交易啊
想加羣一塊兒學習Py的能夠加下,智障機器人小Pig,驗證信息裏包含: Python,python,py,Py,加羣,交易,屁眼 中的一個關鍵詞便可經過;
驗證經過後回覆 加羣 便可得到加羣連接(不要把機器人玩壞了!!!)~~~ 歡迎各類像我同樣的Py初學者,Py大神加入,一塊兒愉快地交流學♂習,van♂轉py。