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

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

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

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

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

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

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

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

Ответ:

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

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

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

 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 return request def parse_page2(self, response): item = response.meta['item'] item['other_url'] = response.url return item 

Вы также можете использовать 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 
Давайте будем гением компьютера.