Логика обновления уже очищенной цены в базе данных

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

Идентификатор структуры таблицы || Product_URL || Имя || Цена || Спецификация ||

Теперь на следующий день цена на некоторые товары уменьшится по сравнению со значением предыдущего дня, которое хранится в моей базе данных. Я хочу обновить цену в своей базе данных

Ежедневно в полночь запускается одна программа на Python и проверяет, какая из цен на товары изменилась, и если она изменилась, она обновит значение.

Я не хочу очищать все ссылки на продукты каждый день, потому что их очень много. Около 20 000 ссылок

Поэтому, пожалуйста, ребята, помогите мне с некоторой логикой, которую я должен применить, чтобы мне требовалось очищать только те ссылки на продукты, цены на которые изменились.


person Binit Singh    schedule 20.07.2013    source источник
comment
Есть ли в ссылках на продукты, которые вы очищаете, список обновленных продуктов, чтобы вы могли просто взять этот список и очистить эти конкретные продукты?   -  person Viren Rajput    schedule 20.07.2013
comment
Нет Не имеет списка обновленных продуктов   -  person Binit Singh    schedule 20.07.2013
comment
Я также ответил на случай, если в нем нет списка обновленных продуктов.   -  person Viren Rajput    schedule 20.07.2013


Ответы (1)


  1. Если на сайте продукта, который вы очищаете, есть страница, на которой перечислены ссылки на продукты, которые были недавно обновлены, вы можете очистить этот список и обновить эти продукты из списка.

  2. Но если на сайте нет страницы, где перечислены продукты, которые были недавно обновлены. Возможно, вам придется очистить все ссылки на продукты в поисках обновленных цен (ну, это не лучшее решение, но оно работает). Вы можете ускорить процесс, отправив несколько запросов.

    Это можно настроить в проекте settings, обновив CONCURRENT_REQUESTS необходимые соединения, которые вы хотели бы scrapy отправить.

    Поскольку вы упомянули, что существует ок. 20 000 ссылок на продукты, вы можете распределить эту задачу по очистке этих огромных номеров. среди рабочих сельдерея, которые будут запускать скребущихся пауков. Вы можете запустить около 4 воркеров, каждый из которых будет выполнять scrapy spider, и обрабатывать 5000 ссылок.

Ссылка http://doc.scrapy.org/en/latest/topics/settings.html

person Viren Rajput    schedule 20.07.2013
comment
Если я соскребу все ссылки, то как мне обновить ту же таблицу, потому что будет три случая, теперь у меня будут некоторые новые продукты, перечисленные на этой странице, и цены на некоторые продукты изменены, а некоторые цены не изменились - person Binit Singh; 20.07.2013
comment
вы можете распределить задачу очистки между несколькими работниками сельдерея, которые будут запрашивать вашу единую базу данных, сравнивать очищенное значение с существующим значением и обновлять значения БД. И он также проверит, существует ли очищенный продукт в БД, и если нет, он вставит новую запись для нового продукта. - person Viren Rajput; 20.07.2013
comment
Но вам нужно распределить задачу таким образом, чтобы один работник обрабатывал только ряд продуктов (вы можете использовать идентификатор продукта в качестве справки). Например. для идентификаторов продуктов (в диапазоне от 1 до 500) работник A будет обновлять записи для этих продуктов. А для идентификаторов продуктов (в диапазоне от 500 до 1000) работник B будет обновлять свои значения. И каждый раз, когда вы сталкиваетесь с записью, которой нет в БД, вам нужно вставить запись для каждой. Поэтому каждый раз перед вставкой записи вы можете запрашивать существующие записи. - person Viren Rajput; 20.07.2013
comment
хорошо, так как я использую mysql, я буду использовать Вставить в имя таблицы (product_url, имя, цена) значения (xxx, xxx, 555) на дублирующемся обновлении ключа цена = если (значения (цена)! = цена, значения (цена), цена ) и updated_status=1 - person Binit Singh; 20.07.2013
comment
какой драйвер mysql python используется? - person Viren Rajput; 20.07.2013
comment
Я использую оболочку Python MySqlDb. - person Binit Singh; 20.07.2013
comment
Ok! Синтаксис запроса на обновление кажется правильным! Но перед вставкой просто проверьте существующие записи, используя запрос выбора. - person Viren Rajput; 20.07.2013
comment
да, я проверяю, существует ли запись или нет в самом заявлении выше - person Binit Singh; 20.07.2013
comment
Тогда это решение должно работать для вас! Для ускорения процесса парсинга можно просто равномерно увеличить количество сельдереевых рабочих (пауков). - person Viren Rajput; 20.07.2013
comment
где product_url — это уникальный ключ, поэтому, если этот продукт уже находится в базе данных, он не будет вставлять его как новую запись, а только обновлять цену этой записи. - person Binit Singh; 20.07.2013
comment
Ага! И вместо того, чтобы использовать URL-адрес продукта, просто попробуйте отделить product_url (и получить путь к продукту) из URL-адреса! Это будет меньше накладных расходов - person Viren Rajput; 20.07.2013
comment
но вот еще одна путаница, я хочу обновить статус = 1, только если цена обновляется, как это сделать?? - person Binit Singh; 20.07.2013
comment
вместо использования update_status попробуйте использовать объект datetime! что-то вроде времени last_updated! Это должно быть более удобно - person Viren Rajput; 20.07.2013
comment
Создайте новое поле в своей БД с датой и временем (обратитесь к синтаксису Mysql) и используйте модуль datetime python для обновления даты. При обновлении метки времени last_updated просто назначьте datetime.datetime.now(), это вернет текущую метку времени. - person Viren Rajput; 20.07.2013