You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scrapy新手求助:编写类似WebMD博客的多文章抓取爬虫

修正你的Scrapy爬虫:列表页抓取标题+详情页提取正文

嘿,我帮你梳理下代码里的几个关键问题,然后给你一个能正常工作的版本:

先说说你的代码里的问题点:

  • allowed_domains 配置错误:这个参数只需要填域名,不能放完整URL,你现在写的是整个起始地址,Scrapy会识别不了合法的域名范围。
  • Rules 拼写错误:Scrapy的爬虫规则属性是小写的rules,大写的Rules不会被框架识别,这就是为什么跳不到详情页的核心原因。
  • LinkExtractor 使用错误:
    • restrict_css是用来定位链接所在元素的选择器,不是提取href属性的写法,应该写成.posts-list-post-content a。
    • 没指定allow规则,这样LinkExtractor会抓取页面上所有链接,包括导航、分页这些无关链接,你需要用正则匹配详情页的URL格式。
    • 回调函数复用了parse,导致列表页和详情页的处理逻辑混在一起,应该分开写。
  • 手动请求的冗余逻辑:你自己写的next_page请求完全没必要,rules里的follow=True会自动跟进符合规则的链接。

修正后的完整代码

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

class MedicalSpider(scrapy.Spider):
    name = 'medical'
    # 修正:只保留域名
    allowed_domains = ['blogs.webmd.com']
    start_urls = ['https://blogs.webmd.com/diabetes/default.htm']
    
    # 修正:小写的rules,配置正确的LinkExtractor规则
    rules = (
        # 匹配详情页链接,回调到parse_detail处理正文,follow=True继续跟进页面内的其他详情链接
        Rule(LinkExtractor(allow=r'/diabetes/\d+/\d+/.*', restrict_css='.posts-list-post-content a'), 
             callback="parse_detail", follow=True),
        # 如果需要翻页,可以加一条匹配分页链接的规则,比如:
        # Rule(LinkExtractor(restrict_css='.pagination-next a'), follow=True),
    )

    def parse(self, response):
        # 处理列表页:提取列表里的文章标题(可选,如果你需要列表页的标题数据)
        for post in response.css('.posts-list-post'):
            yield {
                'list_page_headline': post.css('.posts-list-post-content::text').get().strip(),
                'list_page_desc': post.css('.posts-list-post-desc::text').get().strip()
            }

    def parse_detail(self, response):
        # 处理详情页:提取正文内容
        yield {
            'headline': response.css('.article-headline::text').get().strip(),
            # 提取所有正文段落,用join拼接成完整内容
            'content': '\n'.join([p.get().strip() for p in response.css('.article-body p::text')])
        }

代码说明:

  1. allowed_domains:改成了正确的域名blogs.webmd.com,确保Scrapy只抓取这个域名下的内容。
  2. rules配置:
    • 用allow=r'/diabetes/\d+/\d+/.*'匹配详情页的URL(这类URL包含年份、月份,比如/diabetes/2024/05/xxx)。
    • restrict_css='.posts-list-post-content a'定位列表页里的文章链接。
    • 回调到parse_detail专门处理详情页的正文提取。
  3. parse函数:现在用来处理列表页,遍历每个文章条目,提取列表页上的标题和简介(如果不需要可以去掉,但保留的话能拿到列表页的基础数据)。
  4. parse_detail函数:专门处理详情页,提取文章标题和正文段落,把所有段落拼接成完整的正文内容。

运行这个爬虫后,它会自动遍历列表页的所有文章链接,进入详情页抓取正文,同时如果有分页的话,你可以把注释里的分页规则打开,就能自动翻页抓取更多文章了。

内容的提问来源于stack exchange,提问作者Rahul Anand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:42:10