我已经尝试了几个小时来解决这个问题,但仍然无法使其正常工作。我正在使用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 method:
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 \')
当我打印params并从异常块查询时,我有:
查询变量:
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很新,不确定我在SO上检查了另一个问题,要按照这种语法插入MySQL数据库,即:
self.db.insert(query,params)
以上代码在我的本地计算机上运行正常但在服务器上失败。请指导我正确的方向。 非常感谢你!
答案 0 :(得分:1)
看起来像元组封装是你的问题。输出是什么:
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-wise:如果其中一个嵌入式元组长度为零,会发生什么? (提示:例外)。我还没有填写其余内容,因为看起来你在item
中有一些根本没有被封装的元素,而其他元素被双重封装。
此外,在此之后,您的数据可能会有一些编码错误,因为您的某些元素是unicode,而其他元素则不是。例如:
(u'Sydney',) ... ('Pending',)
您可能想要确切地检查您的架构需要什么。