首个Scrapy爬虫无法正常爬取Datacamp课程名,求问题排查
问题排查与修复方案
核心问题分析
- 缩进错误:
start_requests和parse方法未缩进在DC类内部,Scrapy无法识别这些爬虫核心方法,导致爬虫无法发起请求或解析响应。 - XPath语法错误:原XPath括号位置错误,
contains函数语法应为contains(属性, 匹配值),之后再取文本节点,需调整括号位置。 - 文件写入错误:用
wb二进制模式写入字符串会触发类型错误,换行符应为\n而非/n,手动拼接写入CSV的方式也存在不规范问题。
修正后的代码
import scrapy from scrapy.crawler import CrawlerProcess class DC(scrapy.Spider): name = "DC" def start_requests(self): urls = ['https://app.datacamp.com/learn/courses'] for url in urls: yield scrapy.Request(url=url, callback=self.parse) def parse(self, response): # 修正XPath语法,正确匹配h2标签并提取文本 links = response.xpath('//h2[contains(@class,"mfe-app-learn-hub-1tu8i8n")]/text()').extract() filename = 'links.csv' # 改用文本模式写入,修正换行符,同时去除文本多余空格 with open(filename, 'w', encoding='utf-8') as f: for link in links: f.write(link.strip() + '\n') process = CrawlerProcess() process.crawl(DC) process.start()
额外说明
- 若修正后仍爬不到内容,大概率是Datacamp页面采用动态渲染(React/Vue),此时需用
scrapy-splash或playwright等工具处理动态内容,Scrapy默认仅能爬取静态HTML。 - 更规范的CSV保存方式是使用Scrapy的Feed导出功能,示例配置如下:
process = CrawlerProcess(settings={ "FEEDS": { "links.csv": {"format": "csv", "fields": ["course_name"]}, }, })
对应parse方法调整为返回字典:
def parse(self, response): for h2 in response.xpath('//h2[contains(@class,"mfe-app-learn-hub-1tu8i8n")]'): yield { 'course_name': h2.xpath('./text()').get().strip() }
这种方式能避免手动写入文件的各类问题。
内容的提问来源于stack exchange,提问作者tammyz
相关产品推荐
相关产品推荐

