Hawk: 無編程抓取淘女郎的所有高清照片


1.這是什么鬼?

哦?美女?
最近看了這一篇文章:http://cuiqingcai.com/1001.html

大概說的是用Python和Pyspider(這貨好像是我的一位師兄寫的,嚇尿),抓取淘寶淘女郎的所有美女照片。只是里面還要敲一堆代碼,還要用其他動態js運行框架,看着好不煩人啊。

Hawk是沙漠君開發的一款爬蟲和清洗工具,目前已經在Github開源:
https://github.com/ferventdesert/Hawk

最近沙漠君很開心啊,開發的Hawk在GitHub上上百個star,還有歪果仁來幫忙做英文國際化,哈哈哈。

那既然如此,我也用Hawk練練手,基本無需編程,直接無視動態js調用,下載高清圖片。造福各位園友。

這簡直就是用Hawk做壞事,順便炫技啊~~

2.先讓兄弟們飽飽眼福?

先看看抓取的效果,我才不直接放高清圖呢!
image_1aj6540v01l2r16t41sn31o681jpf5v.png-435.4kB
恩,先去下載軟件吧,在百度雲盤(這貨最近經常腦抽),如果你之前下過軟件,一定要更新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加載進來。會是下面的樣子:
image_1aj60o43kdusbibtco90c1pc29.png-18kB
然后,雙擊“主流程”(點這三個字所在的位置)

之后任務就會被加載進來,在右下角顯示所有的任務和數據表:
image_1aj627e2913bck1r1gi216jd195l9.png-20.2kB

接下來,在算法視圖上,雙擊主流程,就可以看到這個任務的窗口和屬性配置框了:
image_1aj629ekg175h1lc21er5nh3e4om.png-84.6kB
哈哈,不僅有詳細的名字,地址,甚至還有身高體重等詳細信息,各位慢慢看。

說好的保存圖片呢?別急別急,這只是在模擬運行模式,保存圖片這種有副作用的任務是不會執行的。

那我的圖片保存在哪里了?注意看到剛才的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,然后在模塊管理卷展欄的主流程位置點右鍵,執行任務腳本:
image_1aj62jeam47ska11d4p1j451dq313.png-14.2kB
它就會對當前的任務進行修改,如果下面的日志文件顯示:
image_1aj62k9dv1r1e15mu3mcj9a1a0t1g.png-3.7kB
那么腳本沒有語法錯誤,已經成功提交。

之后,激動人心的時刻到了,在屬性對話框點擊執行:
image_1aj62nhqn1agd94gh591g5dapp1t.png-10.8kB
然后,20個並行抓取任務線程就已經開始了:
image_1aj62olin1q82bafkgc1n0cch72a.png-20.9kB
系統會自動維持線程列表中的線程數量,只有舊任務工作完畢后,才會添加新的線程進來。
下面的三個表,分別是淘女郎信息表,相冊信息表,和照片信息表。采集完畢后,你可以點右鍵,導出到excel,csv..
image_1aj62r4721j2g1tch1a7g1g8t5ng2n.png-7.5kB
至於圖片嘛,看看你設置的那個文件夾吧:
image_1aj62t6171lmh1jpc13jf1hlg1r9t34.png-45.9kB

Enjoy!

3.代碼是怎么寫的?

Hawk本身是開源的,本質上是個編譯和解釋器。生成的xml就是代碼和控制邏輯。很多個模塊構成處理鏈條,你可以控制鏈條上的模塊數量,就能觀察數據是如何被采集和處理的。
整個程序包含兩個流程:

  • 主流程:負責從頁面生成淘女郎的詳細信息列表
  • 相冊:負責從淘女郎的id和姓名,獲取其對應的照片。

主流程:獲取女孩信息

先看主流程,我們把調試數量改為1,勾選顯示調試詳情,點擊下一步:
image_1aj6359r1uc61t0teih1fj4vbg3h.png-15.6kB

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

image_1aj63ol1t122ihj974v1mdg1tvc4b.png-41.4kB

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

相冊:獲取單個女孩的照片

如果你直接雙擊相冊模塊,肯定是出現下面的情況,什么數據都沒有:
image_1aj643ha01hpn5cd1r51kak1r0v4o.png-12.4kB
為什么呢?因為沒有提供數據源。在主流程中,相冊模塊會讀取主流程的id和名字兩個列的內容,作為輸入參數。但獨立運行時,需要兩個從文本生成來提供任務參數。

因此,我們勾選那兩個從文本生成的單選框,表示啟用之:
再點刷新,是不是就都有了?
image_1aj647fqh1p7kur6a6h1ke01sh755.png-76.5kB

你也可以單步調試,看看這個模塊是怎么獲得的。基本流程如下:

  1. 通過女孩的id,組合出相冊的url,比如下面:
    mm.taobao.com/self/album/open_album_list.htm?_charset=utf-8&user_id%20=687471686
  2. 通過一個網頁采集器,名稱為相冊列表獲取相冊
  3. 再通過相冊ID,獲取相冊的URL。相冊的URL需要構造請求,獲得的是Json。
  4. 把Json的頭部Jsonp和末尾的括號去掉,形成正確格式的json
  5. 送入文本到Json轉換模塊,得到的是字典
  6. 使用Python轉換器,提取里面的picList,再轉換為文檔列表。這就是照片列表
  7. 將路徑和相冊id,組合成實際要保存的圖片的位置
  8. 加入保存超鏈接文件,會把指定url的文件保存到指定位置

欣賞完相冊是怎么執行的之后,在切換回主流程之前,記得把那兩個從文本生成關掉。否則會影響主流程的調用。
有兩種方法,一種是在主流程任務那里,執行任務腳本,系統會自動操作。
也可以直接在相冊的屬性對話框中,點擊編輯集合,把最上面兩個的啟用去掉:
image_1aj64ovh3d9t17nost2re5rn45i.png-67.7kB

值得一提的是,模塊上都有標簽屬性,你可以給某一組的模塊打上固定的標簽,在外部的python代碼中通過標簽搜索這些模塊,進行批量處理。具體可以參考剛才的那個py文件。

3.下一篇文章的內容?

限於篇幅,本文沒有詳細地講解如何模擬動態請求,如何探測請求的內容,這些都會在下一篇文章介紹。
Hawk系列文章:
Hawk-數據抓取工具:簡明教程
Hawk: 20分鍾無編程抓取大眾點評17萬數據
etlpy: 並行爬蟲和數據清洗工具
有任何問題,歡迎隨時交流。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM