Scrapy: как создать элемент, собирающий информацию с нескольких URL-адресов?

После многих лет неохотного кодирования парсеров как мешанины из регулярных выражений, BeautifulSoup и т. д. я нашел Scrapy, который мне очень понравился. считать рождественским подарком в этом году самому себе! Его естественно использовать, и, кажется, он был создан, чтобы сделать практически все элегантным и пригодным для повторного использования.

Но я в ситуации, которую не знаю, как решить: мой паук сканирует и очищает страницу со списком A, из которой я создаю набор элементов. Но для каждого элемента мне нужно получить отдельную дополнительную ссылку (созданную из некоторой извлеченной информации, но не явную ссылку на странице, по которой может перейти Scrapy), чтобы получить дополнительную информацию.

Мой вопрос состоит из двух частей: каков протокол для получения URL-адреса вне процесса сканирования? как элегантно создавать элементы из нескольких источников?

Это частично было задано (и ответили) в предыдущий вопрос на StackOverflow. Но меня больше интересует, какой должна быть философия Scrapy в этом случае использования — наверняка не непредвиденная возможность? Интересно, является ли это одной из целей, для которых предназначены конвейеры (добавление информации из вторичного источника, выведенной из первичной информации, является экземпляром «постобработки»), но как лучше всего это сделать, чтобы не полностью испортить эффективную асинхронную организацию Scrapy?


person Jérémie    schedule 04.08.2012    source источник
comment
что вы имеете в виду под › получением URL-адреса вне процесса сканирования?   -  person warvariuc    schedule 04.08.2012
comment
@warwaruk: сканирование обычно имеет (набор) начальных URL-адресов, извлекает эти страницы и добавляет найденные ссылки в очередь. Под вне процесса сканирования я подразумеваю получение ссылки, которая не входит ни в начальный набор, ни в качестве привязки на извлекаемых страницах --- я имею в виду URL-адрес, который алгоритмически выводится из информации, которая очищается.   -  person Jérémie    schedule 04.08.2012
comment
@warwaruk: спасибо, это прекрасно! У меня есть еще один вопрос: что лучше всего делать с несколькими сайтами, которые не могут быть проанализированы одинаково (скажем, списки Amazon и списки Walmart), но которые я хочу агрегировать? Стоит ли делать несколько пауков? Возможно ли в одном и том же пауке иметь несколько обратных вызовов в зависимости от домена?   -  person Jérémie    schedule 05.08.2012
comment
я обычно делаю разные пауки, так как логика метода разбора отличается. Это более понятно. Также для разных сайтов могут потребоваться разные (для каждого паука) настройки, такие как задержка загрузки и т. д. Если у вас есть общие функции — создайте свой собственный базовый паук, используя общие методы.   -  person warvariuc    schedule 05.08.2012
comment
@warwaruk: Спасибо за помощь!   -  person Jérémie    schedule 05.08.2012
comment
Пожалуйста! Я удалил некоторые комментарии и поместил их в ответ.   -  person warvariuc    schedule 05.08.2012


Ответы (1)


каков протокол для получения URL-адреса вне процесса сканирования?

Когда вы создаете Request, давая ему URL-адрес, не имеет значения, откуда вы взяли URL-адрес для загрузки. Вы можете извлечь его со страницы или построить как-то еще.

как элегантно создавать элементы из нескольких источников?

Используйте Request.meta

person warvariuc    schedule 05.08.2012
comment
Последний вопрос, если предположить, что у меня есть несколько пауков, возможно ли, чтобы все элементы загружались в один и тот же конвейер, а затем использовались техника, описанная в руководстве для объединения дубликатов? - person Jérémie; 05.08.2012
comment
Я не понимаю - нужно больше информации. Я предлагаю создать новый вопрос, если он не связан с этим. - person warvariuc; 05.08.2012