使用BeautifulSoup4请求URL遇403错误:本地正常虚拟机异常
解决请求fc-moto.de返回403错误的问题
问题背景
尝试用BeautifulSoup4抓取以下页面内容:
https://www.fc-moto.de/epages/fcm.sf/ru_RU/?ObjectPath=/Shops/10207048/Products/Bogotto-Losail-Ladies-2PC-Leathersuit/SubProducts/Bogotto-Losail-Ladies-2PC-Leathersuit-0007
本地运行正常,但在Ubuntu 20.04虚拟主机上执行时返回403错误。使用的代码如下:
from bs4 import BeautifulSoup from fake_useragent import UserAgent import requests url = "https://www.fc-moto.de/epages/fcm.sf/ru_RU/?ObjectPath=/Shops/10207048/Products/Bogotto-Losail-Ladies-2PC-Leathersuit/SubProducts/Bogotto-Losail-Ladies-2PC-Leathersuit-0007" UserAgent().chrome req = requests.get(url, headers={'User-Agent': UserAgent().chrome}) print(req.response) for key, value in req.request.headers.items(): print(key+": "+value)
执行后输出:
return (<Response [403]> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Accept-Encoding: gzip, deflate Accept: */* Connection: keep-alive )
解决方案
1. 补充完整请求头
网站可能校验更多请求头字段,模拟真实浏览器的完整请求头能降低被拦截概率:
from bs4 import BeautifulSoup from fake_useragent import UserAgent import requests ua = UserAgent() url = "https://www.fc-moto.de/epages/fcm.sf/ru_RU/?ObjectPath=/Shops/10207048/Products/Bogotto-Losail-Ladies-2PC-Leathersuit/SubProducts/Bogotto-Losail-Ladies-2PC-Leathersuit-0007" headers = { 'User-Agent': ua.chrome, 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3', 'Referer': 'https://www.fc-moto.de/', 'DNT': '1', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1', } req = requests.get(url, headers=headers) print(req.status_code) # 后续解析逻辑 soup = BeautifulSoup(req.text, 'html.parser')
2. 使用会话保持连接
用requests.Session()维持会话,模拟浏览器的持续访问状态:
session = requests.Session() session.headers.update(headers) req = session.get(url)
3. 排查IP封禁问题
虚拟主机的IP可能被网站加入黑名单,可尝试更换IP(如使用代理),或联系主机服务商确认IP状态。
4. 添加请求延迟
网站可能有访问频率限制,请求前添加随机延迟避免触发拦截:
import time import random time.sleep(random.uniform(1, 3)) # 随机延迟1-3秒再发起请求
5. 手动指定有效UserAgent
若fake_useragent生成的UA过期,直接指定最新的Chrome浏览器UA:
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', # 其他头字段 }
内容的提问来源于stack exchange,提问作者Еремеев Евгений
相关产品推荐
相关产品推荐

