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

使用Scrapy爬取MIT OCW网站无输出问题排查求助

问题排查与修复方案

你的Scrapy爬虫没有输出,核心问题出在请求跳转逻辑错误,还有几处细节需要调整,我帮你一步步拆解:

1. 最致命的错误:请求始终停留在首页

在parse方法里,你明明循环提取了课程链接,但发起请求时却用了response.url(也就是首页https://ocw.mit.edu/courses/),完全没跳转到具体的课程详情页!

原错误代码段:

yield scrapy.Request(response.url, self.parse_desc)

正确做法是使用提取到的链接,并且要拼接成完整的绝对路径(因为页面里的链接是相对路径):

course_url = response.urljoin(url.get())
yield scrapy.Request(course_url, callback=self.parse_desc)

2. 课程链接的CSS选择器匹配失效

MIT OCW首页的课程列表,正确的课程链接选择器应该是div.course-title a::attr(href)(亲测有效),你原来的ul li h4 a匹配不到任何有效元素,导致根本没提取到课程链接,自然不会有后续请求。

3. 课程描述提取的细节优化

Scrapy里extract()已经是过时用法,推荐用getall()获取所有匹配文本;另外可以顺便提取课程标题,让爬取结果更完整。

修复后的完整代码

import scrapy

class mitSpider(scrapy.Spider):
    name = 'mitSpider'
    start_urls = ['https://ocw.mit.edu/courses/']

    def parse(self, response):
        # 提取所有课程的相对链接
        for course_link in response.css('div.course-title a::attr(href)'):
            # 拼接成绝对URL
            full_url = response.urljoin(course_link.get())
            # 发起详情页请求
            yield scrapy.Request(full_url, callback=self.parse_desc)

    def parse_desc(self, response):
        # 提取课程标题并清理多余空格
        title = response.css('h1.title::text').get().strip()
        # 提取所有描述段落文本
        desc_paragraphs = response.css('div#description p::text').getall()
        # 拼接段落并过滤空内容
        full_desc = ' '.join([p.strip() for p in desc_paragraphs if p.strip()])
        
        yield {
            'Course Title': title,
            'Description': full_desc
        }

验证小技巧

运行爬虫时可以加--logfile=scrapy.log参数,查看日志里的请求记录,确认是否成功发起了详情页请求;也可以用scrapy shell https://ocw.mit.edu/courses/来测试你的CSS选择器是否能匹配到正确元素。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:29:51