在爬虫开发中,验证码是一个常见的反爬虫手段。对于需要登录的网站(如知乎),每次运行脚本时都需要重新登录,不仅效率低下,还可能触发验证码。本文将详细介绍如何通过复用登录状态,绕过验证码限制,并以知乎为例,提供完整的代码实现。
为什么需要复用登录状态?
提高效率
• 避免每次运行脚本时都需要重新登录。
• 减少不必要的网络请求,提升爬虫速度。
降低风险
• 减少登录频率,降低被反爬机制检测到的概率。
• 避免频繁触发验证码。
简化开发
登录状态保存后,可以专注于爬取逻辑的开发。
实现思路
手动登录并保存登录状态:
使用 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博客](https://qiniu.dianchuang365.cn/2025/02/20250204113439950.png)
复用登录状态进行爬取
代码实现: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博客](https://qiniu.dianchuang365.cn/2025/02/20250204113758486.png)
注意事项
登录状态有效期:
• 登录状态(如 cookies)通常有一定的有效期,过期后需要重新登录并保存新的登录状态。
页面结构变化:
如果知乎的页面结构发生变化(例如 .TopstoryItem 或 h2.ContentItem-title 的类名改变),需要同步更新脚本中的选择器。
动态加载内容:
如果推荐问题是动态加载的(例如滚动页面时加载更多),可以使用 page.waitForSelector() 或 page.evaluate() 结合滚动操作来加载更多内容。
总结
通过复用登录状态,我们可以避免每次运行脚本时都需要重新登录,尤其是在需要验证码的网站(如知乎)中非常实用。这种方法不仅提高了爬虫的效率,还降低了被反爬机制检测到的风险。









暂无评论内容