Python爬蟲(2):Coursera抓站小結

發表於2016-08-01

繼豆瓣抓站後再對Coursera下手

系統:Mac OS X 10.10.1
編輯器: Sublime Text2
Python版本: 2.7.8
模組依賴: import sys, string, re, random, urllib, urllib2, cookielib, getpass(均為系統內的模組)


0. 抓站小結

0.1. cookie處理

需要進行登陸的時候, 要進行cookie的處理,使用以下方法

0.2. 表單處理

某些網站需要進行賬戶和密碼登陸, 需要使用POST方法向伺服器傳送賬戶和密碼錶單資料, 這裡就需要模擬登陸.

如何獲取表單資料的格式呢?

通過谷歌瀏覽器開發者工具中Network鎖定請求頭部和post發出的表單資料,偽裝表單資料

當由於Method太多, 找不到POST提交登入請求Method方法的時候, 可以嘗試使用錯誤密碼, 這樣就可以容易的找POST方法對應的頭部.

找到POST方法

找到POST方法

表單處理

表單處理

0.3. 防盜鏈和偽裝成瀏覽器訪問

防盜鏈就是需要在請求的頭部加入Referer欄位, Referer 指的是HTTP頭部的一個欄位, 用來表示從哪兒連結到目前的網頁,採用的格式是URL。換句話說,藉著 HTTP Referer 頭部網頁可以檢查訪客從哪裡而來,這也常被用來對付偽造的跨網站請求。

偽裝成瀏覽器就是將User-Agent設定為瀏覽器的欄位

偽裝頭部

偽裝頭部

1. 偽裝頭部

使用谷歌瀏覽器自帶的開發者工具, 選擇Network(Element用來檢視網站原始碼等功能), 獲取詳細的GET和POST方法, 從中獲取登入請求的的頭部資訊,
從POST中獲得Headers資訊如下(省略部分不重要資訊)

這樣就能寫出模擬頭部的函式

試了幾次竟然都是400錯誤, 也就是頭部請求的格式不正確, 通過多次Headers檢視, 發現有下面四處不同的頭部

通過放上搜尋找到了解決方案, coursera的請求頭部中X-CSRF2-Token和X-CSRFToken是完全隨機的, X-CSRF2-Cookie後八位是隨機生成的, 都是由字母和數字隨機生成的.

於是修改程式碼如下:

2. 模擬登陸

登陸coursra的下載頁面時計算機組成視訊下載, 會發現是要求登陸呢, 這時候就使用cookielib模組進行cookie的處理

這個函式用於模擬登陸, 並顯示登陸成功或者失敗

3. 抓取下載連結

抓取連結通過正規表示式, 主要匹配PDF下載連結和MP4視訊下載連結

使用re.findall()函式進行函式匹配

4. 寫入完本

既然已經匹配了所有的連結, 這一步就是將連結寫入到檔案中

5. 登陸呼叫

使用getpass模組中的getpass()輸入密碼, 使用這個函式輸入密碼的時候不會顯示任何字元, 貌似體驗不好, 下次修改一下, 然後命令列傳入下載課程的引數.

通過比較每門課下載頁面, 發現之後/lecture前的這個欄位是不同的,這樣可以設定通過命令列傳入這這個引數
https://class.coursera.org/pkuco-001/lecture
https://class.coursera.org/electromagnetism-001/lecture

這裡在執行命令列只需要傳入pkuco-001或者electromagnetism-001這種欄位

6. 下載指令碼

下載可以使用curl, Mac下安裝方法

編寫下載使用的Python指令碼, 編寫成功後, 修改指令碼檔案的檔案許可權

執行下載指令碼

下面是我自己編寫的簡單的下載指令碼

7.完整程式碼檢視

Github完整程式碼

相關文章