Playwright爬虫实战 – 复用登录状态绕过验证码(以知乎为例)

在爬虫开发中,验证码是一个常见的反爬虫手段。对于需要登录的网站(如知乎),每次运行脚本时都需要重新登录,不仅效率低下,还可能触发验证码。本文将详细介绍如何通过复用登录状态,绕过验证码限制,并以知乎为例,提供完整的代码实现。

为什么需要复用登录状态?

提高效率

• 避免每次运行脚本时都需要重新登录。
• 减少不必要的网络请求,提升爬虫速度。

降低风险

• 减少登录频率,降低被反爬机制检测到的概率。
• 避免频繁触发验证码。

简化开发

登录状态保存后,可以专注于爬取逻辑的开发。

实现思路

手动登录并保存登录状态:

使用 Playwright 启动浏览器,手动登录知乎,并保存登录状态(如 cookies 和 localStorage)。

复用登录状态进行爬取:

在后续脚本中加载已保存的登录状态,复用登录会话。

具体实现

代码实现:save_login_state.js

const { chromium } = require('playwright');
const { expect } = require('@playwright/test'); // 导入 expect

(async () => {
  // 启动 Chromium 浏览器
  const browser = await chromium.launch({ headless: false });
  const context = await browser.newContext();

  const page = await context.newPage();

  // 打开知乎登录页面
  await page.goto('https://www.zhihu.com/signin');

  // 等待登录表单加载完成
  await page.waitForSelector('.SignFlow-tabs');

  await expect(page.getByText('进入创作中心')).toBeVisible({ timeout: 15000 });

  // 保存登录状态到文件
  await context.storageState({ path: 'zhihu_login_state.json' });
  console.log('登录状态已保存到 zhihu_login_state.json');

  // 关闭浏览器
  await browser.close();
})();

运行步骤:

1.运行脚本:

node save_login_state.js

2.浏览器会打开知乎登录页面,手动输入用户名、密码和验证码完成登录,或者手机端知乎扫描二维码登录即可。注意:这里预留超时15秒,用户需要在该时间范围内成功登录,当然,你也可以根据实际操作情况调整。总之,要确保手动操作可以正常完成。

3. 登录完成后,在终端按回车,脚本会将登录状态保存到 zhihu_login_state.json 文件中。

图片[1]-Playwright爬虫实战 – 复用登录状态绕过验证码(以知乎为例)-365博客

复用登录状态进行爬取

代码实现:reuse_login_state.js

const { chromium } = require('playwright');
const { expect } = require('@playwright/test'); // 导入 expect

(async () => {
  // 启动 Chromium 浏览器,并加载已保存的登录状态
  const browser = await chromium.launch({ headless: false });
  const context = await browser.newContext({ storageState: 'zhihu_login_state.json' });

  const page = await context.newPage();

  // 打开知乎首页
  await page.goto('https://www.zhihu.com');

  // 检查是否登录成功:验证页面中是否包含“进入创作中心”文本
  try {
    await expect(page.getByText('进入创作中心')).toBeVisible({ timeout: 15000 });
    console.log('登录状态已恢复,可以开始爬取数据!');
  } catch (error) {
    console.log('登录状态恢复失败,请重新登录。');
    await browser.close();
    return;
  }

  // 等待推荐问题列表加载完成
  await page.waitForSelector('.TopstoryItem');

  // 抓取前 5 条推荐问题的标题
  const questions = await page.$$eval('.TopstoryItem', (items) => {
    return items.slice(0, 5).map((item) => {
      const titleElement = item.querySelector('h2.ContentItem-title');
      return titleElement ? titleElement.innerText.trim() : '无标题';
    });
  });

  // 打印抓取到的问题标题
  console.log('抓取到的前 5 条推荐问题:');
  questions.forEach((question, index) => {
    console.log(`${index + 1}. ${question}`);
  });

  // 关闭浏览器
  await browser.close();
})();

运行步骤:

1. 确保已安装 @playwright/test

npm install @playwright/test

2. 运行脚本:

node reuse_login_state.js

3. 如果登录状态恢复成功,脚本会输出类似以下内容

图片[2]-Playwright爬虫实战 – 复用登录状态绕过验证码(以知乎为例)-365博客

注意事项

登录状态有效期:

• 登录状态(如 cookies)通常有一定的有效期,过期后需要重新登录并保存新的登录状态。

页面结构变化:

如果知乎的页面结构发生变化(例如 .TopstoryItem 或 h2.ContentItem-title 的类名改变),需要同步更新脚本中的选择器。

动态加载内容:

如果推荐问题是动态加载的(例如滚动页面时加载更多),可以使用 page.waitForSelector() 或 page.evaluate() 结合滚动操作来加载更多内容。

总结

通过复用登录状态,我们可以避免每次运行脚本时都需要重新登录,尤其是在需要验证码的网站(如知乎)中非常实用。这种方法不仅提高了爬虫的效率,还降低了被反爬机制检测到的风险。

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容