|
|
很好,你提供的具体信息很有帮助。这种情况明显是京东的反爬机制在检测到自动化工具后强制重定向到首页,并显示 `reason=403` 错误。让我们针对这个问题提供更具体的解决方案。
**京东反爬机制分析:**
- 检测到自动化浏览器指纹
- 检测到非人类行为模式
- 检测到异常的请求头或参数
**针对性解决方案:**
1. **使用更完整的浏览器上下文配置**:
- from playwright.sync_api import sync_playwright
- import json
- import random
- import time
- with sync_playwright() as p:
- # 启动浏览器,使用更多隐藏特征参数
- browser = p.chromium.launch(
- headless=False,
- args=[
- "--disable-blink-features=AutomationControlled",
- "--disable-dev-shm-usage",
- "--no-first-run",
- "--no-default-browser-check",
- "--disable-web-security",
- "--disable-features=VizDisplayCompositor",
- "--disable-background-timer-throttling",
- "--disable-renderer-backgrounding",
- "--disable-backgrounding-occluded-windows"
- ]
- )
-
- # 创建上下文时设置更多真实参数
- context = browser.new_context(
- viewport={"width": 1920, "height": 1080},
- 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",
- locale="zh-CN",
- timezone_id="Asia/Shanghai",
- permissions=[],
- extra_http_headers={
- "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
- "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
- "Accept-Encoding": "gzip, deflate, br",
- "DNT": "1",
- "Connection": "keep-alive",
- "Upgrade-Insecure-Requests": "1",
- }
- )
-
- # 执行JavaScript隐藏自动化特征
- context.add_init_script("""
- Object.defineProperty(navigator, 'webdriver', {
- get: () => undefined,
- });
- Object.defineProperty(navigator, 'plugins', {
- get: () => [1, 2, 3, 4, 5],
- });
- Object.defineProperty(navigator, 'languages', {
- get: () => ['zh-CN', 'zh'],
- });
- """)
-
- # 加载cookies
- with open("cookies.json", "r") as f:
- cookies = json.load(f)
- context.add_cookies(cookies)
-
- page = context.new_page()
-
- # 先访问京东首页,模拟真实用户行为
- print("正在访问京东首页...")
- page.goto("https://www.jd.com", wait_until="networkidle")
- time.sleep(random.uniform(2, 4))
-
- # 模拟一些用户行为
- page.mouse.move(random.randint(100, 500), random.randint(100, 300))
- time.sleep(0.5)
-
- # 现在访问目标商品页面
- target_url = "https://item.jd.com/10187862468680.html"
- print(f"正在访问目标页面: {target_url}")
-
- # 使用不同的导航策略
- page.goto(target_url, wait_until="domcontentloaded", referer="https://www.jd.com")
-
- # 检查是否被重定向
- if page.url != target_url:
- print(f"检测到重定向! 当前URL: {page.url}")
- # 如果是重定向到首页,尝试重新导航
- if "jd.com/?from=pc_item" in page.url:
- print("被重定向到首页,尝试重新访问...")
- time.sleep(random.uniform(3, 6))
- page.goto(target_url, wait_until="networkidle")
-
- # 等待页面关键元素
- try:
- page.wait_for_selector(".product-intro", timeout=10000)
- print("商品页面加载成功!")
- except:
- print("商品页面可能未正确加载")
-
- # 继续你的操作...
- time.sleep(5)
-
- browser.close()
复制代码
2. **如果上述方法仍然无效,尝试使用代理IP**:
- # 在浏览器启动时添加代理
- browser = p.chromium.launch(
- headless=False,
- proxy={
- "server": "http://your-proxy-ip:port",
- "username": "your-username", # 如果需要认证
- "password": "your-password" # 如果需要认证
- },
- args=[...] # 同上
- )
复制代码
3. **备选方案 - 使用移动端用户代理**:
- # 使用移动端用户代理,有时检测不那么严格
- context = browser.new_context(
- viewport={"width": 375, "height": 812},
- user_agent="Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1",
- locale="zh-CN"
- )
复制代码
4. **终极方案 - 使用真实浏览器配置文件**:
- # 使用已有Chrome用户数据目录
- browser = p.chromium.launch_persistent_context(
- user_data_dir="/path/to/your/chrome/profile",
- headless=False,
- args=[...] # 同上
- )
复制代码
**额外建议:**
- 确保你的cookies是从已经成功登录京东的浏览器导出的
- 尝试在不同的时间段运行脚本,避开高峰期
- 如果可能,使用住宅代理IP而不是数据中心代理
这些方法应该能显著提高成功率。如果仍有问题,请告诉我具体的错误信息,我会提供更针对性的解决方案。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|