Конвейер Scrapy-MySQL не сохраняет данные

Я очищаю веб-сайт для его внешних ссылок, используя scrapy, и сохраняю эти ссылки в базе данных MYSQl. я использовал фрагмент в своем коде. когда я запускаю паука, я вижу, что ссылки удаляются, но выдает ошибку

2018-03-07 13:33:27 [scrapy.log] ОШИБКА: не все аргументы преобразуются при форматировании строки

Понятно, что ссылки не конвертируются в строку из-за точек, косых черт, запятых и тире. Итак, как я могу передать ссылки и сохранить их без ошибок.TIA

pipeline.py

from scrapy import log
from twisted.enterprise import adbapi
import MySQLdb.cursors


class MySQLStorePipeline(object):

def __init__(self):
    self.dbpool = adbapi.ConnectionPool('MySQLdb', db='usalogic_testdb',
            user='root', passwd='1234', cursorclass=MySQLdb.cursors.DictCursor,
            charset='utf8', use_unicode=True)

def process_item(self, item, spider):
    # run db query in thread pool
    query = self.dbpool.runInteraction(self._conditional_insert, item)
    query.addErrback(self.handle_error)

    return item

def _conditional_insert(self, tx, item):
    # create record if doesn't exist. 
    # all this block run on it's own thread
    tx.execute("select * from test where link = %s", (item['link'], ))
    result = tx.fetchone()
    if result:
        log.msg("Item already stored in db: %s" % item, level=log.DEBUG)
    else:
        tx.execute(\
            "insert into test (link) "
            "values (%s)",
            (item['link'])
        )
        log.msg("Item stored in db: %s" % item, level=log.DEBUG)

def handle_error(self, e):
    log.err(e)

Когда при задании команды запуска ITEMS.py

class CollectUrlItem(scrapy.Item):
link = scrapy.Field()

settings.py

ITEM_PIPELINES = {

'rvca4.pipelines.MySQLStorePipeline': 800,
}

person Anshuman Singh    schedule 07.03.2018    source источник


Ответы (1)


Я думаю, если вы используете список вместо кортежа, это сработает

tx.execute(\
        "insert into test (link) "
        "values (%s)",
        [ item['link'] ]
    )

ИЛИ добавьте запятую в кортеж

tx.execute(\
        "insert into test (link) "
        "values (%s)",
        (item['link'], )
    )

Потому что добавление запятой в конце кортежа делает его кортежем. Читай ниже

(1)  # the number 1 (the parentheses are wrapping the expression `1`)
(1,) # a 1-tuple holding a number 1
person Umair Ayub    schedule 07.03.2018