Scrapy: перейдите по ссылке, чтобы получить дополнительные данные об элементе? - PullRequest
31 голосов
/ 17 февраля 2012

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

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

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

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

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

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

Ответы [ 3 ]

27 голосов
/ 18 февраля 2012

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

Ответ:

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

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

19 голосов
/ 10 декабря 2014

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

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 голосов
/ 25 февраля 2014

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