閱讀170 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Python實戰案例分享:爬取當當網商品數據

​​作者:韋瑋

轉載請注明出處

 目前,網絡爬蟲應用領域非常廣,在搜索引擎、大數據分析、客戶挖掘中均可以用到。在本篇博文中,韋瑋老師會以當當網爬蟲為例,為大家講解如何編寫一個自動爬蟲將當當網的商品數據都爬取下來。

首先,需要創建一個名為dangdang的爬蟲項目,如下所示:


D:\Python35\myweb>scrapy startproject dangdang

New Scrapy project 'dangdang', using template directory 'd:\\python35\\lib\\site-packages\\scrapy\\templates\\project', created in:

    D:\Python35\myweb\dangdang

You can start your first spider with:

    cd dangdang

    scrapy genspider example example.com


創建好了爬蟲項目之後,我們需要進入該爬蟲項目,然後在爬蟲項目中創建一個爬蟲,如下所示:


D:\Python35\myweb>cd .\dangdang\

D:\Python35\myweb\dangdang>scrapy genspider -t basic dangspd dangdang.com

Created spider 'dangspd' using template 'basic' in module:

  Dangdang.spiders.dangspd


爬蟲和爬蟲項目是不一樣的,一個爬蟲項目中可以有1個或多個爬蟲文件。

隨後,我們需要編寫items.py文件,在該文件中定義好需要爬取的內容,我們將items.py文件修改為如下所示:


# -*- coding: utf-8 -*-

# Define here the models for your scraped items

#

# See documentation in:

https://doc.scrapy.org/en/latest/topics/items.html

import scrapy

class DangdangItem(scrapy.Item):

    # define the fields for your item here like:

    # name = scrapy.Field()

    #商品標題

    title=scrapy.Field()

    #商品評論數

    num=scrapy.Field()


隨後,需要編寫pipelines.py文件,在pipelines.py文件中,我們一般會編寫一些爬取後數據處理的代碼,我們需要將爬取到的信息依次展現到屏幕上(當然你也可以將爬取到的信息寫進文件或數據庫中),我們將pipelines.py文件修改為如下所示:


# -*- coding: utf-8 -*-

# Define your item pipelines here

#

# Don't forget to add your pipeline to the ITEM_PIPELINES setting

# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html

class DangdangPipeline(object):

    def process_item(self, item, spider):

        #item=dict(item)

        #print(len(item["name"]))

        for j in range(0,len(item["title"])):

            print(j)

            title=item["title"][j]

            num=item["num"][j]

            print("商品名:"+title)

            print("商品評論數:"+num)

            print("--------")

        return item


隨後,接下來我們還需要編寫配置文件settings.py,編寫配置文件的目的有兩個:

1)、啟用剛剛編寫的pipelines,因為默認是不啟用的。

2)、設置不遵循robots協議爬行,因為該協議對我們的爬蟲有相關限製,遵循該協議,可能會無法爬取到結果。

我們可以將配置文件settings.py的robots協議配置部分修改為如下所示,此時值設置為False,代表讓爬蟲不遵循當當網的robots協議爬行,當然我們不要利用這些技術做違法事項。


# Obey robots.txt rules

ROBOTSTXT_OBEY = False

然後,我們再將配置文件settings.py的pipelines配置部分設置為如下所示,開啟對應的pipelines:

# Configure item pipelines

# See https://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html

ITEM_PIPELINES = {

    'dangdang.pipelines.DangdangPipeline': 300,

}


隨後,我們需要分析當當網的網頁結構,總結出信息提取的規則以及自動爬行的規律。

我們打開某一個頻道頁,各頁對應的網址如下所示:

https://category.dangdang.com/pg1-cid4002644.html

https://category.dangdang.com/pg2-cid4002644.html

https://category.dangdang.com/pg3-cid4002644.html

……

此時,我們會發現,網頁的格式形如:https://category.dangdang.com/pg[頁碼]-cid4002644.html

有了該規律之後,我們可以將頁碼位置設置為變量,通過for循環就可以構造出一個頻道中所有的商品頁,也就通過這種方式實現了自動爬取。

然後,我們再分析商品信息的提取規律。

我們打開任意一個頻道頁https://category.dangdang.com/pg1-cid4002644.html,然後可以看到如下界麵:


此時我們需要提取該頁麵中所有的商品標題和商品評論信息,將其他無關信息過濾掉。所以,我們可以查看該網頁源代碼,以第一個商品為例進行分析,然後總結出所有商品的提取規律。我們可以右鍵--查看源代碼,然後通過ctrl+find快速定位源碼中該商品的對應源代碼部分,如下所示:


對應源代碼複製出來如下所示:


……

<a title=" [當當自營]EGISOO禦姬秀橙花潤唇膏3g 無色護唇膏 淡化唇紋 水潤晶瑩 保濕潤唇膏 "     href="https://ask.hellobi.com/https://product.dangdang.com/60629118.html"  target="_blank" ><img src='https://img3x8.ddimg.cn/33/30/60629118-1_b_2.jpg' alt=' [當當自營]EGISOO禦姬秀橙花潤唇膏3g 無色護唇膏 淡化唇紋 水潤晶瑩 保濕潤唇膏 ' /></a><p > <span >¥9.90</span></p><p ><a title=" [當當自營]EGISOO禦姬秀橙花潤唇膏3g 無色護唇膏 淡化唇紋 水潤晶瑩 保濕潤唇膏 " href="https://ask.hellobi.com/https://product.dangdang.com/60629118.html" target="_blank" > [當當自營]EGISOO禦姬秀橙花潤唇膏3g 無色護唇膏 淡化唇紋 水潤晶瑩 保濕潤唇膏 </a></p><p > 明星都在用 水潤護唇 秋冬換季必備 嗬護你的雙唇晶瑩剔透明媚動人  正品保證 貨到付款 </p><p  ><span ><span ></span></span><a href="https://ask.hellobi.com/https://comm.dangdang.com/review/reviewlist.php?pid=60629118" target="_blank" name="P_pl">434條評論</a></p>                </div>

……


所以,我們可以得到提取商品標題和商品評論的Xpath表達式,如下所示:


#提取商品標題

"//a[@class='pic']/@title"

#提取商品評論

"//a[@name='P_pl']/text()"


在這裏時間有限,無法詳細講解Xpath表達式基礎,沒有Xpath表達式基礎的朋友可以參考下方作者的書籍或者百度自行補充,XPath基礎部分知識不屬於本篇博文範疇。

此時,我們已經總結出了信息提取的對應的Xpath表達式,然後我們可以編寫剛才最開始的時候創建的爬蟲文件dangspd.py了,我們將爬蟲文件編寫修改為如下所示:


# -*- coding: utf-8 -*-

import scrapy

import re

from dangdang.items import DangdangItem

from scrapy.http import Request

class DangspdSpider(scrapy.Spider):

    name = "dangspd"

    allowed_domains = ["dangdang.com"]

    start_urls = (

        'https://category.dangdang.com/pg1-cid4002644.html',

    )

    def parse(self, response):

        item=DangdangItem()

        item["title"]=response.xpath("//a[@class='pic']/@title").extract()

        item["num"]=response.xpath("//a[@name='P_pl']/text()").extract()

        yield item

        for i in range(2,101):

            url="https://category.dangdang.com/pg"+str(i)+"-cid4002644.html"

            yield Request(url, callback=self.parse) 


這樣,就可以實現爬蟲的編寫了。

隨後,我們可以進入調試和運行階段。

我們進入cmd界麵,運行該爬蟲,出現如下所示結果,中間結果太長,省略了部分:


D:\Python35\myweb\dangdang>scrapy crawl dangspd --nolog

……

43

商品名: WIS水潤麵膜套裝24片 祛痘控油補水保濕淡痘印收縮毛孔麵膜貼男女

商品評論數:255條評論

--------

44

商品名:歐詩漫水活奇跡係列【水活奇跡珍珠水(清潤型)+珍珠水活奇跡保濕凝乳】

商品評論數:0條評論

--------

45

商品名:【法國進口】雅漾(Avene)活泉恒潤保濕精華乳30ml 0064

商品評論數:0條評論

--------

46

商品名:【法國進口】Avene雅漾敏感肌膚護理淨柔潔麵摩絲150ml溫和泡沫潔麵乳洗麵奶0655

商品評論數:0條評論

--------

47

商品名:珍視明中老年護眼貼2盒裝 30對60貼  針對中老年用眼問題 緩解眼疲勞

商品評論數:226條評論

--------


可以看到,此時一共輸出了19K多行,將近2萬行數據,如下所示:

捕獲3.PNG捕獲3.PNG

每個數據占4行,所以將近爬取了19210/4=4802.5條數據,當然這個是估算,因為中間可能會有極少量的數據抓取異常等情況,這是正常的。目前已經抓取了將近100頁的數據,而爬蟲中設置爬取100頁,所以結果屬於正常的。


作者新書推薦

58d0cd32Nddf92407.jpg


最後更新:2017-07-28 23:35:28

  上一篇:go  一分鍾看懂測力傳感器暗轉使用技巧和注意事項
  下一篇:go  使用文本挖掘實現站點個性化推薦