Подтвердить что ты не робот

Scrapy: Следуйте ссылке, чтобы получить дополнительные данные элемента?

У меня нет конкретной проблемы с кодом. Я просто не уверен, как логически подойти к следующей проблеме с помощью Scrapy framework:

Структура данных, которые я хочу очистить, обычно является строкой таблицы для каждого элемента. Достаточно прямо, правильно?

В конечном итоге я хочу очистить заголовок, Дата выполнения и Детали для каждой строки. Заголовок и Дата выполнения сразу доступны на странице...

НО Детали сами не находятся в таблице, а скорее ссылка на страницу, содержащую детали (если это не имеет смысла здесь в таблице):

|-------------------------------------------------|
|             Title              |    Due Date    |
|-------------------------------------------------|
| Job Title (Clickable Link)     |    1/1/2012    |
| Other Job (Link)               |    3/2/2012    |
|--------------------------------|----------------|

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

4b9b3361

Ответ 1

Пожалуйста, сначала прочитайте docs, чтобы понять, что я говорю.

Ответ:

Чтобы очистить дополнительные поля, которые находятся на других страницах, в методе анализа выведите URL-адрес страницы с дополнительной информацией, создайте и верните из этого метода анализа объект запроса с этим URL-адресом и передайте уже извлеченные данные с помощью параметра meta.

как я могу объединить результаты с целевой страницы на текущую страницу в scrapy?

Ответ 2

Пример из документации по скрапу:

def parse_page1(self, response):
    item = MyItem()
    item['main_url'] = response.url
    request = scrapy.Request("http://www.example.com/some_page.html",
                             callback=self.parse_page2)
    request.meta['item'] = item
    yield request

def parse_page2(self, response):
    item = response.meta['item']
    item['other_url'] = response.url
    yield item

Ответ 3

Вы также можете использовать Python functools.partial для передачи item или любых других сериализуемых данных с помощью дополнительных аргументов для следующего обратного вызова Scrapy.

Что-то вроде:

import functools

# Inside your Spider class:

def parse(self, response):
  # ...
  # Process the first response here, populate item and next_url.
  # ...
  callback = functools.partial(self.parse_next, item, someotherarg)
  return Request(next_url, callback=callback)

def parse_next(self, item, someotherarg, response):
  # ...
  # Process the second response here.
  # ...
  return item