熊猫竹子 发表于 前天 10:07

playwright爬虫京东评论

我用playWright写了一个爬虫的脚本,想要爬取京东的产品评论,但是绕不过京东的反爬机制,用page.goto(link),一进入详情页就会自动跳回京东首页,尝试过用codgen手动输入产品,点击进入详情页,也会出现这样的情况。有没有什么比较好的方法?      
……
with open("cookies.json","r") as cookies_read:
            load_cookies = json.loads(cookies_read.read())
      context.add_cookies(load_cookies)
      # page = context.new_page()
      link = input("请输入需要爬取的页面链接")
      page.goto(link)
      time.sleep(10000)
      page.get_by_role("button",name="全部评价").click()

FishC 发表于 前天 10:08

你好!遇到京东的反爬机制是很常见的问题。京东会检测自动化工具,导致页面跳转。以下是一些可能的解决方案,请按步骤尝试:

可能原因:
- Cookies 无效或过期
- 用户代理被识别为机器人
- 页面加载时触发了反爬检测

解决方案:

[*]确保 Cookies 有效:从已登录京东的浏览器导出 Cookies,并定期更新。
[*]设置真实用户代理:模拟常见浏览器,避免使用默认的 Playwright 用户代理。
[*]使用非无头模式:在开发时禁用无头模式,观察页面行为。
[*]添加随机延迟:避免请求过于频繁,模拟人类操作。
[*]等待页面元素加载:使用 `wait_for_selector` 代替 `time.sleep`,确保页面稳定。


修改后的代码示例:

import asyncio
from playwright.async_api import async_playwright
import json
import random

async def main():
    async with async_playwright() as p:
      # 启动浏览器,禁用无头模式
      browser = await p.chromium.launch(headless=False)
      context = await browser.new_context()
      
      # 设置用户代理
      await context.set_extra_http_headers({
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
      })
      
      # 加载 Cookies
      with open("cookies.json", "r") as f:
            cookies = json.load(f)
      await context.add_cookies(cookies)
      
      page = await context.new_page()
      link = input("请输入需要爬取的页面链接:")
      
      # 访问页面,并等待特定元素加载
      await page.goto(link)
      await page.wait_for_selector("#detail")# 示例选择器,根据实际页面调整
      
      # 随机延迟
      await asyncio.sleep(random.uniform(2, 5))
      
      # 点击评价按钮
      await page.click("text=全部评价")
      
      # 继续其他操作...
      await asyncio.sleep(10)# 临时等待,观察结果
      
      await browser.close()

asyncio.run(main())


额外提示:
- 如果问题依旧,尝试手动登录京东后,使用 Playwright 的录制工具(如 playwright codegen)重新生成脚本。
- 避免频繁请求,添加更长的随机延迟。
- 检查网络请求,看是否有重定向触发,并尝试拦截处理。

希望这些方法能帮助你绕过反爬机制!如果还有问题,请提供更多细节,我会进一步协助。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

熊猫竹子 发表于 前天 12:03

FishC 发表于 2025-11-10 10:08
你好!遇到京东的反爬机制是很常见的问题。京东会检测自动化工具,导致页面跳转。以下是一些可能的解决方案 ...

已经按照你的要求修改了代码:确保 Cookies 有效:从已登录京东的浏览器导出 Cookies,并定期更新。
设置真实用户代理:模拟常见浏览器,避免使用默认的 Playwright 用户代理。
使用非无头模式:在开发时禁用无头模式,观察页面行为。
添加随机延迟:避免请求过于频繁,模拟人类操作。
等待页面元素加载:使用 `wait_for_selector` 代替 `time.sleep`,确保页面稳定。
,但仍出现童谣的问题

FishC 发表于 前天 12:04

熊猫竹子 发表于 2025-11-10 12:03
FishC 发表于 2025-11-10 10:08
你好!遇到京东的反 ...

你好!看来问题依然存在,这可能是京东的反爬机制更严格了。别担心,我们试试一些更高级的技巧来绕过它。

可能原因:
- Cookies 虽然加载了,但可能缺少关键字段或已过期。
- 页面加载时触发了 JavaScript 检测,导致重定向。
- 浏览器指纹被识别为自动化工具。

解决方案:
1. 确保 Cookies 完整有效:从登录后的浏览器导出 Cookies 时,确保包含所有域和路径,并检查有效期。
2. 使用上下文选项隐藏自动化特征:设置更真实的视口、语言等。
3. 拦截重定向:通过监听事件来阻止或处理跳转。
4. 模拟人类交互:添加随机滚动或鼠标移动。
5. 尝试不同的等待策略:等待特定元素出现后再操作。

修改后的代码示例(基于你之前的代码):


import asyncio
from playwright.async_api import async_playwright
import json
import random

async def main():
    async with async_playwright() as p:
      # 启动浏览器,禁用无头模式并设置更真实的选项
      browser = await p.chromium.launch(
            headless=False,
            args=["--disable-blink-features=AutomationControlled"]# 隐藏自动化特征
      )
      context = await 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/91.0.4472.124 Safari/537.36",
            locale="zh-CN"# 设置中文环境
      )
      
      # 加载 Cookies
      with open("cookies.json", "r") as f:
            cookies = json.load(f)
      await context.add_cookies(cookies)
      
      page = await context.new_page()
      
      # 监听重定向事件,并尝试阻止
      page.on("response", lambda response: print(f"Response URL: {response.url}"))# 监控响应,帮助调试
      page.on("request", lambda request: print(f"Request URL: {request.url}"))
      
      link = input("请输入需要爬取的页面链接:")
      
      # 访问页面,并等待网络空闲
      await page.goto(link, wait_until="networkidle")
      
      # 检查当前 URL 是否被重定向
      current_url = page.url
      if "jd.com" not in current_url or "item.jd.com" not in current_url:
            print(f"可能被重定向到: {current_url}")
            # 这里可以添加处理重定向的逻辑,比如重新导航
      else:
            print("页面加载成功")
      
      # 模拟人类行为:随机滚动
      await page.evaluate("window.scrollTo(0, document.body.scrollHeight * Math.random())")
      await asyncio.sleep(random.uniform(1, 3))
      
      # 等待评价区域加载,使用更精确的选择器
      try:
            await page.wait_for_selector(".comment-item", timeout=10000)# 示例选择器,根据实际页面调整
            print("评价区域加载完成")
      except Exception as e:
            print(f"等待评价区域超时: {e}")
      
      # 点击评价按钮
      try:
            await page.click("text=全部评价")
            print("点击评价按钮成功")
      except Exception as e:
            print(f"点击评价按钮失败: {e}")
      
      # 继续其他操作...
      await asyncio.sleep(5)# 临时等待观察
      
      await browser.close()

asyncio.run(main())


额外提示:
- 如果问题依旧,尝试手动在浏览器中登录京东,然后使用 Playwright 的录制工具重新生成脚本,确保操作顺序正确。
- 检查 Cookies 文件,确保它包含登录会话(如 .jd.com 域的 Cookies)。
- 考虑使用代理 IP 来避免 IP 封锁。
- 如果频繁失败,可能需要降低请求频率或添加更长的延迟。

希望这次能解决问题!如果还有细节(如错误日志),请提供更多信息,我会进一步优化建议。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

熊猫竹子 发表于 前天 12:06

FishC 发表于 2025-11-10 10:08
你好!遇到京东的反爬机制是很常见的问题。京东会检测自动化工具,导致页面跳转。以下是一些可能的解决方案 ...

例如pgae.goto(https://item.jd.com/10187862468680.html)回自动跳回(https://www.jd.com/?from=pc_item&reason=403)

FishC 发表于 前天 12:07

熊猫竹子 发表于 2025-11-10 12:06
FishC 发表于 2025-11-10 10:08
你好!遇到京东的反 ...

很好,你提供的具体信息很有帮助。这种情况明显是京东的反爬机制在检测到自动化工具后强制重定向到首页,并显示 `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: () => ,
      });
      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 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: playwright爬虫京东评论