Google Colab中Scrapy爬虫start_urls无法触发页面爬取求助
Google Colab中Scrapy爬虫爬取失败的排查与解决建议
1. 修复URL拼接问题
你当前parse方法里提取的href是相对路径(比如/projects/xxx),直接传入scrapy.Request会导致无效请求,必须拼接完整域名:
def parse(self, response): # 优化XPath,直接提取目标链接的href属性 for href in response.xpath("//a[contains(@class, 'cf-pod__link')]/@href"): # 用response.urljoin自动补全域名 full_url = response.urljoin(href.extract()) yield scrapy.Request(full_url, callback=self.parse_page)
2. 添加反爬规避策略
目标网站可能识别了Colab的默认请求特征,建议在爬虫配置里添加浏览器请求头:
修改CrawlerProcess的settings参数:
runner = CrawlerProcess(settings={ 'REQUEST_FINGERPRINTER_IMPLEMENTATION': '2.7', 'FEEDS': {'crowdfunder.csv': {'format': 'csv', 'overwrite': True}}, 'DEFAULT_REQUEST_HEADERS': { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } })
3. 规范start_urls生成逻辑
当前在类定义阶段循环添加URL的写法容易引发初始化问题,改用start_requests方法生成请求更可靠:
class Campaign_Spider(scrapy.Spider): name = "crowdfunder" npages = 83 def start_requests(self): # 生成第一页请求 yield scrapy.Request("https://www.crowdfunder.co.uk/search/projects?category=Business&map=off") # 生成后续分页请求 for i in range(2, self.npages + 2): url = f"https://www.crowdfunder.co.uk/search/projects?page={i}&category=Business&map=off" yield scrapy.Request(url)
4. 完善详情页爬取逻辑并调试
当前parse_page方法为空,无法确认是否成功进入详情页,先添加基础日志和数据提取代码:
def parse_page(self, response): # 打印详情页URL,确认请求成功 self.logger.info(f"已进入详情页: {response.url}") # 示例提取标题(可根据需求修改) title = response.xpath("//h1/text()").get() if title: yield {'项目标题': title.strip(), '详情页URL': response.url}
5. Colab环境适配优化
- 先确保已安装Scrapy:在Colab单元格中执行
!pip install scrapy - 简化爬虫运行逻辑,Colab中无需多进程包装,直接运行更稳定:
def run_spider(spider): runner = CrawlerProcess(settings={ 'REQUEST_FINGERPRINTER_IMPLEMENTATION': '2.7', 'FEEDS': {'crowdfunder.csv': {'format': 'csv', 'overwrite': True}}, 'DEFAULT_REQUEST_HEADERS': { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } }) runner.crawl(spider) runner.start()
6. 日志排查关键点
结合你的日志信息,重点确认:
- 所有分页URL是否都返回了200状态码(查看日志中
DEBUG: Crawled (200)条目) parse方法是否成功提取到链接(可在parse中添加self.logger.info(f"提取到{len(response.xpath('//a[contains(@class, 'cf-pod__link')]/@href'))}个项目链接"))- 详情页请求是否被拦截(查看日志中请求的状态码,若为403/404则需调整反爬策略)
内容的提问来源于stack exchange,提问作者Eleni
相关产品推荐
相关产品推荐

