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

Scrapy单URL爬虫中如何在start_urls或爬虫内设置代理与User-Agent

关于Scrapy爬虫配置代理和用户代理的问题解答

嘿,我来帮你理清楚这个问题~

首先明确说:不能直接在start_urls里设置代理和用户代理。因为start_urls里的元素只是纯URL字符串,Scrapy只会把它们当作请求的目标地址来解析,没法直接附加代理、请求头这类请求级别的配置,硬加的话只会导致URL解析错误,请求根本发不出去。

不过完全可以在这个爬虫内部单独配置,给你两种常用的方案:

方案一:通过custom_settings全局配置(爬虫专属)

如果希望这个爬虫的所有请求(包括初始请求和后续跳转请求)都自动使用指定的代理和用户代理,可以用爬虫类的custom_settings属性,它会覆盖全局的settings.py配置,且只对当前爬虫生效:

class LoginSpider(scrapy.Spider):
    name = 'login_spider'
    start_urls = ['https://www.starcitygames.com/myaccount/']
    
    # 仅对当前爬虫生效的专属配置
    custom_settings = {
        # 设置用户代理
        'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
        # 启用代理中间件(Scrapy默认已启用,这里显式声明优先级)
        'DOWNLOADER_MIDDLEWARES': {
            'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
        },
        # 设置HTTP代理(如果是HTTPS代理,用HTTPS_PROXY)
        'HTTP_PROXY': 'http://your-proxy-ip:port',
        # 若代理需要账号密码,格式如下
        # 'HTTP_PROXY': 'http://username:password@your-proxy-ip:port'
    }

    def parse(self, response):
        # login and scrape website的内容
        pass

方案二:重写start_requests方法,手动构建初始请求

如果只想给初始的那个URL请求单独设置代理和用户代理,后续请求不需要的话,可以重写start_requests方法,手动创建scrapy.Request对象,在里面指定请求头(用户代理)和代理信息:

class LoginSpider(scrapy.Spider):
    name = 'login_spider'
    start_urls = ['https://www.starcitygames.com/myaccount/']

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(
                url=url,
                # 设置用户代理到请求头
                headers={
                    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
                },
                # 设置代理到meta参数
                meta={
                    'proxy': 'http://your-proxy-ip:port'
                    # 带账号密码的代理写法
                    # 'proxy': 'http://username:password@your-proxy-ip:port'
                },
                callback=self.parse
            )

    def parse(self, response):
        # login and scrape website的内容
        pass

小提示

如果后续在parse方法里生成新的请求,方案一的配置会自动继承;方案二的话,需要在新的Request对象里同样加上headers和meta参数,或者把代理、UA存成爬虫类的属性,方便复用哦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:18:14