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

Scrapy如何读取txt文件单词批量生成格式化start_urls实现爬取

Scrapy读取TXT关键词批量生成起始URL实现方案

Scrapy完全支持你要的爬取TXT文件内所有关键词对应搜索页的需求,但你写的start_urls = ["examplesite.com/{}/search".format(i for i in txtfile.txt)]是语法错误的写法,format不能直接传入生成器批量生成URL,推荐使用官方标准的start_requests重写方案实现,可靠性和灵活性最高。

最佳实现代码

直接重写Spider的start_requests方法,这是Scrapy预留的自定义起始请求入口,比直接硬编码start_urls适配性更强:

import scrapy
from urllib.parse import quote

class ExampleSpider(scrapy.Spider):
    name = 'ExampleSpider'
    # 定义URL模板,注意必须补全HTTP/HTTPS协议前缀,否则会被识别为相对路径导致请求失败
    url_template = "https://examplesite.com/{}/search"

    def start_requests(self):
        # 读取存储关键词的TXT文件,替换为你实际的文件路径
        with open('txtfile.txt', 'r', encoding='utf-8') as f:
            # 逐行读取,清除换行符、首尾空白,过滤空行避免生成无效URL
            keywords = [line.strip() for line in f if line.strip()]
        
        for keyword in keywords:
            # 对关键词做URL编码,处理中文、特殊字符导致的URL格式错误
            encoded_keyword = quote(keyword)
            target_url = self.url_template.format(encoded_keyword)
            # 构造请求提交给Scrapy调度器
            yield scrapy.Request(
                url=target_url,
                callback=self.parse
                # 如需把关键词传递给parse方法,可添加参数:cb_kwargs={"keyword": keyword}
            )

    def parse(self, response):
        for res in response.css('div.example'):
            item = {
                # 注意原代码的选择器需要补全提取方法,用get()取单个值、getall()取列表
                'example': res.css('examplehere').get()
            }
            yield item

可选简化方案

如果不需要给请求加自定义配置(请求头、Cookie、元数据等),也可以在类定义外部提前读取TXT拼接好所有URL,直接赋值给start_urls属性:

import scrapy
from urllib.parse import quote

# 类外提前读取文件生成起始URL列表
with open('txtfile.txt', 'r', encoding='utf-8') as f:
    start_urls = [
        f"https://examplesite.com/{quote(line.strip())}/search"
        for line in f if line.strip()
    ]

class ExampleSpider(scrapy.Spider):
    name = 'ExampleSpider'
    start_urls = start_urls

    def parse(self, response):
        for res in response.css('div.example'):
            item = {
                'example': res.css('examplehere').get()
            }
            yield item

注意事项

  • 不要漏写URL的http://或https://协议前缀,否则Scrapy无法发起正确请求
  • 读取TXT时必须对每行内容做strip()处理,否则行尾的换行符会被拼入URL导致404
  • 关键词包含中文、空格、特殊符号时,必须用urllib.parse.quote做编码,避免URL格式非法
  • 优先选择重写start_requests的方案,后续如果需要加动态参数、代理、重试逻辑,修改成本更低

内容的提问来源于stack exchange,提问作者8885os

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 08:09:42