使用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
相关产品推荐
相关产品推荐

