2014-12-05 50 views
1

我試圖讓使用scrapy我可以得到CSV數據從Amazon的數據,但我不能夠插入數據在mysql數據庫 請找我的代碼 我的蜘蛛如何從scrapy數據插入到mysql

import scrapy 
from craigslist_sample.items import AmazonDepartmentItem 
from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors import LinkExtractor 

class AmazonAllDepartmentSpider(scrapy.Spider): 

    name = "amazon" 
    allowed_domains = ["amazon.com"] 
    start_urls = [ 
     "http://www.amazon.com/gp/site-directory/ref=nav_sad/187-3757581-3331414" 
    ] 
    def parse(self, response): 
     for sel in response.xpath('//ul/li'): 
      item = AmazonDepartmentItem() 
      item['title'] = sel.xpath('a/text()').extract() 
      item['link'] = sel.xpath('a/@href').extract() 
      item['desc'] = sel.xpath('text()').extract() 
     return item 

我的流水線代碼是

import sys 
import MySQLdb 
import hashlib 
from scrapy.exceptions import DropItem 
from scrapy.http import Request 

class MySQLStorePipeline(object): 


    host = 'rerhr.com' 
    user = 'amazon' 
    password = 'sads23' 
    db = 'amazon_project' 

    def __init__(self): 
     self.connection = MySQLdb.connect(self.host, self.user, self.password, self.db) 
     self.cursor = self.connection.cursor() 

    def process_item(self, item, spider): 
     try: 
      self.cursor.execute("""INSERT INTO amazon_project.ProductDepartment (ProductDepartmentLilnk) 
          VALUES (%s)""", 
          (
          item['link'].encode('utf-8'))) 

      self.connection.commit() 

     except MySQLdb.Error, e: 
      print "Error %d: %s" % (e.args[0], e.args[1]) 
     return item 

當我運行以下命令

scrapy爬行亞馬遜-o items.csv -t CSV

那麼我可以能夠得到的數據在我的CSV 但是當我運行

scrapy爬行亞馬遜

與上面的代碼我不是能夠在MySQL enter image description here 插入數據,請幫助我什麼,我們必須做的話,我可以在MySQL中插入數據

感謝

+0

什麼是控制檯?任何錯誤?管道是否在設置中打開?你確定你正在檢查結果到你插入的同一個數據庫嗎?謝謝。 – alecxe 2014-12-05 15:02:09

+0

我的管道設置是ITEM_PIPELINES = ['projectname.pipelines.MySQLStorePipeline'],是的,我正在檢查相同的數據庫 – wiretext 2014-12-05 15:19:24

回答

5

問題實際上是在parse()回調中。 extract()調用返回列表,因此所有項目字段值都將成爲列表。然後,item['link'].encode('utf-8')調用管道失敗,因爲列表上沒有encode()方法。

一個快速和簡單的解決將是獲得extract()調用結果的第一要素:

def parse(self, response): 
    for sel in response.xpath('//ul/li'): 
     item = AmazonDepartmentItem() 
     item['title'] = sel.xpath('a/text()').extract()[0] 
     item['link'] = sel.xpath('a/@href').extract()[0] 
     item['desc'] = sel.xpath('text()').extract()[0] 
     yield item 

請注意,我也有一個yield item取代return item表達,並把它的循環中。


一個更好的方法是定義與輸入和輸出處理器ItemLoader

from scrapy.contrib.loader import ItemLoader 
from scrapy.contrib.loader.processor import TakeFirst 

class ProductLoader(ItemLoader): 
    default_output_processor = TakeFirst() 

僅供參考,這裏是TakeFirst()做:

返回第一個非空值/非空值, ,所以它通常用作單值字段的輸出處理器。 它沒有收到任何構造函數參數,也不接受Loader 上下文。

然後,parse()方法將轉變爲:

def parse(self, response): 
    for sel in response.xpath('//ul/li'): 
     l = ItemLoader(item=AmazonDepartmentItem(), selector=sel) 
     l.add_xpath('title', 'a/text()') 
     l.add_xpath('link', 'a/@href') 
     l.add_xpath('desc', 'text()') 
     yield l.load_item() 
+0

你是天才感謝夥計:)你救了我充裕的時間 – wiretext 2014-12-05 16:14:30