筆者最近的功課之一是需要撈一個已經下線的網站內容, 所以首先要從網路上的頁面庫存下手 cachedpages; 順帶一提, 撰寫爬蟲撈取資料的人很多, 一種使用 cached page 的方式是因為目標網站會 ban 掉一些 (惡意?) 造成頻寬、系統負擔問題的連續需求發送端, 所以轉而向 cached page 著手。
這裡因為 google 的頁面庫存保留時間過短, 所以實作上僅對 https://archive.org/web/ 做查詢, 用來幫助蒐集仍存留在 cached page server 上的網址有哪些, 使用方式如下。(當然更辛苦的是針對這些不同時期 mirror 下來的頁面內容做 parsing T.T)
python CachedPageSeedFinder.py domain <domain> [--output=<ofname>] [--input=<dfname>] [--ignore=<list>]
Options:
-h --help
Show this screen.--version
Show version.--output=<ofname>
Output all links to a file--ignore=<list>
Ignore url with filter list. Split input use separator ','. ex. --ignore=key1,key2--history
Get whole domain link with all history--debugfile=<dfname>
Debug only. Test parse link function use an input file.
實作的內容很簡單, 先是對 cached page server 送出 query 的網址查詢後, 將回傳的內容做解析撈出網址即可, 算是簡易的 crawler, 有興趣可以直接參考 Github Source。
使用到的 python module
- docopt 提供命令列解析的工具
- requests 用來對 server 發送 request
- bs4 (BeautifulSoup 4) 用來解析 html 的內容
題外話
- 在功能實作上是不需要使用到 docopt, 但無意間看到介紹的相關文章, 也就用來當作練習的一部份。
- 後續要進行大量的解析這些不同時期殘留的庫存頁面、以及圖片的抓取, 已經改用 scrapy 的框架來實作, 主要是對於大量需要花時間的 io (Internet 連線) 工作, 單一循序的執行等待過於費時, 透過 scrapy 能同時進行多個非同步的 request 達到改善, 另外在 html 的解析上也改用 lxml (理由是依據 StackOverflow 上 效能的評估)。