Python爬蟲
作為一個搞資料的人,不會點爬蟲真是說不過去。以前曾搞過那麼幾天,早就忘了,借着一個項目需要抓取點東西便再撿回來了。本篇将介紹使用python, urllib2, re, spynner 抓取淘寶淘女郎的所有寫真照片。來個網址:https://mm.taobao.com 讓我們先對淘女郎有個直覺的感受嘛。
主要步驟:
1. 抓取 http://mm.taobao.com/json/request_top_list.htm 的淘女郎資訊,如:首頁url, 使用者ID,年齡等等資訊。對進一步抓取有用的資訊是首頁的url 和使用者ID。 仔細觀察會發現,首頁的url裡面包含了使用者ID。這個資訊将為我們後面提供了大大的友善。
2. 通過 使用者ID 分析得到該使用者相冊清單的url,然後抓取使用者所有相冊的url。 3. 通過 相冊的url 分析得到該相冊照片清單的url,然後就随心所欲的抓取這些照片吧。
思路分析:
三個步驟說來簡單,其中的痛苦掙紮隻有自己才知道呢。特别是當發現,相冊那個網頁是動态生成的時候。以前隻抓取過靜态頁面的資訊,那天發現urllib2抓取的資訊怎麼不全的時候我就犯愁了。在Chrome浏覽器裡F12調出來的調試頁面,我能在element裡面看到我想要抓取的連結,而在source裡卻沒有,而urllib2隻能得到source裡的内容,是以死活就是沒有我要的連接配接。這說明這個網頁是動态生成的,urllib2無法抓取動态網頁的資訊。于是昨晚折騰了下spynner這個python的庫。 “spynner是一個QtWebKit的用戶端,它可以模拟浏覽器,完成加載頁面、引發事件、填寫表單等操作。”
動态網頁是在浏覽器浏覽網頁的時候實時從資料庫調取資料再加載的,那麼隻要我們模拟浏覽器的操作,那麼就通過分析加載完畢的頁面得到那些動态加載的連結了。
安裝spynner倒是容易直接pip就ok,安裝qt和pyqt,sip這些支援庫的時候卻蛋疼了我一晚上。這兒我就不詳細說如何安裝了,有安裝問題歡迎留言。 糟糕的spynner文檔,導緻一個load的逾時問題就逼的我去看源碼。如果哪位朋友有好的spynner文檔歡迎分享。 下面是我動态網頁資訊的代碼:
def get_albums_url_dy(self, url):
browser = spynner.Browser()
browser.hide()
try:
resp = browser.load(url)
except spynner.SpynnerTimeout:
browser.wait_load()
page = browser.html.encode('utf-8')
pattern = re.compile('<a href=".*?(album_id=\d*).*?" target="_blank" rel="external nofollow" ')
items = re.findall(pattern, page)
#delete repeats
urls = []
album_ids = []
for i in items:
if i not in album_ids:
album_ids.append(i)
for i in album_ids:
urls.append('//mm.taobao.com/self/album_photo.htm?user_id=687471686&'+ i)
return urls
通過spynner模拟浏覽器的行為确實可以讓我們抓取到那些動态加載的連結,但由于模拟了整個浏覽器的加載行為,是以效率是極其的低下。舉個例子,由于MM相冊url加載的時候超過了spynner的load的10s限制,導緻最初調試的時候一直報錯,後來加上了try, except和wait_load()算是解決了這個問題。打開這樣一個連結加載時間就在10s左右,要抓取如此多的圖檔用這個方法得等到淘寶關閉都抓取不完吧。
于是換種思路。 既然動态加載頁面那一定也是一個連接配接,連接配接到淘寶的某個json格式的清單,就和花裡胡哨的淘女郎首頁那個連結也被:http://mm.taobao.com/json/request_top_list.htm 輕松替代一樣。我們是不是也能找到對應某個淘女郎相冊的json清單,那樣就容易了。于是乎,基于這個想法我再次在Chrome浏覽器裡按下了F12。呵呵哒。通過在淘女郎相冊裡換頁時,F12裡network的顯示:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0NXYFhGd192UvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39jMwQDMyEjMzETMyATM1EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
我們成功從一堆雜亂的連接配接裡成功的找到這個打開相冊的關鍵連結! 打開它我們看到:
啊哈,這不就我們想要的嘛。通過周遊所有page我們就可以通過對這個靜态頁面的分析得到所有相冊的url了。
進入相冊後,如何找到所有照片的步驟和上面差不多。隻要手動分析到json的清單就萬事大吉了。
下面上效果圖:
所有代碼我已上傳到csdn資源站了:http://download.csdn.net/detail/u013787595/9199403
歡迎大家指點。
經驗總結:
1. Windows檔案夾不能含有"."等特殊符号,一定要在建立檔案夾的時候删除這些特殊字元,不然在儲存照片的時候就會報錯(因為找不到檔案夾啦) 2. 頁面手動分析的時候注意換行和空格的正則比對。有時候需要多比對多個才能得到需要的字元串。 3. 活用F12哦!
展望未來:
現在有時候會因為網絡問題導緻下載下傳中斷,那麼難道我們就要重新下載下傳一遍?現在看來我們隻能通過更改start和end的index來跳過下載下傳過的。我會繼續更新代碼增加新的功能,比如對線程下載下傳等。
原文發于部落格:http://blog.csdn.net/u013787595
GMX 2015.10.20 US Pacific Time