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&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了。運行結果如下:
是不是感覺離數據分析又近了一步喃。