1.這是什么鬼?
哦?美女?
最近看了這一篇文章:http://cuiqingcai.com/1001.html
大概說的是用Python和Pyspider(這貨好像是我的一位師兄寫的,嚇尿),抓取淘寶淘女郎的所有美女照片。只是里面還要敲一堆代碼,還要用其他動態js運行框架,看着好不煩人啊。
Hawk是沙漠君開發的一款爬蟲和清洗工具,目前已經在Github開源:
https://github.com/ferventdesert/Hawk
最近沙漠君很開心啊,開發的Hawk在GitHub上上百個star,還有歪果仁來幫忙做英文國際化,哈哈哈。
那既然如此,我也用Hawk練練手,基本無需編程,直接無視動態js調用,下載高清圖片。造福各位園友。
這簡直就是用Hawk做壞事,順便炫技啊~~
2.先讓兄弟們飽飽眼福?
先看看抓取的效果,我才不直接放高清圖呢!

恩,先去下載軟件吧,在百度雲盤(這貨最近經常腦抽),如果你之前下過軟件,一定要更新Hawk開頭的dll和exe文件,其他不需要。因為勤勞的沙漠君又更新代碼了...
http://pan.baidu.com/s/1c8zBiQ 密碼:4iy0
注意三個后綴名為config和xml的配置文件一定要下載回來,之后雙擊Hawk.exe.
我已經把工程文件共享出來了。地址在:
https://github.com/ferventdesert/Hawk-Projects/tree/master/淘女郎
在Hawk菜單->文件->加載工程,把project.xml加載進來。會是下面的樣子:

然后,雙擊“主流程”(點這三個字所在的位置)
之后任務就會被加載進來,在右下角顯示所有的任務和數據表:

接下來,在算法視圖上,雙擊主流程,就可以看到這個任務的窗口和屬性配置框了:

哈哈,不僅有詳細的名字,地址,甚至還有身高體重等詳細信息,各位慢慢看。
說好的保存圖片呢?別急別急,這只是在模擬運行模式,保存圖片這種有副作用的任務是不會執行的。
那我的圖片保存在哪里了?注意看到剛才的project.xml文件同目錄下,還有主流程.py,這是一個用於配置流程的py腳本。我把一部分內容貼在下面:
#########下面是正式配置文件
#是否要抓取圖片?
get(主流程.etls,-1).Enabled=True;
#照片保存路徑
path='D:\淘女郎'
#將相冊表保存起來嗎?
get(相冊.etls,-1).Enabled=True;
#保存大圖嗎?False則只保存小圖
find(相冊.etls,lambda x:x.Name=='大圖').Enabled=True
#每個女郎最多抓取多少張照片
照片數量控制.Take=1000
find(相冊.etls,lambda x:x.Name=='圖片位置').NewValue=path;
我應該不用解釋了吧?對文件進行修改,注意編碼格式是UTF-8,然后在模塊管理卷展欄的主流程位置點右鍵,執行任務腳本:

它就會對當前的任務進行修改,如果下面的日志文件顯示:

那么腳本沒有語法錯誤,已經成功提交。
之后,激動人心的時刻到了,在屬性對話框點擊執行:

然后,20個並行抓取任務線程就已經開始了:

系統會自動維持線程列表中的線程數量,只有舊任務工作完畢后,才會添加新的線程進來。
下面的三個表,分別是淘女郎信息表,相冊信息表,和照片信息表。采集完畢后,你可以點右鍵,導出到excel,csv..

至於圖片嘛,看看你設置的那個文件夾吧:

Enjoy!
3.代碼是怎么寫的?
Hawk本身是開源的,本質上是個編譯和解釋器。生成的xml就是代碼和控制邏輯。很多個模塊構成處理鏈條,你可以控制鏈條上的模塊數量,就能觀察數據是如何被采集和處理的。
整個程序包含兩個流程:
- 主流程:負責從頁面生成淘女郎的詳細信息列表
- 相冊:負責從淘女郎的id和姓名,獲取其對應的照片。
主流程:獲取女孩信息
先看主流程,我們把調試數量改為1,勾選顯示調試詳情,點擊下一步:

會有下面的信息顯示出來,綠色代表該模塊輸入的列,藍色代表輸出的列。在調試模塊屬性中顯示的是當前模塊的基本信息和配置。

基本的邏輯就是,生成從1到4700頁的區間數,然后將它們分別轉換成url:
https://mm.taobao.com/json/request_top_list.htm?page={0}
然后通過從爬蟲采集,獲取女孩的列表,再根據用戶的id,組合出詳情頁,並把詳情頁的信息附加到當前表。將表的內容寫入到“淘女郎”表,再針對每個女孩的id,去獲取她的相冊信息。
相冊:獲取單個女孩的照片
如果你直接雙擊相冊模塊,肯定是出現下面的情況,什么數據都沒有:

為什么呢?因為沒有提供數據源。在主流程中,相冊模塊會讀取主流程的id和名字兩個列的內容,作為輸入參數。但獨立運行時,需要兩個從文本生成來提供任務參數。
因此,我們勾選那兩個從文本生成的單選框,表示啟用之:
再點刷新,是不是就都有了?

你也可以單步調試,看看這個模塊是怎么獲得的。基本流程如下:
- 通過女孩的id,組合出相冊的url,比如下面:
mm.taobao.com/self/album/open_album_list.htm?_charset=utf-8&user_id%20=687471686 - 通過一個網頁采集器,名稱為相冊列表獲取相冊
- 再通過相冊ID,獲取相冊的URL。相冊的URL需要構造請求,獲得的是Json。
- 把Json的頭部Jsonp和末尾的括號去掉,形成正確格式的json
- 送入文本到Json轉換模塊,得到的是字典
- 使用Python轉換器,提取里面的picList,再轉換為文檔列表。這就是照片列表
- 將路徑和相冊id,組合成實際要保存的圖片的位置
- 加入保存超鏈接文件,會把指定url的文件保存到指定位置
欣賞完相冊是怎么執行的之后,在切換回主流程之前,記得把那兩個從文本生成關掉。否則會影響主流程的調用。
有兩種方法,一種是在主流程任務那里,執行任務腳本,系統會自動操作。
也可以直接在相冊的屬性對話框中,點擊編輯集合,把最上面兩個的啟用去掉:

值得一提的是,模塊上都有標簽屬性,你可以給某一組的模塊打上固定的標簽,在外部的python代碼中通過標簽搜索這些模塊,進行批量處理。具體可以參考剛才的那個py文件。
3.下一篇文章的內容?
限於篇幅,本文沒有詳細地講解如何模擬動態請求,如何探測請求的內容,這些都會在下一篇文章介紹。
Hawk系列文章:
Hawk-數據抓取工具:簡明教程
Hawk: 20分鍾無編程抓取大眾點評17萬數據
etlpy: 並行爬蟲和數據清洗工具
有任何問題,歡迎隨時交流。
