从一页中抓取多篇文章,每篇文章都有单独的href

时间:2019-07-09 15:05:29

标签: python-3.x scrapy

我是新手,我写第一只蜘蛛成为了一个类似于https://blogs.webmd.com/diabetes/default.htm的网站的蜘蛛。

我要抓取标题,然后导航至每篇文章,以抓取每篇文章的文字内容。

我已经尝试过使用规则和linkextractor,但是它无法导航到下一页并提取。我收到错误消息:Spider错误处理https://blogs.webmd.com/diabetes/default.htm>(引荐来源:无)

下面是我的代码

import scrapy
from scrapy.spiders import Rule
from scrapy.linkextractors import LinkExtractor


class MedicalSpider(scrapy.Spider):
    name = 'medical'
    allowed_domains = ['https://blogs.webmd.com/diabetes/default.htm']
    start_urls = ['https://blogs.webmd.com/diabetes/default.htm']

    Rules = (Rule(LinkExtractor(allow=(), restrict_css=('.posts-list-post-content a ::attr(href)')), callback="parse", follow=True),)
    def parse(self, response):
        headline = response.css('.posts-list-post-content::text').extract()
        body = response.css('.posts-list-post-desc::text').extract()
        print("%s : %s" % (headline, body))

        next_page = response.css('.posts-list-post-content a ::attr(href)').extract()
        if next_page:
            next_href = next_page[0]
            next_page_url = next_href
            request = scrapy.Request(url=next_page_url)
            yield request

请指导新手抓紧工作,以使该蜘蛛正确出现在每页上的多篇文章中。

1 个答案:

答案 0 :(得分:1)

通常在使用scrapy时,每个响应都会由 parse回调进行解析。主要的write方法是为每个parse获得的初始响应的回调。

该解析功能的目标应该是“识别文章链接”,并对每个链接发出请求。然后,这些响应将由另一个回调start_urls进行解析,该回调然后将从该特定文章中提取所有内容。

您甚至不需要parse_article。考虑:

LinkExtractor

我没有粘贴完整的代码,因为我相信您仍然想学习如何做到这一点而感到兴奋,但是您可以在此gist

中找到我的想法。

请注意,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 } 方法正在返回字典。这些正在使用Scrapy的项目管道。您可以通过使用以下代码运行代码来获得整洁的json输出:parse_article