Python——爬蟲實戰(zhàn) 爬取淘寶店鋪內(nèi)所有寶貝圖片

之前用四篇很啰嗦的入門級別的文章,帶著大家一起去了解并學習在編寫爬蟲的過程中诈闺,最基本的幾個庫的用法渴庆。

那么今天,我們就正式開始我們的第一篇實戰(zhàn)內(nèi)容雅镊,爬取一整個淘寶店鋪里的所有寶貝的詳情頁襟雷,并且把詳情頁里的寶貝圖片保存下來。我自己剛開了一個小網(wǎng)店仁烹,當時寫出這個爬蟲耸弄,也是真真正正的為我自己服務了一回呢。

在寫之前卓缰,我先把這個爬蟲的代碼分析一下计呈,方便大家在看代碼的時候砰诵,理解整個流程是怎么樣的。

爬蟲框架我一直是使用Scrapy的捌显,在用Scrapy抓取店鋪信息的時候茁彭,因為淘寶的反爬機制,發(fā)現(xiàn)了機器人扶歪,所以獲取不到任何信息理肺,當時我趕著用寶貝圖片,所以我使用了之前介紹的selenium來獲取網(wǎng)頁信息击罪,并且通過我們上一篇介紹的lxml框架來提取信息哲嘲。最主要的庫就是這兩個,那么我針對這個爬蟲媳禁,編寫了一個叫做taobaoShop的爬蟲類。

之后画切,我們首先進入店鋪的首頁竣稽,抓取首頁所有商品的資料,并用他們的寶貝名霍弹,來生成文件夾毫别,方便存儲對應的詳情圖片,然后爬蟲進入寶貝的詳情頁典格,從詳情頁中提取詳情照片岛宦,并且保存在寶貝名稱對應的文件夾中,在該頁面所有的寶貝爬取完成后耍缴,咱們后檢查是否有分頁砾肺,如果還有下一頁的寶貝,那么進入下一頁的寶貝接著爬防嗡,過程就和剛剛描述的一樣了变汪。

所以我們的淘寶店鋪爬蟲類的初始化代碼是這樣的:

def __init__(self):
    """初始化構造函數(shù)
    """

    self.site_url = 'https://shop67309167.taobao.com/?spm=a230r.7195193.1997079397.2.xPZZS0'
    self.driver = webdriver.Chrome()
    self.sleep_time = 10
    self.save_img_path = '/Users/Lix/Documents/tbshop/'

初始化中我們設置了要爬取的店鋪url(這就是我的小店,如果可以的話蚁趁,請各位大佬幫忙點個關注)裙盾,另外是啟動selenium中webdriver的代碼,我用Chrome打開他嫡,靜默的話可以選擇Phantomjs打開番官,另外有個間歇時間,因為爬取的過快钢属,會被淘寶判定為爬蟲徘熔,彈出登錄框,最后的save_img_path自然就是我保存圖片的路徑了署咽。

在初始化的構造函數(shù)完成之后近顷,我們首先獲取的是淘寶店鋪頁面的網(wǎng)頁信息:

def getPage(self):
    """獲取淘寶店鋪頁面代碼
    """

    self.driver.get(self.site_url)
    time.sleep(self.sleep_time)
    content = self.driver.page_source.encode('utf-8')
    print self.driver.title
    
    # 保存html代碼debug
    # self.saveHtml('taobaoshop', content)
    
    # 分析該頁面的每個寶貝
    self.getItem()

在獲取到店鋪的網(wǎng)頁信息后生音,我們調(diào)用getItem()函數(shù),獲取每個寶貝的信息:

def getItem(self):
    """爬取當前頁面的每個寶貝窒升,
       提取寶貝名字缀遍,價格,標題等信息
    """

    html = self.driver.page_source.encode('utf-8')
    selector = etree.HTML(html)
    itemList = selector.xpath("http://div[@class='item3line1']")
    
    # 循環(huán)遍歷該頁所有商品
    index = 0
    for item3line1 in itemList:
        dl = item3line1.xpath("./dl")
        for item in dl:
            link = 'https:' + item.xpath("./dt/a/@href")[0]
            photo = 'https:' + item.xpath("./dt/a/img/@src")[0]
            title = item.xpath("./dd/a/text()")[0]
    
            res = {
                'link' : link,
                'photo' : photo,
                'title' : title
            }

            # 進入寶貝詳情頁 開始爬取里面的圖片資料
            self.getItemDetail(link, '')
    
    # 獲取分頁信息
    pagination = selector.xpath("http://div[@class='pagination']/a[contains(@class, 'J_SearchAsync') and contains(@class, 'next')]/@href")
    print pagination
    print '正在準備切換分頁'
    if len(pagination) == 0:
        print '沒有下一頁了'
    else:
        print '加載下一頁內(nèi)容'
        self.site_url = 'https:' + pagination[0]
        print self.site_url
        self.getPage()

在這里饱须,我們看到我們已經(jīng)獲取到了寶貝的鏈接域醇,封面圖,標題蓉媳。并且執(zhí)行了getItemDetail(self, link, save_img_path)函數(shù)去爬取寶貝的詳情頁了譬挚,最后我們還在循環(huán)結束之后,分析了分頁數(shù)據(jù)酪呻。

那么最后减宣,我們就來看看最關鍵的getItemDetail()函數(shù),看看是怎么爬取寶貝信息的:

def getItemDetail(self, link, save_img_path):
    """從寶貝的詳情鏈接里 爬取圖片
    
    Arguments:
        link {String} -- [寶貝詳情鏈接]
    """
    newDriver = webdriver.Chrome()
    newDriver.get(link)
    time.sleep(self.sleep_time)

    print newDriver.title

    img_dir_path = self.save_img_path + newDriver.title.encode('utf-8')
    if True == self.mkdir(img_dir_path):
        print '創(chuàng)建寶貝目錄成功'

    html = newDriver.page_source.encode('utf-8')
    selector = etree.HTML(html)

    # 封面圖
    J_ULThumb = selector.xpath("http://div[@class='tb-gallery']/ul/li")
    index = 0
    for li in J_ULThumb:
        # 替換圖片 從50*50 至 400 * 400
        if len(li.xpath("./div/a/img/@data-src")) < 1:
            continue
        small_pic = li.xpath("./div/a/img/@data-src")[0]
        common_pic = 'https:' + small_pic.replace('50x50', '400x400')
        thumb_title = str('封面圖') + str(index)
        print thumb_title
        # self.saveImg(img_dir_path, common_pic, thumb_title.decode('utf-8'))
        index += 1

    # 爬取里面所有圖片
    all_img = selector.xpath("http://div[@id='J_DivItemDesc']//descendant::img/@src")
    print all_img

    index = 0
    for img in all_img:
        imglink = img
        if img.startswith('http') is True:
            imglink = img
        else:
            imglink = 'https:' + img

        self.saveImg(img_dir_path, imglink, str(index))
        index += 1

    newDriver.quit()

注釋都寫在代碼里了玩荠,大家看看就好漆腌,這里有很多地方的代碼不夠優(yōu)雅,那是我當天急著用阶冈,所以后來也沒有去優(yōu)化了闷尿。

在這個核心解析代碼的完成之后,寶貝圖片就已經(jīng)穩(wěn)穩(wěn)的存儲到我們的硬盤上了女坑,可以開箱即用了填具。完整的代碼我也放在了Github上了,如果對您有幫助匆骗,請幫忙star一下劳景。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市绰筛,隨后出現(xiàn)的幾起案子枢泰,更是在濱河造成了極大的恐慌,老刑警劉巖铝噩,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衡蚂,死亡現(xiàn)場離奇詭異,居然都是意外死亡骏庸,警方通過查閱死者的電腦和手機毛甲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來具被,“玉大人玻募,你說我怎么就攤上這事∫蛔耍” “怎么了七咧?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵跃惫,是天一觀的道長。 經(jīng)常有香客問我艾栋,道長爆存,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任蝗砾,我火速辦了婚禮先较,結果婚禮上,老公的妹妹穿的比我還像新娘悼粮。我一直安慰自己闲勺,他們只是感情好,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布扣猫。 她就那樣靜靜地躺著菜循,像睡著了一般。 火紅的嫁衣襯著肌膚如雪申尤。 梳的紋絲不亂的頭發(fā)上债朵,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音瀑凝,去河邊找鬼。 笑死臭杰,一個胖子當著我的面吹牛粤咪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播渴杆,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼寥枝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了磁奖?” 一聲冷哼從身側響起囊拜,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎比搭,沒想到半個月后冠跷,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡身诺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年蜜托,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霉赡。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡橄务,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出穴亏,到底是詐尸還是另有隱情蜂挪,我是刑警寧澤重挑,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站棠涮,受9級特大地震影響谬哀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜故爵,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一玻粪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧诬垂,春花似錦劲室、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至隧枫,卻和暖如春喉磁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背官脓。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工协怒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卑笨。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓孕暇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親赤兴。 傳聞我的和親對象是個殘疾皇子妖滔,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,520評論 25 707
  • 1 前言 作為一名合格的數(shù)據(jù)分析師,其完整的技術知識體系必須貫穿數(shù)據(jù)獲取桶良、數(shù)據(jù)存儲座舍、數(shù)據(jù)提取、數(shù)據(jù)分析陨帆、數(shù)據(jù)挖掘曲秉、...
    whenif閱讀 18,052評論 45 523
  • 寫在前面 如果你不會 python ,不會爬蟲歧譬,甚至完全不會編程的話岸浑,建議你先去看看這個系列博客的前兩章。否則就算...
    ed8236310d4f閱讀 7,598評論 4 22
  • 做淘寶真的要刷單么瑰步?那些所謂的七天螺旋矢洲,如果你一個新開的店,沒權重沒流量缩焦,不刷單哪來的螺旋給你读虏? 淘寶大環(huán)境下责静,小...
    我是盼盼呢閱讀 9,711評論 1 16
  • 熱戀期的女人最美,由內(nèi)而外散發(fā)出甜美的氣息盖桥,怎么辦灾螃?剛分開又開始想他了,林彤抱著抱枕傻笑著揩徊。直到這一刻還有著不真實...
    合風閱讀 423評論 0 0