Получение sqlite3.OperationalError: нераспознанный токен: ":" при вызове обновления БД - PullRequest
0 голосов
/ 16 июня 2019

Получение ошибки при попытке обновить столбец в БД в моем файле конвейеров, функция set_data_update.То, что я пытаюсь сделать, это использовать функцию get_data для возврата URL-адреса и цены, для каждого возвращаемого URL-адреса вызывать функцию set_data_update, где я заменю существующую new_price на old_price, а затем помещаю новую очищенную цену в new_price.,Похоже, мой вызов set_data_update в get_data всегда выполняется дважды.Он должен запускаться один раз, потому что на данный момент у меня есть только одна строка в БД для второго URL-адреса - "https://www.amazon.com/Hamilton-Beach-46310-Programmable-Coffee/dp/B07684BPLB/ref=sr_1_10?keywords=coffee+maker&qid=1559098604&s=home-garden&sr=1-10".

. Также я вижу ошибку в трассировке

sqlite3.OperationalError: нераспознанный токен: ":"

products.json

{
"itemdata": [ 
    {   "url": "https://www.amazon.com/dp/B07GWKT87L/?`coliid=I36XKNB8MLE3&colid=KRASGH7290D0&psc=0&ref_=lv_ov_lig_dp_it#customerReview",`
        "title": "coffee_maker_black_and_decker",
        "name": "Cobi Maguire",
        "email": "cobi@noemail.com"
    },
    {   "url": "https://www.amazon.com/Hamilton-Beach-46310-Programmable-Coffee/dp/B07684BPLB/ref=sr_1_10?keywords=coffee+maker&qid=1559098604&s=home-garden&sr=1-10",
        "title": "coffee_maker_hamilton_beach",
        "name": "Ryan Murphy",
        "email": "ryan@noemail.com"
    }
    ]
}

Ошибка Traceback-Traceback (последний вызов последнего):(price_monitor) C: \ Users \ hassy \ Documents \ python_venv \ price_monitor \ price_monitor> сканирование scrap Price_monitor 2019-06-15 17:00:10 [scrapy.utils.log] ИНФОРМАЦИЯ: Scrapy 1.6.0 запущена (бот: price_monitor)2019-06-15 17:00:10 [scrapy.utils.log] ИНФОРМАЦИЯ: Версии: lxml 4.3.3.0, libxml2 2.9.5, cssselect 1.0.3, parsel 1.5.1, w3lib 1.20.0, Twisted 19.2.0, Python 3.6.5 (v3.6.5: f59c0932b4, 28 марта 2018, 16:07:46) [MSC v.1900 32 бит (Intel)], pyOpenSSL 19.0.0 (OpenSSL 1.1.1b 26 февраля 2019 г.), криптография 2.6.1, платформа Windows-10-10.0.17134-SP0 2019-06-15 17:00:10 [scrapy.crawler] ИНФОРМАЦИЯ: Переопределенные настройки: {'BOT_NAME': 'price_monitor', 'NEWSPIDER_MODULE': 'price_monitor.spiders ',' ROBOTSTXT_OBEY ': True,' SPIDER_MODULES ': [' price_monitor.spiders '],' USER_AGENT ':' User-Agent: Mozilla / 5.0 (Macintosh;Intel Mac OS X 10_13_6) AppleWebKit / 537.36 (KHTML, как Gecko) Chrome / 69.0.3497.100 Safari / 537.36 '} 2019-06-15 17:00:10 [scrapy.extensions.telnet] ИНФОРМАЦИЯ: Пароль Telnet: 3c0578dfed20521c 2019-06-15 17:00:10 [scrapy.middleware] ИНФОРМАЦИЯ: Включенные расширения: ['scrapy.extensions.corestats.CoreStats', 'scrapy.extensions.telnet.TelnetConsole', 'scrapy.extensions.logstats.LogStats'] 2019-06-15 17:00:10 [scrapy.middleware] ИНФОРМАЦИЯ: Включено промежуточное программное обеспечение загрузчика: ['scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware', 'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware', 'scrapy.downloaderToutoutMidoutMidOdMode.Did., «scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware», «scrapy.downloadermiddlewares.useragent.UserAgentMiddleware», «scrapy.downloadermiddlewares.retry.RetryMiddleware», «scrapy.downloadermidwarewareReditionMididMiddlePressMiddleDiddMiddleDiddleMiddlePressMiddleDiddleMiddlePressMiddlePlayDidDidMiddlePressMiddleMiddlePressMiddleMiddlePressMiddlePidMiddleMiddlePressMiddleMiddlePressMiddlePlayDidMiddlePressMiddleMiddleMiddleMid'scrapy.downloadermiddlewares.redirect.RedirectMiddleware ',' scrapy.downloadermiddlewares.cookies.CookiesMiddleware ',' scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware ',' scrapy.downloadermiddlewares.stats.DownloaderStats '] 20110-06 17:00промежуточное программное обеспечение] ИНФОРМАЦИЯ: Включено промежуточное программное обеспечение для пауков: ['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware', 'scrapy.spidermiddlewarewares.offsite.OffsiteMiddleware', 'scrapy.spidermiddlewares.referer.RefererMiddleware','idid.idledle.Ul.dledle.rl.scher.rlscrapy.spidermiddlewares.depth.DepthMiddleware '] 2019-06-15 17:00:10 [scrapy.middleware] ИНФОРМАЦИЯ: конвейеры включенных элементов: [' price_monitor.pipelines.PriceMonitorPipeline '] 2019-06-15 17:00:10 [scrapy.core.engine] ИНФОРМАЦИЯ: Паук открыт 2019-06-15 17:00:10 [scrapy.extensions.logstats] ИНФОРМАЦИЯ: Сканировано 0 страниц (при 0 страницах / мин), очищено 0 элементов (при 0 элементах / мин)2019-06-15 17:00:10 [scrapy.extensions.telnet] ИНФОРМАЦИЯ: Консоль Telnet прослушивает 127.0.0.1:6023 2019-06-15 17:00:11 [scrapy.core.engine] DEОшибка: сканировано (200) https://www.amazon.com/robots.txt> (реферер: нет) 2019-06-15 17:00:11 [scrapy.downloadermiddlewares.redirect] ОТЛАДКА: Перенаправление (301) на https://www.amazon.com/BLACK-DECKER-CM4202S-Programmable-Coffeemaker/dp/B07GWKT87L> с https://www.amazon.com/dp/B07GWKT87L/?coliid=I36XKNB8MLE3&colid=KRASGH7290D0&psc=0&ref_=lv_ov_lig_dp_it#customerReview>2019-06-15 17:00:11 [scrapy.downloadermiddlewares.redirect] ОТЛАДКА: Перенаправление (301) на https://www.amazon.com/Hamilton-Beach-46310-Programmable-Coffee/dp/B07684BPLB> с https://www.amazon.com/Hamilton-Beach-46310-Programmable-Coffee/dp/B07684BPLB/ref=sr_1_10?keywords=coffee+maker&qid=1559098604&s=home-garden&sr=1-10> 2019-06-15 17:00:12 [scrapy.core.engine] ОТЛАДКА: Сканировано (200) https://www.amazon.com/BLACK-DECKER-CM4202S-Programmable-Coffeemaker/dp/B07GWKT87L> (реферер: нет) 2019-06-15 17:00:12 [scrapy.core.engine] ОТЛАДКА: Сканировано (200) https://www.amazon.com/Hamilton-Beach-46310-Programmable-Coffee/dp/B07684BPLB> (рефери: нет) Печать строк ('https://www.amazon.com/Hamilton-Beach-46310-Programmable-Coffee/dp/B07684BPLB/ref=sr_1_10?keywords=coffee+maker&qid=1559098604&s=home-garden&sr=1-10',' $ 37,99 ') вызов функции 2019-06-15 17:00:12 [scrapy.core.scraper] ОШИБКА: Ошибка обработки {'email': 'ryan@noemail.com', 'name': 'Ryan Murphy', цена: $ 49,99, 'title': 'BLACK + DECKER CM4202S Программируемый набор простого размера' «Кофеварка, очень большая емкость 80 унций, нержавеющая сталь», 'url': 'h'} Traceback (последний вызов был последним): Файл "c: \ users \ hassy \ documents \ python_venv \ price_monitor \ lib \ site-packages \ twisted \ internet \ defer.py", строка 654, в _runCallbacks current.result = обратный вызов (current.result, * args, ** kw) Файл "c: \ users \ hassy \ documents \ python_venv \ price_monitor \ price_monitor \ pipelines.py", строка 37, в process_item self.get_data (пункт) Файл "c: \ users \ hassy \ documents \ python_venv \ price_monitor \ price_monitor \ pipelines.py", строка 60, в get_data self.set_data_update (item, url, new_price) Файл "c: \ users \ hassy \ documents \ python_venv \ price_monitor \ price_monitor \ pipelines.py", строка 88, в set_data_update {'old_price': old_price, 'new_price': item ['price']}) sqlite3.OperationalError: нераспознанный токен: ":" Печать строк ('https://www.amazon.com/Hamilton-Beach-46310-Programmable-Coffee/dp/B07684BPLB/ref=sr_1_10?keywords=coffee+maker&qid=1559098604&s=home-garden&sr=1-10',' $ 37,99 ') вызов функции 2019-06-15 17:00:12 [scrapy.core.scraper] ОШИБКА: Ошибка обработки {'email': 'ryan@noemail.com', 'name': 'Ryan Murphy', цена: $ 34,99, title: «Программируемая кофеварка Hamilton Beach 46310, 12 чашек, черная», 'url': 'h'} Traceback (последний вызов был последним): Файл "c: \ users \ hassy \ documents \ python_venv \ price_monitor \ lib \ site-packages \ twisted \ internet \ defer.py", строка 654, в _runCallbacks current.result = обратный вызов (current.result, * args, ** kw) Файл "c: \ users \ hassy \ documents \ python_venv \ price_monitor \ price_monitor \ pipelines.py", строка 37, в process_item self.get_data (пункт) Файл "c: \ users \ hassy \ documents \ python_venv \ price_monitor \ price_monitor \ pipelines.py", строка 60, в get_data self.set_data_update (item, url, new_price) Файл "c: \ users \ hassy \ documents \ python_venv \ price_monitor \ price_monitor \ pipelines.py", строка 88, в set_data_update {'old_price': old_price, 'new_price': item ['price']}) sqlite3.OperationalError: нераспознанный токен: ":" 2019-06-15 17:00:12 [scrapy.core.engine] ИНФОРМАЦИЯ: Закрытие паука (готово) 2019-06-15 17:00:12 [scrapy.statscollectors] ИНФОРМАЦИЯ: Статистика Dumping Scrapy: {'downloader / request_bytes': 1888, 'downloader / request_count': 5, 'downloader / request_method_count / GET': 5, 'downloader / response_bytes': 261495, 'downloader / response_count': 5, 'downloader / response_status_count / 200': 3, 'downloader / response_status_count / 301': 2, 'finish_reason': 'done', 'finish_time': datetime.datetime (2019, 6, 15, 21, 0, 12, 534906), 'log_count / DEBUG': 5, 'log_count / ERROR': 2, 'log_count / INFO': 9, 'response_received_count': 3, 'robotstxt / request_count': 1, 'robotstxt / response_count': 1, 'robotstxt / response_status_count / 200': 1, «Планировщик / снят с очереди»: 4, 'планировщик / удаленный / память': 4, «Планировщик / в очереди»: 4, «Планировщик / в очереди / память»: 4, 'start_time': datetime.datetime (2019, 6, 15, 21, 0, 10, 799145)} 2019-06-15 17:00:12 [scrapy.core.engine] ИНФОРМАЦИЯ: Паук закрыт (закончено)

(price_monitor) C:\Users\hassy\Documents\python_venv\price_monitor\price_monitor>

pipelines.py

import sqlite3


class PriceMonitorPipeline(object):

    def __init__(self):
        self.create_connection()
        self.create_table()

    def create_connection(self):
        self.conn = sqlite3.connect("price_monitor.db")
        self.curr = self.conn.cursor()

    def process_item(self, item, spider):
#        self.store_data(item)
        print("printing items")
        print(item['title'])
        print(item['price'])
        self.get_data(item)
        return item

    def get_data(self, item):
        """ Check if the row already exists for this url """
        rows = 0
        url = ''
        new_price = ''
        self.rows = rows
        self.url = url
        self.new_price = new_price


        self.curr.execute("""select url, new_price from price_monitor WHERE url =:url""",
                          {'url': item['url']})

        rows = self.curr.fetchone()
        print("Printing rows")
        print(rows)
        rows_url = rows[0]
        new_price = rows[1]

    if rows is not None:
        for item['url'] in rows_url:
            print("calling func")
            self.set_data_update(item, url, new_price)
    else:
        pass

    def set_data_update(self, item, url, new_price):

        url = 'https://www.amazon.com/Hamilton-Beach-46310-Programmable-Coffee/dp/B07684BPLB/ref=sr_1_10?keywords=coffee+maker&qid=1559098604&s=home-garden&sr=1-10'
        old_price = new_price
        price = item['price']
        print("printing old price")
        print(old_price)
        print("New Price".format(item['price']))
        self.curr.execute("""update price_monitor SET old_price=: old_price, new_price=: new_price
                              WHERE url=: url""",
                          {'old_price': old_price, 'new_price': price})

        self.conn.commit()

items.py

import scrapy


class AmazonItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    url = scrapy.Field()
    title = scrapy.Field()
    price = scrapy.Field()
    name = scrapy.Field()
    email = scrapy.Field()

Паук

import scrapy
import json
import sys

from ..items import AmazonItem


class MySpider(scrapy.Spider):
    name = 'price_monitor'
    newlist = []
    start_urls = []
    itemdatalist = []
    with open('C:\\Users\\hassy\\Documents\\python_venv\\price_monitor\\price_monitor\\products.json') as f:
        data = json.load(f)

        itemdatalist = data['itemdata']

        for item in itemdatalist:
            start_urls.append(item['url'])

    def start_requests(self):

        for item in MySpider.start_urls:

            yield scrapy.Request(url=item, callback=self.parse)

    def parse(self, response):
        for url in MySpider.start_urls:
            scrapeitem = AmazonItem()

            title = response.css('span#productTitle::text').extract_first()
            title = title.strip()
            price = response.css('span#priceblock_ourprice::text').extract_first()

            scrapeitem['title'] = title
            scrapeitem['price'] = price

        for item in MySpider.data['itemdata']:
            url = item['url']
            name = item['name']
            email = item['email']

            scrapeitem['url'] = url
            scrapeitem['name'] = name
            scrapeitem['email'] = email

        yield scrapeitem
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...