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
每個數據占4行,所以將近爬取了19210/4=4802.5條數據,當然這個是估算,因為中間可能會有極少量的數據抓取異常等情況,這是正常的。目前已經抓取了將近100頁的數據,而爬蟲中設置爬取100頁,所以結果屬於正常的。
作者新書推薦
最後更新:2017-07-28 23:35:28