Scrapy爬取噹噹網的商品信息存到MySQL數據庫

Scrapy爬取噹噹網的商品信息存到MySQL數據庫

Scrapy 是一款十分強大的爬蟲框架,能夠快速簡單地爬取網頁,存到你想要的位置。經過兩天的摸索,終於搞定了一個小任務,將噹噹網的商品信息爬下來存到MySQL數據庫裏。

一、所需裝備

1.python2.7

這個不用多說。。

2.MySQL

百度一下就知道了,我當初折騰了好久才弄懂怎麼安裝,怎麼創建數據庫,學一些簡單的命令就Ok。

3.Scrapy

說實話,Scrapy的安裝配置真的是要人命,不過這裏分享一個萬金油的方法。通過下面的鏈接http://pan.baidu.com/s/1pLgySav下載Anaconda,安裝好了之後命令行輸入:conda install scrapy就ok了。不過這裏要提醒一下,這個方法可能沒有安好pywin32。我當初就是沒有安好,代碼寫好之後調試折騰了半天。如果pywin32沒有安好的話,解決辦法也很簡單,在命令行輸入:pip install pypiwin32就搞定了(默認已經安裝好了pip哈,要是沒有安好的話自行百度)

二、創建工程

Scrapy默認是不能在IDE中調試的(不過還是有解決方法的),所以工程的創建和調試要在命令行中進行。
創建方式是命令行進入你想創建的位置,然後輸入:scrapy startproject balabala
balabala爲項目名稱哈)。
我在E盤下創建的項目爲dangdang, 如圖:
這裏寫圖片描述
然後發現E盤根目錄下多了一個dangdang文件,點進去就有如下的文件:
這裏寫圖片描述
_init_文件是項目初始化文件。
items 文件是我們用來定義數據類型的文件。比如我們想爬取商品名,價格,商品鏈接,商品評論數,就可以定義name, price, link, commet等數據類型。
middlewares 是下載中間件,在本項目中可以不管。
pipelines 是爬蟲項目的管道文件,用來對數據進行加工處理,比如我們保存到數據庫就是在這裏邊進行的。
settings 是爬蟲項目的設置文件,我們一般用來設置Cookie, Item_pipelines, 等等,默認情況下是註釋掉的,需要人爲根據項目需要來修改。

然後通過Genspider命令來創建我們項目自己定義的文件。可以通過scrapy genspider -l
來查看當前可使用的模板:
這裏寫圖片描述
我們就用

scrapy genspider -t basic mydangdang dangdang.com

命令行來創建一個使用了basic模板的mydangdang爬蟲文件,爬蟲爬取的域名是dangdang.com。然後就會發現spider文件目錄下多了一個mydangdang文件。

三、修改代碼

1.items文件

<python>
# -*- 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 DangdangItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    name = scrapy.Field()
    price = scrapy.Field()
    link  = scrapy.Field()
    commet = scrapy.Field()

定義要爬取的商品名,價格,鏈接,評論數。

2.spider目錄下的mydangdang文件

<python>
# -*- coding: utf-8 -*-
import scrapy
from dangdang.items import DangdangItem

class mydangdangSpider(scrapy.Spider):
    name = "mydangdang"
    allowed_domains = ["dangdang.com"]
    start_urls = ['http://category.dangdang.com/cid4002203.html']

    def parse(self, response):
        item = DangdangItem()
        item["name"] = response.xpath("//a[@name='itemlist-title']/@title").extract()
        item["price"] = response.xpath("//span[@class='price_n']/text()").extract()
        item["link"] = response.xpath("//a[@name='itemlist-title']/@href").extract()
        item["commet"] = response.xpath("//a[@name='itemlist-review']/text()").extract()
        #print(item["name"])
        #print(item["price"])
        #print(item["link"])
        #print(item["commet"])
        yield item

其中用到了Xpath表達式,之前我還在傻傻的用re正則表達式,那個很痛苦呀,少了一個小空格,一個小點都不能玩。自從接觸到了Xpath我就深深地愛上了它。
比如我想爬取商品名,如下圖:
這裏寫圖片描述
按F12分析源碼:

<a title=" 包郵 RICH/萊彩 HD-913 數碼攝像機 攝影機 1080P 高清 暫停 家用 DV錄像機 照相機  2400萬像素 觸控屏 時間顯示 " href="http://product.dangdang.com/1075438006.html" name="itemlist-title" dd_name="單品標題" ddclick="act=normalResult_title&amp;pos=1075438006_0_1_m" target="_blank"> 包郵 RICH/萊彩 HD-913 數碼攝像機 攝影機 1080P 高清 暫停 家用 DV錄像機 照相機  2400萬像素 觸控屏 時間顯示 </a>

對應的Xpath 語句就是

item["name"] = response.xpath("//a[@name='itemlist-title']/@title").extract()

//表示獲取所有的滿足該標籤的信息。
a對應源碼中的a屬性。
@name = ‘itemlist-title’表示name屬性爲itemlist-title的代碼段。
/@title表示找到屬性爲title對應的值。

最後返回item

3. settings文件的修改

找到ITEM_PIPELINES這一行,做如下修改:

ITEM_PIPELINES = {
   'dangdang.pipelines.DangdangPipeline': 300,
}

找到COOKIES_ENABLED這一行,做如下修改:

COOKIES_ENABLED = False

這個修改是因爲有的網站通過cookies來反爬蟲,我們把它設置爲False就可以避免爬蟲失敗。
此外還可以將ROBOTSTXT_OBEY 設置爲False,這樣就不用遵守爬蟲協議。

4. pipelines文件

pipelines文件是關鍵,它是用來處理返回的item,並將它保存到數據庫。

<python>
# -*- coding: utf-8 -*-

# 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

import MySQLdb

def dbHandle():
    conn = MySQLdb.connect('localhost', '用戶名', '自己的密碼', '數據庫名',charset='utf8')
    return conn

class DangdangPipeline(object):
    def process_item(self, item, spider):
        dbObject = dbHandle()
        cursor = dbObject.cursor()
        sql ='insert into dangdang(id,name,price,link,commet) values(%s,%s,%s,%s,%s)'

        for j in range(len(item["name"])):
            try:
                cursor.execute(sql,(j+1,item["name"][j],item["price"][j],item["link"][j],item["commet"][j]))
                dbObject.commit()
            except Exception ,e:
                print(e)
                dbObject.rollback()
        return item

在這裏我已經在MySQL裏設置好了數據表,具體設置方法可以百度,最簡單的方法是在MySQL可視化軟件裏設置就OK了。

5. 運行爬蟲

我寫的爬蟲只是個小測試,只爬取第一頁,如果想爬取更多的數據可以設置循環自動爬取多少頁。本來爬蟲就不是個什麼好事,所以建議沒有特別的需要就不要給服務器增加額外的負擔了。
運行爬蟲也很簡單,命令行輸入:

scrapy crawl mydangdang

就OK了。運行結果如下:
這裏寫圖片描述

是不是感覺離數據分析又近了一步喃。

發佈了30 篇原創文章 · 獲贊 23 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章