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
成功率依然没有改善。
更新信息
- 将User-Agent改为简单值(比如
'PaperFire')后,初始所有请求均能成功,但多次下载同一篇论文后,针对该PDF的请求开始返回403 ERR_BAD_REQUEST,其他论文的请求仍能正常工作。 - 使用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
相关产品推荐
相关产品推荐

