Обычно при использовании scrapy каждый ответ анализируется с помощью parse callback . Основной метод parse
является обратным вызовом для начального ответа, полученного для каждого из start_urls
.
Цель этой функции разбора должна заключаться в том, чтобы «определить ссылки на статьи» и выдавать запросы для каждой из них. Эти ответы затем будут проанализированы другим обратным вызовом, скажем, parse_article
, который затем извлечет все содержимое этой конкретной статьи.
Тебе даже не нужно это LinkExtractor
. Рассмотрим:
import scrapy
class MedicalSpider(scrapy.Spider):
name = 'medical'
allowed_domains = ['blogs.webmd.com'] # Only the domain, not the URL
start_urls = ['https://blogs.webmd.com/diabetes/default.htm']
def parse(self, response):
article_links = response.css('.posts-list-post-content a ::attr(href)')
for link in article_links:
url = link.get()
if url:
yield response.follow(url=url, callback=self.parse_article)
def parse_article(self, response):
headline = 'some-css-selector-to-get-the-headline-from-the-aticle-page'
# The body is trickier, since it's spread through several tags on this particular site
body = 'loop-over-some-selector-to-get-the-article-text'
yield {
'headline': headline,
'body': body
}
Я не вставил полный код, потому что я думаю, что вы все еще хотите узнать, как это сделать, но вы можете найти то, что я придумал в этом gist
Обратите внимание, что метод parse_article
возвращает словари. Они используют конвейеры предметов Scrapy. Вы можете получить аккуратный вывод json, запустив код с помощью: scrapy runspider headlines/spiders/medical.py -o out.json