在開(kāi)始寫(xiě)爬蟲(chóng)之前,我們先了解一下爬蟲(chóng)
首先,我們需要知道爬蟲(chóng)是什么,這里直接引用百度百科的定義
網(wǎng)絡(luò )爬蟲(chóng)(又被稱(chēng)為網(wǎng)頁(yè)蜘蛛,網(wǎng)絡(luò )機器人,在FOAF社區中間,更經(jīng)常的稱(chēng)為網(wǎng)頁(yè)追逐者),是一種按照一定的規則,自動(dòng)地抓取萬(wàn)維網(wǎng)信息的程序或者腳本。
這些還不夠,我們還需要知道爬蟲(chóng)爬取數據的基本步驟。
爬蟲(chóng)爬取數據一般分為三個(gè)步驟
巧婦難為無(wú)米之炊。我們需要的是數據全在網(wǎng)頁(yè)里,拿不到網(wǎng)頁(yè),代碼敲得再好也沒(méi)用。所以一個(gè)爬蟲(chóng)的第一步一定是獲取網(wǎng)頁(yè)。
拿到網(wǎng)頁(yè)之后,我們要做的就是分析網(wǎng)頁(yè)結構,定位要爬取的信息,然后提取出來(lái)
獲得信息之后,一般需要把信息保存起來(lái)以便下次使用
完成上面三步一個(gè)簡(jiǎn)單的爬蟲(chóng)就寫(xiě)好了( ̄▽?zhuān)?",下面開(kāi)始寫(xiě)壁紙爬蟲(chóng)
我們要爬取的目標網(wǎng)站是:http://www.netbian.com/,這個(gè)網(wǎng)站長(cháng)這樣:
紅色方框里的就是我們要爬取的圖片。
在動(dòng)手寫(xiě)代碼之前,我們要先理一理思路,這樣可以讓思路更清晰,寫(xiě)代碼時(shí)就會(huì )更流暢,代碼也更簡(jiǎn)潔。
對于一個(gè)爬蟲(chóng)腳本,我們一般需要考慮以下幾點(diǎn):
爬什么:我們要從網(wǎng)頁(yè)上獲取的數據是什么
怎么爬:用什么庫?是否需要使用框架?有沒(méi)有 ajax接口?
爬取步驟:哪個(gè)先爬,哪個(gè)后爬
以我們的項目為例:
爬什么:
我們的目標是下載網(wǎng)頁(yè)中的圖片,要下載圖片就要先獲得圖片的地址,而圖片的地址就在網(wǎng)頁(yè)中。
所以我們需要爬取網(wǎng)頁(yè)中圖片的地址。
怎么爬:
圖片在幾十到幾百張之間,下載量不大,不需要使用框架,直接使用 requests庫。
解析網(wǎng)頁(yè)使用 xpath。
爬取步驟:
第一步:分析網(wǎng)頁(yè),寫(xiě)出圖片的 xpath路徑
第二步:用 requests庫獲取網(wǎng)頁(yè)
第三步:使用 lxml庫解析網(wǎng)頁(yè)
第四步:通過(guò) xpath獲得圖片鏈接
第五步:下載圖片
第六步:命名并保存圖片
分析完之后,就開(kāi)始爬取了!
首先第一步,分析網(wǎng)頁(yè),在瀏覽器里打開(kāi)網(wǎng)頁(yè),按下 F12進(jìn)入開(kāi)發(fā)者模式,選擇 Elements選項卡,如圖:
使用元素選擇器:
找到標簽后,我們就可以寫(xiě)出標簽的 xpath路徑,這個(gè)比較簡(jiǎn)單,就不詳細寫(xiě)了。有疑問(wèn)的可以評論留言。
圖片標簽的 xpath路徑:
#圖片地址path = '//a[@title]/img/@src'#為了方便給圖片命名 順便把圖片名字也爬下來(lái)name = '//a[@title]/img/@alt'接下來(lái)就是應用我們所學(xué)的時(shí)候了,話(huà)不多說(shuō),直接上代碼:
#-*- coding: utf-8 -*import requestsfrom lxml import etree#網(wǎng)站地址url = 'http://www.netbian.com/'#獲取網(wǎng)頁(yè)r = requests.get(url)r.encoding = r.apparent_encoding#解析網(wǎng)頁(yè)dom = etree.HTML(r.text)#獲取圖片 img標簽#先獲取圖片所在的 img標簽在分別獲取圖片鏈接和名字img_path = '//a[@title]/img'imgs = dom.xpath(img_path)#獲取圖片的鏈接和名字 并下載 命名 保存for img in imgs: #xpath 的相對路徑 “.” 代表上一級標簽 #不要忘記 xpath返回的總是列表! src = img.xpath('./@src')[0] name = img.xpath('./@alt')[0] #下載圖片 image = requests.get(src) #命名并保存圖片 with open(name+'.jpg', 'wb') as f: f.write(image.content)運行結果:
這樣我們就完成了一個(gè)簡(jiǎn)易版的壁紙爬蟲(chóng),為什么說(shuō)是簡(jiǎn)易版呢,理由如下:
圖片太小了,根本不能用作壁紙(其實(shí)是我偷懶了( ̄▽?zhuān)?"),要獲取高清壁紙的話(huà),還需要點(diǎn)擊圖片進(jìn)入下一個(gè)頁(yè)面,簡(jiǎn)單起見(jiàn)我直接爬了首頁(yè)的縮略圖。
不能自動(dòng)翻頁(yè),運行一次只能下載一頁(yè)的圖片,翻頁(yè)可以獲取網(wǎng)頁(yè)中下一頁(yè)的鏈接,或者尋找網(wǎng)址的變化規律
聯(lián)系客服