Scrapy爬虫仅爬取最后一个URL而非全部问题排查求助
问题分析与修复方案
核心问题
你代码里的错误主要有三处:
- 循环读取CSV时,每次都把
start_urls赋值为单行内容,循环结束后start_urls只会保留最后一行的URL start_requests方法被定义在循环内部,每次循环都会覆盖这个方法,最终只会生成最后一个URL的请求- Windows路径里的
\未转义,可能被当成特殊字符导致文件读取异常
修复后的代码
方案一:直接用start_urls列表(推荐)
Scrapy会自动遍历start_urls列表里的每个URL发起请求,无需手动写start_requests:
import scrapy from ..items import personalprojectItem class ArticleSpider(scrapy.Spider): name = 'articles' # 读取CSV所有URL到列表,处理换行符和路径转义 with open(r'C:\Users\Admin\Documents\Bhavya\input_urls.csv', 'r', encoding='utf-8') as file: # 过滤空行,去掉每行的换行符 start_urls = [line.strip() for line in file if line.strip()] def parse(self, response): item = personalprojectItem() # 提取文本,可根据实际页面结构调整CSS选择器 article = response.css('div p::text').extract() item['article'] = article yield item
方案二:重写start_requests方法
如果需要自定义请求逻辑(比如添加请求头、代理),可以用这种方式:
import scrapy from scrapy import Request from ..items import personalprojectItem class ArticleSpider(scrapy.Spider): name = 'articles' def start_requests(self): # 读取所有URL with open(r'C:\Users\Admin\Documents\Bhavya\input_urls.csv', 'r', encoding='utf-8') as file: for line in file: url = line.strip() if url: # 跳过空行 yield Request(url=url) def parse(self, response): item = personalprojectItem() article = response.css('div p::text').extract() item['article'] = article yield item
额外注意事项
- 确保CSV里每个URL单独占一行,无多余空格
- 若URL含特殊字符,需保证格式合法
- 可在
parse方法中添加print(response.url),验证是否所有URL都被发起请求
内容的提问来源于stack exchange,提问作者Bhavya Bajpai
相关产品推荐
相关产品推荐

