Scrapy自動爬取商品數據爬蟲

創建爬蟲項目

首先確保在Python環境下安裝好Scrapy。具體過程可以參考我之前的文章
Python環境下Scrapy爬蟲框架安裝
進入windows的cmd或mac終端在某文件目錄(這里為craw文件夾)下創建爬蟲項目bookpjt,并進入該項目文件夾
scrapy startproject bookpjt
cd bookpjt

項目修改

這里我們選擇爬取當當網python書籍商品的書名,價格,鏈接,評論數等數據。
進入項目文件目錄下,找到并修改items.py文件,未修改前該文件如下:

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

# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html

import scrapy


class BookpjtItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    pass

修改類BookpjtItem如下:

class BookpjtItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
#定義好name用來存儲商品名
    name=scrapy.Field()
#定義好price用來存儲商品價格
    price=scrapy.Field()
#定義好link用來存儲商品鏈接
    link=scrapy.Field()
#定義好comnum用來存儲商品評論數
    comnum=scrapy.Field()

修改pipelines.py文件,我們要將爬取到的數據存儲在.json文件中,注意修改輸出的.json文件路徑為你自己電腦的路徑。

# -*- coding: utf-8 -*-
import codecs
import json

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html


class AutopjtPipeline(object):
    def __init__(self):
#此時存儲到的文件是getdata.json,注意這里將路徑修改為你自己要保存文件的路徑!
        self.file = codecs.open("D:/python/.../getdata.json", "wb", encoding="utf-8")
    def process_item(self, item, spider):
#每一頁中包含多個商品信息,所以可以通過循環,每一次處理一個商品
#其中len(item["name"])為當前頁中商品的總數,依次遍歷
        for j in range(0,len(item["name"])):
#將當前頁的第j個商品的名稱賦值給變量name
            name=item["name"][j]
            price=item["price"][j]
            comnum=item["comnum"][j]
            link=item["link"][j]
#將當前頁下第j個商品的name、price、comnum、link等信息處理一下
#重新組合成一個字典
            books={"name":name,"price":price,"comnum":comnum,"link":link}
            #將組合后的當前頁中第j個商品的數據寫入json文件
            i=json.dumps(dict(books), ensure_ascii=False)
            line = i + '\n'
            self.file.write(line)
#返回item
        return item
    def close_spider(self,spider):
        self.file.close()

接下來修改setting.py文件,首先開啟pipelines,取消這三行的注釋即可。

# Configure item pipelines
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
    'bookpjt.pipelines.BookpjtPipeline': 300,
}

因為一些網站可能會有反爬蟲機制,會屏蔽你的Cookie,這里作Cookie反屏蔽處理

# Disable cookies (enabled by default)
COOKIES_ENABLED = False

有時爬蟲會因為未遵守robots.txt規則而不能運行,這里將robots.txt規則設為False,當然保證你的爬取行為合理合法。

# Obey robots.txt rules
ROBOTSTXT_OBEY = False

以上修改均可以在setting.py文件中。

創建爬蟲文件

回到cmd或者終端,在該項目目錄下以basic爬蟲模板創建爬蟲文件

scrapy genspider -t basic myspd dangdang.com

在當當網中搜索python,分析當當網python書籍商品網址,可發現index后即為商品頁數,可以多翻幾頁試試,第一頁也許會和后面的頁網址不一樣,但是后面頁網址的結構也可以打開第一頁。

http://search.dangdang.com/?key=python&act=input&show=big&page_index=1#J_tab
http://search.dangdang.com/?key=python&act=input&show=big&page_index=2#J_tab
······

分析網頁源代碼,提取書名,價格,鏈接,評論數的XPath表達式,如"http://a[@class='pic']/@title"為class屬性為pic的a標簽中的title屬性對應的值。
編寫myspd.py文件

# -*- coding: utf-8 -*-
import scrapy
from bookpjt.items import BookpjtItem
from scrapy.http import Request


class MyspdSpider(scrapy.Spider):
    name = "myspd"
    allowed_domains = ["dangdang.com"]
    start_urls = ['http://search.dangdang.com/?key=python&act=input&show=big&page_index=1#J_tab']

    def parse(self, response):
        item=BookpjtItem()
#通過各Xpath表達式分別提取商品的名稱、價格、鏈接、評論數等信息
        item["name"]=response.xpath("http://a[@class='pic']/@title").extract()
        item["price"]=response.xpath("http://span[@class='price_n']/text()").extract()
        item["link"]=response.xpath("http://a[@class='pic']/@href").extract()
        item["comnum"]=response.xpath("http://a[@name='itemlist-review']/text()").extract()
#提取完后返回item
        yield item
#接下來很關鍵,通過循環自動爬取20頁的數據
        for i in range(1,21):
#通過上面總結的網址格式構造要爬取的網址
            url="http://search.dangdang.com/?key=python&act=input&show=big&page_index="+str(i)+"#J_tab"
#通過yield返回Request,并指定要爬取的網址和回調函數
#實現自動爬取
            yield Request(url, callback=self.parse)

調試運行爬蟲

返回項目目錄下,在cmd或終端調試運行爬蟲

scrapy crawl myspd --nolog


在你之前保存的目錄下查看getdata.json文件,可以看到很快爬蟲便爬取了近1000多本書的數據信息。若沒有文件或者文件內容為空,校對以上步驟看看哪里出錯了。
結果輸出

本文是快速成功實現了一個爬蟲,同理,可以對其他網站或者其他商品通過Scrapy爬蟲爬取你所需的數據信息。做法是分析網址源碼,改動一下數據結構和正則表達式,具體內容可以百度搜索研究學習XPath表達式部分。
獲取到數據后就可以進一步的進行數據分析或可視化,玩起這份自己獲取到的數據啦_。具體內容以后玩到也會分享展示出來的。
項目代碼已上傳至我的github|ChocoYvan,可以fork下來參考。
歡迎參觀我的博客|巧不巧克力,一起交流學習哈O(∩_∩)O

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容