Python爬蟲日記七:批量抓取花瓣網(wǎng)高清美圖并保存

一:前言

嘀嘀嘀,上車請(qǐng)刷卡舔琅。昨天看到了不錯(cuò)的圖片分享網(wǎng)——花瓣等恐,里面的圖片質(zhì)量還不錯(cuò),所以利用selenium+xpath我把它的妹子的欄目下爬取了下來,以圖片欄目名稱給文件夾命名分類保存到電腦中课蔬。這個(gè)妹子主頁http://huaban.com/boards/favorite/beauty 是動(dòng)態(tài)加載的囱稽,如果想獲取更多內(nèi)容可以模擬下拉,這樣就可以更多的圖片資源二跋。這種之前爬蟲中也做過战惊,但是因?yàn)榫W(wǎng)速不夠快所以我就抓了19個(gè)欄目,一共500多張美圖同欠,也已經(jīng)很滿意了样傍。

先看看效果:

Paste_Image.png
Paste_Image.png

二:運(yùn)行環(huán)境

  • IDE:Pycharm
  • Python3.6
  • lxml 3.7.2
  • Selenium 3.4.0
  • requests 2.12.4

三:實(shí)例分析

1.這次爬蟲我開始做的思路是:進(jìn)入這個(gè)網(wǎng)頁http://huaban.com/boards/favorite/beauty 然后來獲取所有的圖片欄目對(duì)應(yīng)網(wǎng)址,然后進(jìn)入每一個(gè)網(wǎng)頁中去獲取全部圖片铺遂。(如下圖所示)

Paste_Image.png
Paste_Image.png

2.但是爬取獲取的圖片分辨率是236x354衫哥,圖片質(zhì)量不夠高,但是那個(gè)時(shí)候已經(jīng)是晚上1點(diǎn)30之后了襟锐,所以第二天做了另一個(gè)版本:在這個(gè)基礎(chǔ)上再進(jìn)入每個(gè)縮略圖對(duì)應(yīng)的網(wǎng)頁撤逢,再抓取像下面這樣高清的圖片。

Paste_Image.png

四:實(shí)戰(zhàn)代碼

1.第一步導(dǎo)入本次爬蟲需要的模塊

__author__ = '布咯咯_rieuse'
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium import webdriver
import requests
import lxml.html
import os

2.下面是設(shè)置webdriver的種類粮坞,就是使用什么瀏覽器進(jìn)行模擬蚊荣,可以使用火狐來看它模擬的過程,也可以是無頭瀏覽器PhantomJS來快速獲取資源莫杈,['--load-images=false', '--disk-cache=true']這個(gè)意思是模擬瀏覽的時(shí)候不加載圖片和緩存互例,這樣運(yùn)行速度會(huì)加快一些。WebDriverWait標(biāo)明最大等待瀏覽器加載為10秒筝闹,set_window_size可以設(shè)置一下模擬瀏覽網(wǎng)頁的大小媳叨。有些網(wǎng)站如果大小不到位,那么一些資源就不加載出來关顷。

# SERVICE_ARGS = ['--load-images=false', '--disk-cache=true']
# browser = webdriver.PhantomJS(service_args=SERVICE_ARGS)
browser = webdriver.Firefox()
wait = WebDriverWait(browser, 10)
browser.set_window_size(1400, 900)

3.parser(url, param)這個(gè)函數(shù)用來解析網(wǎng)頁糊秆,后面有幾次都用用到這些代碼,所以直接寫一個(gè)函數(shù)會(huì)讓代碼看起來更整潔有序议双。函數(shù)有兩個(gè)參數(shù):一個(gè)是網(wǎng)址痘番,另一個(gè)是顯性等待代表的部分,這個(gè)可以是網(wǎng)頁中的某些板塊平痰,按鈕汞舱,圖片等等...

def parser(url, param):
    browser.get(url)
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, param)))
    html = browser.page_source
    doc = lxml.html.fromstring(html)
    return doc

4.下面的代碼就是解析本次主頁面http://huaban.com/boards/favorite/beauty/ 然后獲取到每個(gè)欄目的網(wǎng)址和欄目的名稱,使用xpath來獲取欄目的網(wǎng)頁時(shí)宗雇,進(jìn)入網(wǎng)頁開發(fā)者模式后兵拢,如圖所示進(jìn)行操作。之后需要用欄目名稱在電腦中建立文件夾逾礁,所以在這個(gè)網(wǎng)頁中要獲取到欄目的名稱说铃,這里遇到一個(gè)問題访惜,一些名稱不符合文件命名規(guī)則要剔除,我這里就是一個(gè) * 影響了腻扇。

def get_main_url():
    print('打開主頁搜尋鏈接中...')
    try:
        doc = parser('http://huaban.com/boards/favorite/beauty/', '#waterfall')
        name = doc.xpath('//*[@id="waterfall"]/div/a[1]/div[2]/h3/text()')
        u = doc.xpath('//*[@id="waterfall"]/div/a[1]/@href')
        for item, fileName in zip(u, name):
            main_url = 'http://huaban.com' + item
            print('主鏈接已找到' + main_url)
            if '*' in fileName:
                fileName = fileName.replace('*', '')
            download(main_url, fileName)
    except Exception as e:
        print(e)
Paste_Image.png

5.前面已經(jīng)獲取到欄目的網(wǎng)頁和欄目的名稱债热,這里就需要對(duì)欄目的網(wǎng)頁分析,進(jìn)入欄目網(wǎng)頁后幼苛,只是一些縮略圖窒篱,我們不想要這些低分辨率的圖片,所以要再進(jìn)入每個(gè)縮略圖中舶沿,解析網(wǎng)頁獲取到真正的高清圖片網(wǎng)址墙杯。這里也有一個(gè)地方比較坑人,就是一個(gè)欄目中括荡,不同的圖片存放dom格式不一樣高镐,所以我這樣做

img_url = doc.xpath('//*[@id="baidu_image_holder"]/a/img/@src')
img_url2 = doc.xpath('//*[@id="baidu_image_holder"]/img/@src')

這就把兩種dom格式中的圖片地址都獲取了,然后把兩個(gè)地址list合并一下畸冲。img_url +=img_url2
在本地創(chuàng)建文件夾使用filename = 'image\\{}\\'.format(fileName) + str(i) + '.jpg'表示文件保存在與這個(gè)爬蟲代碼同級(jí)目錄image下嫉髓,然后獲取的圖片保存在image中按照之前獲取的欄目名稱的文件夾中。

def download(main_url, fileName):
    print('-------準(zhǔn)備下載中-------')
    try:
        doc = parser(main_url, '#waterfall')
        if not os.path.exists('image\\' + fileName):
            print('創(chuàng)建文件夾...')
            os.makedirs('image\\' + fileName)
        link = doc.xpath('//*[@id="waterfall"]/div/a/@href')
        # print(link)
        i = 0
        for item in link:
            i += 1
            minor_url = 'http://huaban.com' + item
            doc = parser(minor_url, '#pin_view_page')
            img_url = doc.xpath('//*[@id="baidu_image_holder"]/a/img/@src')
            img_url2 = doc.xpath('//*[@id="baidu_image_holder"]/img/@src')
            img_url +=img_url2
            try:
                url = 'http:' + str(img_url[0])
                print('正在下載第' + str(i) + '張圖片邑闲,地址:' + url)
                r = requests.get(url)
                filename = 'image\\{}\\'.format(fileName) + str(i) + '.jpg'
                with open(filename, 'wb') as fo:
                    fo.write(r.content)
            except Exception:
                print('出錯(cuò)了算行!')
    except Exception:
        print('出錯(cuò)啦!')


if __name__ == '__main__':
    get_main_url()

五:總結(jié)

這次爬蟲繼續(xù)練習(xí)了Selenium和xpath的使用,在網(wǎng)頁分析的時(shí)候也遇到很多問題苫耸,只有不斷練習(xí)才能把自己不會(huì)部分減少州邢,當(dāng)然這次爬取了500多張妹紙還是挺養(yǎng)眼的。
貼出我的github地址褪子,我的爬蟲代碼和學(xué)習(xí)的基礎(chǔ)部分都放進(jìn)去了量淌,有喜歡的朋友一起學(xué)習(xí)交流吧!github.com/rieuse/learnPython

Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末褐筛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子叙身,更是在濱河造成了極大的恐慌渔扎,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件信轿,死亡現(xiàn)場(chǎng)離奇詭異晃痴,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)财忽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門倘核,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人即彪,你說我怎么就攤上這事紧唱』钭穑” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵漏益,是天一觀的道長(zhǎng)蛹锰。 經(jīng)常有香客問我,道長(zhǎng)绰疤,這世上最難降的妖魔是什么铜犬? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮轻庆,結(jié)果婚禮上癣猾,老公的妹妹穿的比我還像新娘。我一直安慰自己余爆,他們只是感情好纷宇,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著龙屉,像睡著了一般呐粘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上转捕,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天作岖,我揣著相機(jī)與錄音,去河邊找鬼五芝。 笑死痘儡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的枢步。 我是一名探鬼主播沉删,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼醉途!你這毒婦竟也來了矾瑰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤隘擎,失蹤者是張志新(化名)和其女友劉穎殴穴,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體货葬,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡采幌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了震桶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片休傍。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蹲姐,靈堂內(nèi)的尸體忽然破棺而出磨取,到底是詐尸還是另有隱情人柿,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布寝衫,位于F島的核電站顷扩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏慰毅。R本人自食惡果不足惜隘截,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望汹胃。 院中可真熱鬧婶芭,春花似錦、人聲如沸着饥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宰掉。三九已至呵哨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間轨奄,已是汗流浹背孟害。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挪拟,地道東北人挨务。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像玉组,于是被迫代替她去往敵國(guó)和親谎柄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容