async
Кажется, что Scrapy выполняет асинхронное планирование GET.
Ваш код с этим не справляется.
Именование
Что вы получаете отБД не urls
, а скорее rows
или pairs
.
Вместо записи:
for url in urls:
и использования [0]
или [1]
подписок, было быбудь более питоническим, чтобы распаковать два предмета:
for url, id in pairs:
url → id
Вы пытаетесь восстановить идентификатор следующим образом:
link_id = self.links_ids[0]
Рассмотрите возможность сохранения результатов БДв dict
, а не list
:
for url, id in pairs:
self.url_to_id[url] = id
Тогда позже вы можете просто найти нужный идентификатор с помощью link_id = self.url_to_id[url]
.
итерация
ОКдавайте посмотрим, что происходит в этом цикле:
for url in urls:
self.links_ids.append(url[1])
yield scrapy.Request(url=url[0], callback=self.parse, dont_filter=True)
В этом цикле вы запускаете следующую строку:
self.links_ids.remove(link_id)
Похоже, вы пытаетесь использовать list
, который имеет либо ноль, либо один элемент в качестве скалярной переменной, по крайней мере, в ситуации, когда Scrapy ведет себя синхронно.Это странное использование;например, использование dict
, которое я предложил, вероятно, сделает вас счастливее.
Кроме того, ваш код предполагает, что обратные вызовы будут происходить в той последовательности, в которой они были поставлены в очередь;это не вариант.A dict
решит эту проблему для вас.