接觸Python也好長時間了,一直沒什麼機會使用,沒有機會那就本身創造機會!吶,就先從爬蟲開始吧,抓點美女圖片下來。javascript
廢話很少說了,講講我是怎麼作的。html
想要下載圖片,只要知道圖片的地址就能夠了,So,如今的問題是如何找到這些圖片的地址。java
首先,直接訪問http://huaban.com/favorite/beauty/會看到頁面有20張所要抓取的圖片還有一些其餘干擾的圖片信息(用戶的頭像、頁面的一些圖標之類的)。當點擊一張美女圖片時,頁面會跳轉到一個新的頁面,在這個頁面裏,是以前那張圖片更清晰版本,咱們要下固然就要最好的了,就是點擊完圖片後新頁面中那張圖片啦。python
下一步就是藉助一些工具,如firefox的Firebug或者chrome的F12,分析網站。具體步驟有些繁瑣,我就不細說了。分析結果是,首先,發送一個get請求,請求url爲http://huaban.com/favorite/beauty/,獲得一個html頁面,在這個頁面中<script>標籤下有一行以 app.page["pins"] 開頭的,就是咱們要找的部分,等號後面是一個json字符串,格式化後以下:git
每張要找的圖片對應一個字典,圖片的url地址與"file"下的"key"有關,圖片類型與"file"下的"type"有關,只要獲得這兩個值就能夠下載到圖片了。github
在每次下拉刷新時,也是發送了一個get請求,在這個請求中有一個關鍵參數max,這個就是當前頁面中最後一個圖片的"pin_id",因此,須要抓取三個內容,分別是"pin_id","file"."key"和"file"."type"。ajax
使用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庫,中文文檔在這裏。chrome
直接發送get請求,獲得html頁面json
req = requests.get(url = "http://huaban.com/favorite/beauty/")
htmlPage = req.content
分析html頁面,獲得圖片的pin_id、url和圖片類型。首先,用正則處理頁面,獲得頁面中<script>標籤中 app.page["pins"] 開頭的一行app
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)
到此,圖片的信息都已經獲得了。
知道了圖片的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)
其實處理下拉刷新與以前講到的處理主頁面幾乎是同樣的,惟一不同的是每次下拉刷新是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請求的參數是怎麼得到的,就沒問題了。