Python 爬蟲: 抓取花瓣網圖片


 

接觸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請求的參數是怎么獲得的,就沒問題了。


免責聲明!

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



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