Невозможно вставить данные в MySQL, используя Python и конвейеры scrapy

0

Я пробовал часы, чтобы обойти это, но все равно не могу заставить его работать правильно. Я использую 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()

Вот мой код конвейера, где я делаю запрос на вставку и переходя к методу вставки класса выше:

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, не уверен, что я проверил в другом вопросе о SO, чтобы следовать этому синтаксису, чтобы вставить в базу данных MySQL, то есть:

self.db.insert(query,params)

Вышеприведенный код отлично работает на моей локальной машине, но не работает на сервере. Пожалуйста, направляйте меня в правильном направлении. Большое спасибо!

  • 0
    Ну, ему не нравится формат вашей новой строки '\ n Halliburton'. Это то, что ваша проблема. Возможно, это может помочь. , Не уверен, но, возможно, у python есть способ конвертировать переводы строк в разрывы страниц.
Теги:
scrapy

1 ответ

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: что произойдет, если один из этих встроенных кортежей имеет нулевую длину? (Подсказка: Исключение). Я также не заполнял все остальное, потому что похоже, что у вас есть элементы в item, которые не инкапсулированы вообще, а другие, которые дважды инкапсулированы.

Кроме того, после этого у вас могут быть некоторые ошибки кодирования, поскольку некоторые из ваших элементов являются юникодами, а другие - нет. Например:

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

Вы можете проверить, что именно требует ваша схема.

  • 0
    Большое спасибо за ответ. Вы действительно направили меня в правильном направлении своим пониманием. Таким образом, это означает, что все мои данные «item» имеют несовместимый формат, который необходимо исправить и сделать согласованным для вставки MySQL.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню