Я пытаюсь создать небольшой скребок для сортировки какой-либо новостной темы в качестве хобби-проекта (я не профессиональный разработчик или технический парень, я новичок в ООП и 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")






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