如何让Scrapy爬虫框架持续跟踪链接?SCP wiki爬取报错如何解决
问题原因
报错的核心是你写的下一页链接XPath选择器不稳定,部分SCP条目页面的结构和你预设的路径不匹配,导致response.xpath(...).get()返回了None,直接拿字符串和None做拼接操作就触发了类型错误。
同时你现有代码还存在两个可优化的问题:
- 手动拼接域名的操作完全多余,
response.urljoin本身就支持自动补全相对路径的域名,重复拼接反而可能导致URL异常 - 提取字段的XPath用了全局搜索语法
//,就算你在scp选择器下调用也会全局匹配内容,不符合预期,应该改为相对路径前缀.//
修复方案
你可以直接使用修正后的代码:
import scrapy class QuotesSpider(scrapy.Spider): name = "scp" start_urls = [ 'https://scp-wiki.wikidot.com/scp-002', ] def parse(self, response): for scp in response.xpath('//*[@id="main-content"]'): yield { 'title': scp.xpath('.//*[@id="page-content"]/p[1]').get(), 'tags': scp.xpath('.//*[@id="main-content"]/div[4]').get(), 'class': scp.xpath('.//*[@id="page-content"]/p[2]').get(), 'scp': scp.xpath('.//*[@id="page-content"]/p[3]').get(), 'desc': scp.xpath('.//*[@id="page-content"]/p[6]').get(), } # 优化下一页选择逻辑,优先匹配导航区的下一页链接,同时加非空判断 next_page = response.xpath('//div[contains(@class, "page-tags") or contains(@class, "pager")]//a[contains(text(), ">") or contains(text(), "下一页")]/@href').get() if next_page: # 直接用urljoin处理,不需要手动拼接域名 next_page = response.urljoin(next_page) print(next_page) yield response.follow(next_page, callback=self.parse)
如果部分特殊页面还是匹配不到下一页链接,你可以根据实际页面结构调整XPath的匹配规则,只要保留非空判断逻辑就能避免报错。
内容的提问来源于stack exchange,提问作者EmpressMaia
相关产品推荐
相关产品推荐

