You need to enable JavaScript to run this app. Scrapy自定义set_user_agent函数报参数数量错误如何解决
优惠活动
大模型
产品
解决方案
定价
更多

Scrapy自定义set_user_agent函数报参数数量错误如何解决

错误根因

Scrapy 中 Rule 的 process_request 回调方法的参数是固定的:作为类方法首先自带 self 参数,框架还会自动传入request、response两个位置参数。你原代码的set_user_agent只定义了2个参数,框架传入3个参数时就会触发参数数量不匹配的报错。

修复方案

给set_user_agent方法补充接收response参数即可,无需额外使用该参数,修正后的完整代码如下:

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule


class BestMoviesSpider(CrawlSpider):
    name = 'best_movies'
    allowed_domains = ['imdb.com']
    user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'

    def start_requests(self):
        yield scrapy.Request(url='https://www.imdb.com/search/title/?genres=drama&groups=top_250&sort=user_rating,desc',
                         headers={
                             # 这里顺便把下划线改成标准的中划线,避免请求头不生效
                             'User-Agent': self.user_agent
                         })

    rules = (
        Rule(LinkExtractor(restrict_xpaths=("//h3[@class='lister-item-header']/a")), callback='parse_item',
            follow=True, process_request='set_user_agent'),
        Rule(LinkExtractor(restrict_xpaths="(//a[@class='lister-page-next next-page'])[2]"),
         process_request='set_user_agent')

 )

    # 新增response参数接收框架传入的对应值
    def set_user_agent(self, request, response):
        request.headers['User-Agent'] = self.user_agent
        return request

额外说明

原代码start_requests里的请求头键用了User_Agent(下划线),标准HTTP请求头的键名是User-Agent(中划线),修正后可以保证请求头设置正常生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 13:48:03