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

Axios请求arXiv随机返回403错误的问题求助

问题描述

我正在开发一个简单Web应用,核心功能是从arXiv获取单份PDF文件并解析其中文本。后端采用Firebase托管的云函数,获取PDF的请求逻辑如下:

app.post('/upload', async (req, res) => {
    res.set('Access-Control-Allow-Origin','https://paperfire-ada3a.web.app')
    res.set('Access-Control-Allow-Credentials', true);
    const isArxivUrl = (url) => {
        return url.includes('arxiv.org') || url.includes('arxiv');
      };
    const uid = req.headers['user-id'];
    const pdfUrl = req.body; // Expecting a link in the body
    if (!isArxivUrl(pdfUrl)) {
        return res.status(400).json({ error: 'The URL must be from arXiv.' });
      }
    
    if (!pdfUrl) {
        return res.status(400).json({ error: 'No URL provided.' });
    }

    try {
        let pdfResponse;
        try {
          pdfResponse = await axios.get(pdfUrl, {
              responseType: 'arraybuffer',
              headers: {
                  'Referer': 'https://arxiv.org',
                  'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36' // Set a realistic User-agent header
                },
              retry: {
                attempts: 3,
                minTimeout: 1000, // Minimum delay between retries in milliseconds
                maxTimeout: 5000, // Maximum delay between retries in milliseconds
                factor: 2 // Exponential backoff: Double the delay for each retry
              }
          });
      } catch (axiosError) {
          console.error("Axios Error: ", axiosError);
          return res.status(512).json({ error: "Error fetching PDF from URL.", details: axiosError.message });
      }
const fileBuffer = Buffer.from(pdfResponse.data, 'binary');

目前遇到的问题是请求成功率极不稳定,多数时候能成功,但时常返回403 ERR_BAD_REQUEST。我尝试过多个User-Agent,无论是通过Postman还是前端发起请求,都会被arXiv服务器随机拦截。试过两种PDF URL格式:

  • https://arxiv.org/pdf/2306.02851.pdf
  • 官方开发者提供的URL https://export.arxiv.org/pdf/2306.02851.pdf
    成功率依然没有改善。

更新信息

  1. 将User-Agent改为简单值(比如'PaperFire')后,初始所有请求均能成功,但多次下载同一篇论文后,针对该PDF的请求开始返回403 ERR_BAD_REQUEST,其他论文的请求仍能正常工作。
  2. 使用Firebase模拟器在本地运行云函数时,所有请求均能正常执行。
解决方案

针对arXiv的反拦截机制,可尝试以下优化方案:

  • 动态轮换合法User-Agent:不要固定使用单一UA,维护一个真实浏览器的UA列表,每次请求随机选取一个。避免使用自定义的简单UA,这类UA更容易被识别为爬虫。
  • 严格控制请求频率:对同一篇论文的重复请求增加间隔时间(比如至少1分钟),避免短时间内频繁请求同一资源触发频率限制。
  • 使用arXiv官方API获取PDF链接:通过arXiv的元数据API查询论文信息后获取官方PDF地址,而非直接构造PDF URL。官方API的访问优先级更高,稳定性更强。
  • 保持会话一致性:在请求中保留arXiv返回的Cookie,后续请求复用同一会话Cookie,模拟真实用户的访问行为。
  • 调整重试策略:当前的重试机制可能在短时间内重复请求,反而加剧拦截。可在重试前增加随机延迟,且针对403错误不再直接重试,而是等待更长时间后再尝试。
  • 检查云函数IP特征:Firebase云函数的出口IP可能被arXiv标记,可尝试使用代理服务转发请求,或者切换云函数的运行区域以更换出口IP。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 05:15:25