#mysql #python-3.x #scrapy #scrapy-pipeline
#mysql #python-3.x #scrapy #scrapy-конвейер
Вопрос:
Я запускаю spider в scrapy через каждые 24 часа. Элемент, извлеченный из spider, сохраняется в базе данных MySQL. Чтобы собирать только уникальный элемент, я настроил структуру таблицы так, чтобы дубликаты записей аннулировались. Поэтому в большинстве случаев возникала ошибка дублирования записи. Мне нужно захватить все это и предотвратить их печать на консоли / терминале. Ниже приведен снимок ошибки.
2020-08-27 07:02:39 [scrapy.core.scraper] ERROR: Error processing {'jobtitle': ['E-Learning Specialist'],
'joburl': ['https://******/e-learning-specialist-1530588']}
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/twisted/internet/defer.py", line 654, in _runCallbacks
current.result = callback(current.result, *args, **kw)
File "/home/scrapym0/scrapy/BotV0.1/test2/test2/pipelines.py", line 85, in process_item
self.store_db(item)
File "/home/scrapym0/scrapy/BotV0.1/test2/test2/pipelines.py", line 100, in store_db
self.curr.execute("""INSERT INTO JobList(Job_Title,Job_URL,entry_date) VALUES(%s, %s, %s)""", (
File "/usr/lib/python3/dist-packages/mysql/connector/cursor.py", line 569, in execute
self._handle_result(self._connection.cmd_query(stmt))
File "/usr/lib/python3/dist-packages/mysql/connector/connection.py", line 553, in cmd_query
result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query))
File "/usr/lib/python3/dist-packages/mysql/connector/connection.py", line 442, in _handle_result
raise errors.get_exception(packet)
mysql.connector.errors.IntegrityError: 1062 (23000): Duplicate entry 'https://******/e-learning-specialist-1530588' for key 'JobList.Job_URL_UNIQUE'
Комментарии:
1. есть 2 способа сделать это, вы можете перезаписать существующее поле (если дублируется) или просто поместить строку 100 в try / except
2. Попытка / исключение может сработать. Можете ли вы помочь мне, как поймать только код ошибки 1062 или 23000, который возникает при дублировании записи. Я хочу, чтобы другие ошибки публиковались на терминале / консоли.
3. Как насчет использования
INSERT IGNORE table
4. Спасибо за это предложение. Я надеюсь, что это сработает и для инструкции вставки одной строки. Я попробую это.
Ответ №1:
Блок Try / except работает должным образом
try:
self.curr.execute("SQL_statement")
except mysql.connector.errors.IntegrityError:
pass