小豬的Python學習之旅 —— 10.三分鐘上手Requests庫

一句話歸納本文html

本節講解Requests庫的常見使用,以及一個實戰項目: 扒取某一篇微信文章裏全部的圖片,視頻,音頻 尤爲在扒取視頻和音頻的時候思考很是好玩~python

配圖:順道給涼了的大A站上香:git


引言github

剛學爬蟲沒多久的時候就知道requests這個HTTP庫了,不過 由於本身以爲學習新的庫須要必定的時間成本,並且自帶的 urllib寫寫小爬蟲夠用,就沒去深刻學,在寫上一節的 時候評論有人就提到了requests,除了那個Referer的坑 外,在使用urllib的時候就遇到一些很繁瑣的東西了, 舉幾個例子:chrome

  • 發送Get和Post請求
  • Cookie處理
  • 設置代理

還有一點urllib默認不支持壓縮,要返回壓縮格式,必須在 請求頭裏寫明 accept-encoding,而後獲取返回數據時要在 響應頭裏是否有accept-encoding以此判斷是否須要解碼, 很是繁瑣...json

固然你能夠本身對urllib進行一些經常使用的封裝,以此規避此類 問題。恰逢前幾天,看到我妹蹲在電腦前在呆呆地重複作些 什麼事情,好奇的問了下她:api

我妹瀏覽器

保存微信文章裏的圖片,音頻,視頻啊,寫公司的文章要用到。bash

:這麼呆???微信

是的,她就這樣重複每一篇文章:

右鍵圖片保存,視頻打開chrome f12找到flash裏的視頻連接, 而後再發到v.ranks.xin/解析,獲得下載的url,再進行下載   做爲技術宅的歐尼醬,確定要寫個小腳原本幫她脫離這種 重複性的勞動,做爲交換條件,她須要打掃一週衛生。

因此就有了這個實戰例子~ (PS:某寶上有這樣的工具,居然賣10塊錢,還有人買,2333)


1.Requests簡介

(本節只講述經常使用的姿式,更多內容可到官方文檔中翻閱~)

做者:Kenneth Reitz Gayhub地址github.com/kennethreit… 官方倉庫github.com/requests/re… 官方文檔www.python-requests.org/en/master/

Feature Support

  • International Domains and URLs —— 國際化域名和URL
  • Keep-Alive & Connection Pooling —— Keep-Alive & 鏈接池
  • Sessions with Cookie Persistence —— 帶持久Cookie的會話
  • Browser-style SSL Verification —— 瀏覽器式的SSL認證
  • Basic/Digest Authentication —— 基本/摘要式的身份認證
  • Elegant Key/Value Cookies —— 優雅的 key/value Cookie
  • Automatic Decompression —— 自動解壓
  • Automatic Content Decoding —— 自動內容解碼
  • Unicode Response Bodies —— Unicode響應體
  • Multipart File Uploads —— 文件分塊上傳
  • HTTP(S) Proxy Support —— HTTP(S)代理支持
  • Connection Timeouts —— 鏈接超時
  • Streaming Downloads —— 流下載
  • .netrc Support —— 支持.netrc
  • Chunked Requests —— Chunked請求

有些聽都聽不懂,感受很牛逼的樣子,不方,跟着小豬擼一遍就好~ 先經過 pip install request 安裝一波庫,而後就能夠開始玩了!


2.三分鐘上手requests

# 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")
複製代碼

注意

  • URL連接裏有中文會自動轉碼
  • post時若是傳遞的是一個str而不是一個dict,會直接發送出去!(好比json字符串)
  • 2.4.2版新增:能夠經過**json**參數傳遞dict,自動會把dict轉換爲json字符串!
  • post上傳文件能夠經過**file**參數,如post(url, files={'file': open('report.xls', 'rb')})

請求的相關設置

  • 請求頭headers={'xxx':'yyy'}
  • 代理proxies={'https':'xxx'}
  • 超時(單位秒)timeout=15

處理返回結果

注:由requests發起的請求,當相應內容通過gzipdeflate壓縮時, requests會自動解包,能夠得到經過content得到byte方式的響應結果。

  • status_code:獲取狀態碼
  • reason:狀態信息
  • url:獲取請求的url
  • content: 獲取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

  • 1.遇到網絡問題,會拋出**ConnectionError**異常
  • 2.請求超時,會拋出**Timeout**異常
  • 3.請求超過了設定的最大重定向次數,會拋出**TooManyRedirects**異常

Session會話對象

用於跨請求保持一些參數,最多見的就是保留cookies, Session對象還提供了Cookie持久化和鏈接池功能,

s = request.Session() # 創建會話
s.post('http://xxx.login',data={'xx':'xx'}) # 登陸網址
s.get('http://xxx.user') # 登陸後才能訪問的網址
s.close() # 關閉會話
複製代碼

3.Requests實戰:抓取微信文章的圖片與視頻

推理分析環節

隨手打開一個微信連接:mp.weixin.qq.com/s/JHioeDcop…

  • 1.標題 拿來作文件夾名字,很好拿,直接title標籤

  • 2.獲取圖片:不難發現圖片的標籤是這樣的

能夠經過下面這段代碼拿到:

而後呢,圖片多是PNG,JPEG或者GIF,觀察data-src能夠看到: 尾部有個wx_fmt=jpeg,**split['='][-1]**就能拿到文件格式,圖片名的 話:url.split("/")[-2],就有了這樣一段下載圖片的代碼:

  • 3.獲取音頻

這個就須要取巧了,直接看網頁結構的話:

src裏的連接粘貼賦值是不能打開的,這個mpvoice貌似是採用的是 js渲染模塊方案,安卓狗表示不知道是什麼,有興趣的能夠看下這篇 文章:m.dian321.com/keji/117479… 感受一時半夥也找不出規則,要不走一波手機抓包?

嘖嘖,原來就這麼簡單,全部只須要拿到mediaid就能夠啦, 而恰好就是voice_encode_fileid屬性,而後音頻名就直接用 時間戳.mp3的格式來命名把,因此有了下面兩段代碼:

  • 4.獲取視頻

這個就很差搞了,內嵌在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 進行升級。


4.使用pyinstaller生成exe文件

腳本是有了,你也不可能在我妹電腦上裝個Python環境吧? 能夠經過pyinstaller來生成一波exe文件,而後就能夠在我 妹的渣渣win本上運行了。

鍵入:pip install pyinstaller,安裝pyinstaller

新建一個文件夾,而後把咱們的腳本拷進去,咱們還能夠弄個應用圖標

接着命令行走一波:

pyinstaller -F -i wechat.ico CatchWeChatRes.py
複製代碼

執行成功後能看到文件夾下多了幾個文件:

若是正常生成了exe文件的話,是能夠在dist目錄下找到的。

雙擊執行,貼個文章的url:

成功下載到本地,沒毛病~

Tips

-i 是可選參數,表明有錯誤也繼續執行 -w 若是不須要命令行,能夠加上-w

編譯中途出現過這個錯誤:

執行不了腳本,後來發現是手多在文件裏import了無關模塊,刪掉就能夠了;


5.小結

原本昨天就應該寫完了,由於公司搬家的緣由,還有由於太冷 起不了牀的緣由,拖到下午才補完,尷尬~

後面會學Python裏自帶的圖形化模塊Tkinter,到時再拼湊一個 簡單的圖形化界面界面吧~


本節源碼下載

github.com/coder-pig/R…


來啊,Py交易啊

想加羣一塊兒學習Py的能夠加下,智障機器人小Pig,驗證信息裏包含: PythonpythonpyPy加羣交易屁眼 中的一個關鍵詞便可經過;

驗證經過後回覆 加羣 便可得到加羣連接(不要把機器人玩壞了!!!)~~~ 歡迎各類像我同樣的Py初學者,Py大神加入,一塊兒愉快地交流學♂習,van♂轉py。

相關文章
相關標籤/搜索