MySQLdb和Scrapy:INSERT INTO错误

时间:2014-06-30 19:34:39

标签: python mysql scrapy

我正在尝试使用INSERT INTO命令使用Scrapy和MySQLdb将已删除的数据放入本地MySQL数据库中,并且我一直试图将这个数据计算好几天,但还没有找到解决方案。我希望有人可以帮助我理解我做错了什么,因为我不熟悉Python。

这是spider.py:

from scrapy.selector import Selector
from scrapy.contrib.spiders import CrawlSpider
from scrapy.log import *
from folketing_crawler.settings import *
from folketing_crawler.items import FolketingCrawlerItem

class FolketingSpider(CrawlSpider):
    name = 'ft2'
    allowed_domains = ["ft.dk"]
    start_urls = ["http://www.ft.dk/Dokumenter/Vis_efter_type/Beslutningsforslag.aspx?session=&caseStatus=-1&ministerArea=-1&committee=&proposedBy=1&startDate=20110915&endDate=20140421&dateRelatedActivity=100242%2f200049&sortColumn=&sortOrder=&startRecord=&totalNumberOfRecords=&numberOfRecords=999&pageNr=#dok"]

    def parse(self, response):
        sel = Selector(response)
        item = FolketingCrawlerItem()
        item['nr'] = sel.xpath('/html/body/form/div[3]/div/div[2]/div[5]/div/div/table/tbody/tr/td[1]/text()').extract()
        return item

这是pipelines.py:

import sys
import MySQLdb
import MySQLdb.cursors
import hashlib
from scrapy.exceptions import DropItem
from scrapy.http import Request
from scrapy.item import Item, Field

class FolketingCrawlerPipeline(object):
    def process_item(self, item, spider):
        db = MySQLdb.connect(user='root', passwd='password', db='ftdb', host='localhost', charset="utf8", use_unicode=True)
        cursor = db.cursor()  
        cursor.execute("INSERT INTO employees (hire_date) VALUES (%s)", item['nr'])
        db.commit()

        print "INSERT was successful"
        return item

这是items.py:

from scrapy.item import Item, Field

class FolketingCrawlerItem(Item):
    nr = Field()

并在settings.py中添加了这个来调用管道:

ITEM_PIPELINES = {
    'folketing_crawler.pipelines.FolketingCrawlerPipeline': 500
}

看来pipe.py中的“cursor.execute”是错误的,但我尝试了我可以在网上找到的每个不同版本,包括:

cursor.execute("INSERT INTO employees (hire_date) VALUES (%s)", item['nr'])
cursor.execute("""INSERT INTO employees (hire_date) VALUES (%s)""", item['nr'])
cursor.execute("INSERT INTO employees (hire_date) VALUES (%s)", (item['nr']))
cursor.execute("INSERT INTO employees (hire_date,) VALUES (%s,)", (item['nr'],))
cursor.execute("INSERT INTO employees (hire_date) VALUES (%s)", str(item['nr'])

我尝试了所有可能的组合,但问题可能在于蜘蛛,数据存储在项目['nr']中?运行上述scrapy项目时,我收到以下错误:

exceptions.TypeError: not all arguments converted during string formatting

希望有人可以帮助解决这个问题。我需要将数据列表连续存储,以便每个“片段”数据都在表中的新行上。

提前致谢。

3 个答案:

答案 0 :(得分:0)

hire_date看起来像一个SQL时间戳。为它提供一个Python datetime对象,如下所示:

cursor.execute("INSERT INTO employees (hire_date) VALUES (?)", (datetime.datetime.now(),) )

注意:execute总是只有一个参数,通常是一个元组。参考:https://docs.python.org/2/library/sqlite3.html#sqlite3.Cursor.execute

答案 1 :(得分:0)

我认为

item['nr'] = sel.xpath('/html/body/form/div[3]/div/div[2]/div[5]/div/div/table/tbody/tr/td[1]/text()').extract()

返回一个元组,你试过刚刚获得第一个元素。

item['nr'] = sel.xpath('/html/body/form/div[3]/div/div[2]/div[5]/div/div/table/tbody/tr/td[1]/text()').extract()[0]

答案 2 :(得分:0)

签入scrapy shell会话,

$ scrapy shell "http://www.ft.dk/Dokumenter/Vis_efter_type/Beslutningsforslag.aspx?session=&caseStatus=-1&ministerArea=-1&committee=&proposedBy=1&startDate=20110915&endDate=20140421&dateRelatedActivity=100242%2f200049&sortColumn=&sortOrder=&startRecord=&totalNumberOfRecords=&numberOfRecords=999&pageNr=#dok"
2014-07-01 01:29:28+0200 [scrapy] INFO: Scrapy 0.24.1 started (bot: scrapybot)
...
sel.xpath('/html/body/form/div[3]/div/div[2]/div[5]/div/div/table/tbody/tr/td[1]/text()').extract()
Out[1]: 
[u'B 2',
 u'B 3',
 u'B 4',
 u'B 5',
 u'B 6',
...
 u'B 88',
 u'B 89',
 u'B 90',
 u'B 91',
 u'B 92',
 u'B 93']

In [2]: 

如果你想在上面的列表中为每个元素存储1行,你应该使用类似的东西:

cursor.executemany("INSERT INTO employees (hire_date) VALUES (%s)",
                   [(nr,) for nr in item['nr']])