Способ отложить отправку запроса в Scrapy?Python

Программы на Python
Ответить
Anonymous
 Способ отложить отправку запроса в Scrapy?

Сообщение Anonymous »

Моя логика Scrapy следующая:
  • получить все строки из child_page_table, где родительский_page_id имеет значение null
  • для каждой строки, если родительский_page_id (все еще) равен нулю, выдать запрос с обратным вызовом Scrape_page
  • [scrape_page] если это «родительская страница», добавьте данные в родительскую_страницу_table и получите список всех «дочерних страниц», связанных с родительской страницей. Вставьте их в child_page_table с родительским_page_id, указывающим на то, что мы только что вставили в родительскую_страницу_table.
  • если это не родительская страница, выдайте Request родительской страницы, связанной с дочерней страницей с обратным вызовом Scrape_page (который при рекурсии запустит шаг №3, а не шаг №4)
Логика здесь такова, что я есть десятки тысяч дочерних страниц, а родительские страницы указывают на многие из этих дочерних страниц. Наивный способ заполнения родительской_страницы — это просто заполнять каждую дочернюю страницу, запрашивать ее, получать родительскую страницу, запрашивать ее и т. д.
Но более эффективный способ — получить первую дочернюю страницу, получить родительскую страницу, и на родительской странице будут связаны десятки или сотни дочерних страниц. Для каждого из них, не делая больше запросов, обновите данные в дочерней таблице, чтобы нам никогда не приходилось делать запрос для этих дочерних элементов.
Однако, похоже, что Scrapy start дает сразу все 15 000 строк в качестве запросов, а не то, что я предполагал, что это будет давать 16 строк за раз (количество одновременных запросов, которые я разрешаю).
Поэтому, по сути, шаг №2 всегда происходит так же, как и сразу после шага №1, и не было вызвано никаких запросов на обновление родительского_page_id дочерних строк.
Есть ли способ создать запрос, который прямо перед отправкой запроса будет перепроверять, необходим ли запрос? По сути отсрочка вопроса «а надо ли?» логику до тех пор, пока этот запрос не будет сделан?
Возможно, какой-то способ обдумать запрос до тех пор, пока тот, кто управляет запросами, фактически не отправит его на HTTP-землю?
children = list(enumerate(self.cur.execute("select tag from children where parent_page_id is null;").fetchall()))
rel_len = len(relationships)
for (idx, row) in relationships:
logging.debug("[Children] Fetching " + str(idx) + "/" + str(rel_len))
child_item = Page(tag=row[0], type=TagType.CHILD)
if self._needs_call(child_item) // checks if parent_page_id is null
yield Request(
base_url + tag_item.tag,
callback=self.parse_page,
cb_kwargs=dict(tag=row[0], tag_type=TagType.CHILD),
errback=self.handle_error,
meta=MyScraper.meta
)


Подробнее здесь: https://stackoverflow.com/questions/796 ... -in-scrapy
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»