You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 02:25:51