Передача результатов scrapy в базу данных mysql

Я пытаюсь создать небольшой скребок для сортировки какой-либо новостной темы в качестве хобби-проекта (я не профессиональный разработчик или технический парень, я новичок в ООП и Python, у меня есть некоторый опыт работы с языками программирования php и arduino ). Мне удалось понять scrapy и частичную трубу mysql. Если я заменю элемент ['titlu'] и элемент ['articol'] простой строкой, база данных будет заполнена этим. Я искал и читал много информации, но я совершенно не могу решить свою проблему. Я полагаю, что item ['titlu'] и item ['articol'] - это какой-то тип массива или что-то, что не нравится mysql. Я отправлю код и ошибки для помощи. Прокомментированные строки кода - это некоторые из моих попыток решить проблему. Таблица базы данных mysql:

CREATE TABLE `ziare_com` (
  `id` int(11) NOT NULL,
  `titlu` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `articol` varchar(20000) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL

Я также попытался изменить тип текста title и articol на varchar. Специально я привел пример такой таблицы (с одним текстом filde и другим varchar), чтобы вы знали, какие настройки я пробовал.

Спасибо:

паук:

  def parse(self, response):
     #pass
     for link in response.xpath('//h2[@class = "titlu_sec"]/a/@href').extract():
         yield response.follow(link, callback=self.parse_detail)
 def parse_detail(self, response):
     item = RezultScrap()
     #for quote in response.css('div.quote')
     item['titlu'] = response.css(".titlu_stire::text").extract()
     item['articol'] = response.css(".descriere_main::text").extract()
     return item

         #item['titlu'] = response.xpath('//div[contains(@id, "interior_left")]/h1/text()').extract_first()
         #item['articol'] = response.xpath('//div[contains(@id, "content_font_resizable")]//text()').extract()
     #titlu = response.css(".titlu_stire::text").extract()
     #articol = response.css(".descriere_main::text").extract()
         #yield item
     #titul1 = re.sub(r"['\\]","", titlu)
     #articol1 =  re.sub(r"['\\]","", articol)


    # yield {
     #        'titlu':titlu,
      #       'articol':articol
             #titlu,
             #articol
     #}

items.py:

import scrapy


 class FirstItem(scrapy.Item):
     # define the fields for your item here like:
     # name = scrapy.Field()
     pass
 class RezultScrap(scrapy.Item):
     titlu=scrapy.Field()
     articol=scrapy.Field()

pipelines.py:

import pymysql
 #from scrapy.exceptions import DropItem
 #pmysql.escape_string("'")
 from first.items import RezultScrap


 class Mysql(object):
         def __init__(self):
             self.connection = pymysql.connect("localhost","xxxxxx","xxxx","ziare")
             self.cursor = self.connection.cursor()


         def process_item(self, item, spider):
             #titlu1 = [pymysql.escape_string(item['titlu'])]
             #articol1 = [pymysql.escape_string(item['articol'])]
             #self.cursor.execute
             #query  = "INSERT INTO ziare_com (titlu, articol) VALUES (%s, %s)"
             query  = "INSERT INTO ziare_com (titlu, articol) VALUES (%s, %s) % (item['titlu'], item['articol'])"
             self.cursor.execute(query)
             #self.cursor.executemany(query)
             self.connection.commit()
             #return item

         def close_spider(self, spider):
             self.cursor.close()
             self.connection.close()

Ошибки заключаются в следующем:

Это когда я использую self.cursor.executemany (query)

TypeError: executemany() missing 1 required positional argument: 'args'

и это когда я использую self.cursor.execute (запрос) Я получаю это:

pymysql.err.ProgrammingError: (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 '%s, %s) % (item['titlu'], item['articol'])' at line 1")

Попробуйте заключить переменные в кавычки и переместить кортеж из вашей строки: 'INSERT INTO ziare_com (titlu, articol) VALUES ("% s", "% s")'% (item ['titlu'], item ['articol') ])

vezunchik 06.12.2018 11:51
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
144
1

Ответы 1

Правильный код в process_item:

def process_item(self, item, spider):

    query  = "INSERT INTO ziare_com (titlu, articol) VALUES (%s, %s)"
    self.cursor.execute(query, [ item['titlu'], item['articol'] ])
    self.connection.commit()
    return item

Вам просто нужно записать %s для значений, а затем передать их в виде списка (массива) в методе execute

Кроме того, вы должны узнать о форматировании строк

Ты делал

"INSERT INTO ziare_com (titlu, articol) VALUES (%s, %s) % (item['titlu'], item['articol'])"

Все это строка, вы вообще не передаете значения в свою строку

вот исправленное заявление

"INSERT INTO ziare_com (titlu, articol) VALUES (%s, %s) " % ((item['titlu'], item['articol']))

Другие вопросы по теме