想用 Puppeteer 登录 CSDN,如果自动再用 Puppeteer 登录一遍太麻烦了吧,所以想用 cookie 进入博客首页,这样就是已登录状态,结果试了好多办法都不行。到底是版本问题,还是怎么,这些文章到底怎么回事。现在提供一种可行的办法。
【2022.05.22更新】
后面的不要看了,这次有更好的方案。
1、借助插件导出 cookie。这个插件同样选择 。但好像很多人下载不到这个插件,我离线下载放到蓝奏云盘。自己下载到浏览器自己安装吧。至于插件的安装我之前分享过 。
https://wwp.lanzout.com/i9rD0058toda 密码:7abs
2、插件安装成功后,进入想使用cookie的网站,然后点击插件,选择要导出的cookie,如果不知道哪些需要,可以将全部一键导出。
3、导出的 cookie 格式是一个 json 数组。
4、可以直接放到代码中使用,用一个数组去接收。
const cookies = [ { "domain": ".guozh.net", "expirationDate": 1674570808, "hostOnly": false, "httpOnly": false, "name": "__gads", "path": "/", "sameSite": "unspecified", "secure": false, "session": false, "storeId": "0", "value": "ID=bab08:S=ALNI_MbDbdXk1ZMUuekE9Jnow", "id": 1 }, { "domain": ".guozh.net", "expirationDate": 1682840356, "hostOnly": false, "httpOnly": false, "name": "__gpi", "path": "/", "sameSite": "unspecified", "secure": false, "session": false, "storeId": "0", "value": "NI_MbkGDdiOgqXkQ", "id": 2 } ];
然后循环遍历数组,将每一个cookie对象设置到 Puppeteer
。
//设置cookie for(let i = 0; i < cookies.length; i++){ await page.setCookie(cookies[i]); }
如果嫌导出 cookie 太多,放到代码中不美观。可以将导出 cookie 放到新建的 .json 文件中,以后想更新,直接复制粘贴到文件就行。
在到代码中读取文件中的 cookie。比如说我在项目工程目录下创建 test.json
文件,然后将上面的cookie粘贴在里面。
再到需要的地方,引入这个文件,引入后 cookies 就有值,直接对它循环遍历就行。
var cookies = require('./test.json');
找出网页Cookie
一般我们会用F12查看 cookie
如果少量,只需要其中一两个,这方法还算好。
如果还不满足,推荐使用这个插件 EditThisCookie ,一键获取所有 cookie ,同时支持复制所有 cookie 。
Puppeteer 访问网页使用 Cookie
先来看看我 cookie 报错的用法
前面使用网上别人的方法时一直会报错
(network.deletecookies) invalid parameters name string value expected
报错位置是这行代码 await page.setCookie(cookie)
在 这里 搜到,好像我传入 cookie 的参数形式有问题,应该是字符串,而我传的是数组,这样子传入不行
// const cookies = [{ // 'name': 'UserName', // 'value': 'xxx' // },{ // 'name': 'UserInfo', // 'value': 'xxx' // }];
正确方法如下:先看一组 cookie
const cookies = {'url': 'https://blog.csdn.net/', 'name': 'UserName', 'value': 'xxx'}
await page.setCookie(cookies)
这样子使用是没问题的,不会报错。但是我的 cookie 不仅仅一组。有多套,有个办法就是如上,再构造一个 cookie2出来,然后再设置 set 。
const cookie1 = {'url': 'https://blog.csdn.net/', 'name': 'username1', 'value': 'xxx'} const cookie2 = {'url': 'https://blog.csdn.net/', 'name': 'username2', 'value': 'xxx'} await page.setCookie(cookie1) await page.setCookie(cookie2)
还有种办法就是用文件读取方式。用刚才的插件,将刚才的插件将 cookie 复制出来,然后创建文件整理成如下图,不一定所有都需要,只留下自己需要的,这里我拿我用的其中两个举例。
将文件放到 module 下,然后用如下代码
const { cookie1, cookie2 , cookie3, cookie4, cookie5, cookie6, cookie7, cookie8, cookie9} = require('./cookie'); const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch({ headless: false, args: ['--start-maximized'], }); const page = await browser.newPage() await page.setCookie(cookie1) await page.setCookie(cookie2) await page.setCookie(cookie3) await page.setCookie(cookie4) await page.setCookie(cookie5) await page.setCookie(cookie6) await page.setCookie(cookie7) await page.setCookie(cookie8) await page.setCookie(cookie9) await page.setViewport({ width: 1920, height: 1080 }); await page.goto('https://blog.csdn.net/') // await browser.close() })();
现在再进入网站,好像已经处于登录状态了。
好的,希望能帮到你。
本文由老郭种树原创,转载请注明:https://guozh.net/puppeteer-cookie-login/
嗨,我按照你的方式进行操作,依旧无法显示登陆,而且写入cookie成功,可以在页面跳转后读取的到,但是就是无法显示登陆状态
大兄弟,很抱歉,这玩意我忘的差不多了
非常非常非常好使,感謝.那個擴展很強大,能導出完整的json cookies信息.
😉 碰到一样的情况, 使用插件将cookies写入成功了。但还是无法显示登录状态, 估计浏览器版本不同, 取的cookies无法复用。
参考国外教程, 觉得还是pptr上登录一遍,获取到cookies存储起来靠谱些:
https://help.apify.com/en/articles/1640711-how-to-log-in-to-a-website-using-puppeteer
不行啊