前言:
这几天由于工作时的需要大量的图片,于是就去百度搜索相关的图片,一张一张的图片下载,发现1分钟才下个几十张图片,实在太慢,而且是机械性的操作,于是找想到使用puppeteer来帮忙我做这些事情。
安装:
npm install puppeteer --save --registry=https://registry.npm.taobao.org
会下载Chromium,但是这个需要翻墙才能继续下载
开始使用:
1.找到目标网址:https://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=%E9%87%8E%E7%94%9F%E7%8C%B4%E5%AD%90&step_word=&hs=0&pn=0&spn=0&di=110&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&istype=2&ie=utf-8&oe=utf-8&in=&cl=2&lm=-1&st=-1&cs=2619896592%2C2037015882&os=1636180671%2C3674573131&simid=4260907139%2C665364550&adpicid=0&lpn=0&ln=1057&fr=&fmq=1567152992286_R&fm=detail&ic=undefined&s=undefined&hd=undefined&latest=undefined©right=undefined&se=&sme=&tab=0&width=undefined&height=undefined&face=undefined&ist=&jit=&cg=&bdtype=0&oriquery=&objurl=http%3A%2F%2Fs1.sinaimg.cn%2Fmw690%2F001mfmIfgy6N9QLVYdi90%26690&fromurl=ippr_z2C%24qAzdH3FAzdH3Fks52_z%26e3Bftgw_z%26e3Bv54_z%26e3BvgAzdH3FfAzdH3Fks52_9wnn9m10a8adenty_z%26e3Bip4s&gsm=0&rpstart=0&rpnum=0&islist=&querylist=&force=undefined
2.分析这里的下载步骤,到首页后,先点击下载按钮,再点击下一张图片,但是由于点击下载后会跳转到新的tabs页面,所以需要返回上一个tab标签页,
实现代码如下:
async function downLoadImage(page, browser) { await page.click('.btn-download',{delay:1000}); // 点击下载 await page.bringToFront(); // 返回上一个标签页 await page.click('.img-next'); // 点击下一张图片 current++; // 已经下载的图片 if (needNumbers > current) { // 如果下载图片大于需要下载的图片 则继续下载 downLoadImage(page,browser); }else{ // 否则终止下载 copy('C:\\Users\\*****\\Downloads','E:\\work\\算法训练平台相关\\猴子'); browser.close(); // 关闭进程 }}
- 由于这里下载的图片是直接保存谷歌的默认下载地址里的,所以需要把下载的图片剪切到我们需要的目录里:
function copy(origin,dest) { fs.readdir(origin,(err,files) =>{ // 获取下载目录里的所有文件 然后对其执行复制处理 files.forEach(item =>{ if(/^.*(jpg|png|jpeg)$/.test(item)){ const originPath = path.join(origin,item); const destPath = path.join(dest,item); fs.writeFileSync(destPath,fs.readFileSync(originPath)); fs.unlinkSync(originPath); } }) })}
每复制一个文件就删除一个文件,所以在下载的目录里记得把有用的图片先提前保存了。
原文链接: 使用puppeteer下载百度图片