Scrapy: Следуйте ссылке, чтобы получить дополнительные данные элемента?
У меня нет конкретной проблемы с кодом. Я просто не уверен, как логически подойти к следующей проблеме с помощью Scrapy framework:
Структура данных, которые я хочу очистить, обычно является строкой таблицы для каждого элемента. Достаточно прямо, правильно?
В конечном итоге я хочу очистить заголовок, Дата выполнения и Детали для каждой строки. Заголовок и Дата выполнения сразу доступны на странице...
НО Детали сами не находятся в таблице, а скорее ссылка на страницу, содержащую детали (если это не имеет смысла здесь в таблице):
|-------------------------------------------------|
| Title | Due Date |
|-------------------------------------------------|
| Job Title (Clickable Link) | 1/1/2012 |
| Other Job (Link) | 3/2/2012 |
|--------------------------------|----------------|
Я боюсь, что до сих пор не знаю, как логично передать элемент с обратными вызовами и запросами даже после прочтения раздела CrawlSpider документации Scrapy.
Ответы
Ответ 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