需求分析

别人分享了很多网盘链接,自己每个手动去转存很浪费时间,而且,这些操作都是重复性劳动。与Pandownload的这个功能类似,不过pandownload由于一些原因无法使用了,所以只能自己实现。

思路

思路其实很简单,就是完全模拟人为操作,将网盘链接存起来。我们可以把网盘链接分为两种,第一种是没有提取码的,第二种是有提取码的。前者比后者少一个提交提取码的步骤。那么,我们

如何区分,访问一个网盘链接的时候,究竟是哪种呢?

可以通过访问页面的title来决定。 这种是无提取码的,后缀是无限制 这种是需要填写提取码的,后缀是请输入提取码,写代码的时候,截取后三个字儿提取码即可

填写Cookie信息

批量转存的前提是,我们得登录,我这里实现的方案是直接从浏览器中获取到cookie信息,复制到代码中进行使用,查看网站的cookie信息可以用插件EditThisCookie 点击右上角导出Cookie,cookie就放在粘贴板中了,复制到代码中,然后使用循环,将所有cookie利用page.setCookie方法,将cookie放置到当前请求上下文中

填写提取码

等待页面加载完毕,找到输入提取码框的元素,找到其id,然后使用page.$$eval()方法获取并写入东西 可以看见,这里的id为accessCode。所以我们只需要写

await page.$$eval('#accessCode', writeCode, code);
async function writeCode(nodes, code) {for (let node of nodes) {node.value = code;}
}

就可以了。我这里是直接改的node.value,你也可以用puppeteer模拟人来填写。

提取文件

找到提取文件按钮,点击,然后等待跳转完毕。 值得注意的是,我们点击的一定是A标签,其他标签需要进行过滤。

await page.$$eval('.g-button-blue-large', click);
await page.waitFor(1000);async function click(nodes) {for (let node of nodes) {if (node.title === '提取文件') {await node.click();}}
}

然后等待跳转即可

选择要保存的文件

这里简单实现为,选择全部文件,不过值得注意的是,如果是单文件,是不需要点击选择全部文件的。可以通过判断元素是否存在判断是否有复选框,是否需要进行点击 如图,不过这里奇怪的是,class的值是一个不可读的字符串,我不确定这个值是不是与用户有关,所以这里就打码了。 既然需要做的就是找到这个元素,点击就行了,那我们照着做就行

await page.$$eval('.zbyDdwb', selectAll);async function selectAll(nodes) {for (let node of nodes) {await node.click();break;}
}

点击保存到网盘

与点击提取文件一样,找到目表按钮,然后点击就行,感兴趣的朋友,可以自己试试

弹出框选择保存的文件路径

避免麻烦,这里写得比较简单,如果有选择跟上一次样的框,那么就点击选择跟上一次一样,如果没有,就直接存储在根目录下。(可以根据你想要的需求自己改) 选择前 选择后 可以发现,仅仅是改变了Class的值,所以实现的时候,也改变一下值就行

await page.$$eval('.save-path-item', chooseLocation);
async function chooseLocation(nodes) {for (let node of nodes) {node.setAttribute('class', 'save-path-item check');}
}

点击确定按钮

与之前几个按钮一样,我们只需要找到确认按钮,点击就行了。

await page.$$eval('[title=确定]', confirm)
async function confirm(nodes) {for (let node of nodes) {console.log(node.tagName);if (node.tagName === 'A') {await node.click();}}
}

这样,整个逻辑就完成了。

完整代码

为了程序能正常运行,需要加入一些额外的waitFor等待,避免操作太快导致的诸如IP封禁,元素未加载出来等乱七八糟的问题。同时,我这里数据都是从数据库中出来的,所以里面有与更新数据库状态的代码。

const Pan = require('../model/Pan');
const {Cluster} = require('puppeteer-cluster');
const crawler = require('./crawler');const cookies = [];async function selectAll(nodes) {console.log('selectAll',nodes.length);for (let node of nodes) {await node.click();break;}
}async function click(nodes) {console.log('click',nodes.length);for (let node of nodes) {if (node.title === '提取文件') {await node.click();}}
}async function writeCode(nodes, code) {console.log('writeCode',nodes.length);for (let node of nodes) {node.value = code;}
}async function confirm(nodes) {console.log(nodes.length);for (let node of nodes) {console.log(node.tagName);if (node.tagName === 'A') {await node.click();}}
}async function clickSave(nodes) {for (let node of nodes) {if (node.tagName === 'A') {await node.click();break;}}
}async function chooseLocation(nodes) {for (let node of nodes) {node.setAttribute('class', 'save-path-item check');}
}async function saveBaidu() {const cluster = await Cluster.launch(crawler.clusterLanuchOptionsPan);await cluster.task(async ({page, data}) => {let {id, url, code} = data;for (let i = 0; i < cookies.length; i++) {await page.setCookie(cookies[i]);}await page.goto(url);await page.waitForSelector('html');await page.content();let title = await page.title();let codeWrong = false;let used = true;let needCodeButNone = false;if (title.indexOf('提取码') !== -1) {// todo 填写提取码if (code === '-' || code === '+') {needCodeButNone = true;} else {await page.$$eval('#accessCode', writeCode, code);await page.$$eval('.g-button-blue-large', click);await page.waitFor(1000);let content = await page.content();if (content.indexOf('验证码错误') !== -1) {used = false;} else if (content.indexOf('提取码错误') !== -1) {codeWrong = true;used = false;} else {await page.waitFor(2000);}}}if (used && !needCodeButNone) {title = await page.title();await page.waitFor(1000);console.log(title);if (title.indexOf('不存在') !== -1) {} else {// todo 找到title=保存到网盘的a标签并点击let x = await page.$$('.zbyDdwb');console.log(x.length);if (!(x === null || x===undefined || x.length === 0)){await page.$$eval('.zbyDdwb', selectAll);}await page.$$eval('[title=保存到网盘]', clickSave);await page.$$eval('.save-path-item', chooseLocation);await page.waitFor(2000);await page.$$eval('[title=确定]', confirm);}}await Pan.update({used: used,code_wrong: codeWrong,need_code: needCodeButNone}, {where: {id: id}});await page.waitFor(3000);});let pans = await Pan.findAll({where: {site_id:12,reachable: true,used:false,code_wrong:false}});console.log(pans.length);for (let i = 0; i < pans.length; i++) {if (pans[i].url.startsWith('http://pan.baidu') || pans[i].url.startsWith('https://pan.baidu')) {await cluster.queue({id: pans[i].id,url: pans[i].url,code: pans[i].code});}}await cluster.idle();
}(async () => {await saveBaidu();
})();// crawler.clusterLanuchOptionsPan 是启动配置项,如下
const launchOptions = {headless: true,ignoreHTTPSErrors: true,        // 忽略证书错误waitUntil: 'networkidle2',defaultViewport: {width: 1920,height: 1080},args: ['--disable-gpu','--disable-dev-shm-usage','--disable-web-security','--disable-xss-auditor',    // 关闭 XSS Auditor'--no-zygote','--no-sandbox','--disable-setuid-sandbox','--allow-running-insecure-content',     // 允许不安全内容'--disable-webgl','--disable-popup-blocking',//'--proxy-server=http://127.0.0.1:8080'      // 配置代理],executablePath: 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe',
};const clusterLanuchOptionsPan = {concurrency: Cluster.CONCURRENCY_PAGE,  // 单Chrome多tab模式maxConcurrency: 1,  // 并发的workers数retryLimit: 2,   // 重试次数skipDuplicateUrls: true,  // 不爬重复的urlmonitor: false,  // 显示性能消耗puppeteerOptions: launchOptions,
};

炒鸡辣鸡原创文章,转载请注明来源

用 puppeteer 模拟人工实现网盘链接批量转存相关推荐

  1. 教师资格证考试备考资料大合集(历年真题+常用考点+模拟试题+面试),共460份,987M,附件中为网盘链接

    教师资格证考试备考资料大合集(历年真题+常用考点+模拟试题+面试),共460份,987M,附件中为网盘链接. 下载地址:https://download.csdn.net/download/mengc ...

  2. 几行代码,网盘链接提头来见!

    文 | 闲欢 来源:Python 技术「ID: pythonall」 背景 晚上,女朋友下班回来,我邀请她下楼去散步,她一副愁眉苦脸的样子,说今晚要加班. 仔细询问之下得知:女朋友今天接到上司一个任务 ...

  3. 数据结构教程网盘链接_数据结构101:链接列表

    数据结构教程网盘链接 by Kevin Turney 凯文·特尼(Kevin Turney) Like stacks and queues, Linked Lists are a form of a ...

  4. Python爬虫实战三 | 蓝奏网盘抓取网盘链接信息

    今天在使用蓝奏网盘的时候发现有一个文件夹加密分享,然后我就尝试了加密文件夹,但是文件夹下的文件还是可以直接通过访问该文件链接得到,所以对于文件夹加密是否显得有点鸡肋了呐? 如此,我们便简单的使用Pyt ...

  5. 几行代码,网盘链接提头来见

    背景 晚上,女朋友下班回来,我邀请她下楼去散步,她一副愁眉苦脸的样子,说今晚要加班. 仔细询问之下得知:女朋友今天接到上司一个任务,领导丢给她一个文件,里面密密麻麻满是百度网盘链接和提取码,需要她今天 ...

  6. 油猴脚本第一家,网页网盘链接实时判断+资源搜索网站导航,资源重度患者的福利...

    现在网络上找资源,资源都是存在百度网盘的,大家都知道,百度网盘链接失效的非常之多.遇到网盘链接我们都要一个一个点进去查看链接是否失效,这样操作费时又累人.这时这个油猴脚本就可以帮忙了.实时判断网页中百 ...

  7. python爬虫基础教程115_Python解析网页源代码中的115网盘链接实例

    本文实例讲述了python解析网页源代码中的115网盘链接的方法.分享给大家供大家参考.具体方法分析如下: 其中的1.txt,是网页http://bbs.pediy.com/showthread.ph ...

  8. JDK1.8网盘链接

    每次在官网下载JDK8的时候都要登录账号,太麻烦了,这里给出网盘链接方便下载使用! 链接:https://pan.baidu.com/s/1ueTfaZkpvhBJjCtsbg-gVQ  提取码:sn ...

  9. java的jdk安装教程附百度网盘链接环境配置遇到的各种问题版本选择

    首先关于JDK版本的选择–附百度网盘链接 现在互联网行业各家公司大部分使用的是jdk8.0(也被叫做jdk1.8,有兴趣的话可以去百度以下jdk演变历史)虽然现在jdk更新到11版本了,但是不建议使用 ...

最新文章

  1. Caffe中对MNIST执行train操作执行流程解析
  2. mysql三锁,mysql锁机制之表锁(三)
  3. 最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra)
  4. [python3 - TroubleShooting] requests爬取中文网站后直接print,以及保存csv乱码
  5. P3932 浮游大陆的68号岛
  6. Python学习(3)变量类型
  7. Eclipse调试进入JDK源码
  8. 项目中的集中开发模型研究
  9. java docker 持续集成_最佳实战Docker持续集成图文详解
  10. 在苹果系统MacOS上安装PowerDesigner16.5
  11. java源文件在哪_java源文件由什么组成?
  12. mysql 锁住一行数据_MySQL-锁
  13. SpringBoot热部署--bunny0728
  14. Android的增量更新
  15. arm服务器测评_某ARM服务器与X86服务器简单性能对比
  16. Excel表格中第一个输入的零不显示怎么办?
  17. java 邮件中文标题显示问号?
  18. IOS之高德地图(一)显示出地图并定位成功
  19. UNIX网络编程—SCTP编译运行错误及解决
  20. 深富策略是正规合法平台:公私募称市场不具系统性风险

热门文章

  1. 牵手碧桂园,天猫好房布下一盘房产交易大棋
  2. php设计程序闰年的计算方法,php判断闰年的三种方法(闰年计算方法)
  3. C语言面试题实战汇总02
  4. 黄江二手车骗局,黄江二手车价格
  5. 人生的路呵,怎么越走越窄 ......
  6. 婚前签订的出轨协议书有没有法律效力
  7. 抢注过期域名的几大注意事项
  8. 合创视觉科技平面设计师的职业路线
  9. css rem和px换算,移动端的vw px rem之间换算
  10. FZU Problem 1019 猫捉老鼠