我正在尝试使用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
希望有人可以帮助解决这个问题。我需要将数据列表连续存储,以便每个“片段”数据都在表中的新行上。
提前致谢。
答案 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']])