无法使用python和scrapy管道将数据插入mysql

lokaqttq  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(279)

我已经试了几个小时来解决这个问题,但仍然不能使它正常工作。我正在使用scrapy从一个网站抓取数据,然后尝试将其插入mysql数据库。这是我的数据库代码:

import MySQLdb

class Database:

host = 'localhost'
user = 'root'
password = 'test123'
db = 'scraping_db'

def __init__(self):
    self.connection = MySQLdb.connect(self.host, self.user, self.password, self.db,use_unicode=True, charset="utf8")
    self.cursor = self.connection.cursor()

def insert(self, query,params):
    try:
        self.cursor.execute(query,params)
        self.connection.commit()
    except Exception as ex:
        self.connection.rollback()

def __del__(self):
    self.connection.close()

这是我的管道代码,我在这里进行插入查询并传递到上面类的insert方法:

from con import Database

class LinkPipeline(object):

    def __init__(self):
        self.db=Database()

    def process_item(self, item, spider):
        query="""INSERT INTO links (title, location,company_name,posted_date,status,company_id,scraped_link,content,detail_link,job_id) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s,%s)"""
        params=(item['title'], item['location'], item['company_name'], item['posted_date'], item['status'], item['company_id'], item['scraped_link'], item['content'], item['detail_link'],item['job_id'])
        self.db.insert(query,params)
        return item

这在我的本地机器上完全正常。但在服务器上,我得到以下错误:

1064, 'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \')

当我打印参数并从异常块查询时,我有这样一个:
查询变量:

INSERT INTO links (title, location,company_name,posted_date,status,company_id,scraped_link,content,detail_link,job_id) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s,%s)

params变量:

((u'Account Leader, Sr',), (u'Sydney',), (u'\n    Halliburton',), (datetime.datetime(2018, 4, 9, 21, 55, 46, 789575),), ('Pending',), ([u'0e4554ac6dcff427'],), (u'https://www.site.com.au/rc/clk?jk=3f41218887882940&fccid=0e4554ac6dcff427&vjs=3',), 'Job Content', 'https://jobs.halliburton.com/job/Account-Leader%2C-Sr-IS/437741300/?feedId=162400', ([u'3f41218887882940'],))

我觉得元组数据是mysql字符串由于引号而断裂的罪魁祸首。但是我对python非常陌生,我不确定我是否还问了另一个问题,所以要按照以下语法插入mysql数据库,即:

self.db.insert(query,params)

上面的代码在我的本地机器上运行良好,但在服务器上失败。请把我引向正确的方向。非常感谢你!

pepwfjgg

pepwfjgg1#

看起来元组封装是你的问题。输出是什么:

print( repr( item['location'] ))

这就是“打印(编码者的)项目['location']的表示”(而不是试图聪明地打印)。

>>> print( repr( item['location'] ))
('Sydney',)     # A tuple, 1-long, containing a string

>>> print( repr( item['location'] ))
'Sydney'        # A string

如果是第一个,那么您在 item 显然有一个额外的封装层,而您的代码并没有考虑到这一层。快速和肮脏的方法让你起来和运行:

def process_item(self, item, spider):
    query="""INSERT INTO links (title, location,company_name,posted_date,status,company_id,scraped_link,content,detail_link,job_id) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s,%s)"""
    params=(item['title'][0], item['location'][0], ...
    self.db.insert(query,params)
    return item

请注意,这并不是一个健壮的解决方案,就api而言:如果其中一个嵌入式元组的长度为零,会发生什么(提示:异常)。剩下的我也没有填,因为看起来你有一些元素在里面 item 完全没有封装的,还有一些是双重封装的。
此外,在此之后,您的数据可能会有一些编码错误,因为您的某些元素是unicode,而其他元素不是。例如:

(u'Sydney',)  ...    ('Pending',)

您可能需要检查您的模式到底需要什么。

相关问题