接觸Python也好長時間了,一直沒什么機會使用,沒有機會那就自己創造機會!吶,就先從爬蟲開始吧,抓點美女圖片下來。
廢話不多說了,講講我是怎么做的。
1. 分析網站
想要下載圖片,只要知道圖片的地址就可以了,So,現在的問題是如何找到這些圖片的地址。
首先,直接訪問http://huaban.com/favorite/beauty/會看到頁面有20張所要抓取的圖片還有一些其他干擾的圖片信息(用戶的頭像、頁面的一些圖標之類的)。當點擊一張美女圖片時,頁面會跳轉到一個新的頁面,在這個頁面里,是之前那張圖片更清晰版本,我們要下當然就要最好的了,就是點擊完圖片后新頁面中那張圖片啦。
下一步就是借助一些工具,如firefox的Firebug或者chrome的F12,分析網站。具體步驟有些繁瑣,我就不細說了。分析結果是,首先,發送一個get請求,請求url為http://huaban.com/favorite/beauty/,得到一個html頁面,在這個頁面中<script>標簽下有一行以 app.page["pins"] 開頭的,就是我們要找的部分,等號后面是一個json字符串,格式化后如下:
每張要找的圖片對應一個字典,圖片的url地址與"file"下的"key"有關,圖片類型與"file"下的"type"有關,只要得到這兩個值就可以下載到圖片了。
在每次下拉刷新時,也是發送了一個get請求,在這個請求中有一個關鍵參數max,這個就是當前頁面中最后一個圖片的"pin_id",所以,需要抓取三個內容,分別是"pin_id","file"."key"和"file"."type"。
2. 編寫爬蟲
2.1 requests
使用Python自帶的urllib和urllib2庫幾乎可以完成任何想要的http請求,但是就像requests所說的,Python’s standard urllib2 module provides most of the HTTP capabilities you need, but the API is thoroughly broken. 所以,我這里推薦使用的是requests庫,中文文檔在這里。
2.2 抓取主頁面
直接發送get請求,得到html頁面
req = requests.get(url = "http://huaban.com/favorite/beauty/")
htmlPage = req.content
2.3 處理html頁面
分析html頁面,得到圖片的pin_id、url和圖片類型。首先,用正則處理頁面,得到頁面中<script>標簽中 app.page["pins"] 開頭的一行
prog = re.compile(r'app\.page\["pins"\].*') appPins = prog.findall(htmlPage)
再將這一行中的數據提取出來,直接生成一個Python字典
null = None
result = eval(appPins[0][19:-1])
注:由於javascript中null在Python中為None,所以要讓null=None,appPins中還有一個干擾用切片去掉。
之后就可以得到圖片的信息,將這些信息以字典形式存入一個列表中
images = [] for i in result: info = {} info['id'] = str(i['pin_id']) info['url'] = "http://img.hb.aicdn.com/" + i["file"]["key"] + "_fw658" info['type'] = i["file"]["type"][6:] images.append(info)
到此,圖片的信息都已經得到了。
2.4 下載圖片
知道了圖片的url,下載圖片就變的非常簡單了,直接一個get請求,然后再將得到的圖片保存到硬盤。
for image in images: req = requests.get(image["url"]) imageName = image["id"] + "." + image["type"] with open(imageName, 'wb') as fp: fp.write(req.content)
2.5 處理下拉刷新
其實處理下拉刷新與之前講到的處理主頁面幾乎是一樣的,唯一不一樣的是每次下拉刷新是get請求的url中max的值不一樣,這個值就是我們得到的最后一張圖片信息的pin_id。
def make_ajax_url(No): """ 返回ajax請求的url """ return "http://huaban.com/favorite/beauty/?i5p998kw&max=" + No + "&limit=20&wfl=1" htmlPage = requests.get(url = make_ajax_url(images[-1]['id'])).content
最終程序
最終程序見 Github
附注:花瓣網不需要登錄、沒有驗證碼,甚至網站都沒有做最基本的反爬蟲檢測,可以直接得到想要的內容,相對來說還是比較容易處理,很適合剛開始接觸爬蟲的同學學習。唯一復雜點的是頁面下拉刷新是用的ajax,這個也不難,找到每次get請求的參數是怎么獲得的,就沒問題了。