|
@@ -14,6 +14,8 @@
|
|
|
<template slot="title"><i class="el-icon-picture"></i>图片下载</template>
|
|
|
<el-menu-item index="1">阿里巴巴</el-menu-item>
|
|
|
<el-menu-item index="2">京东</el-menu-item>
|
|
|
+ <el-menu-item index="3">天猫</el-menu-item>
|
|
|
+ <el-menu-item index="4">淘宝</el-menu-item>
|
|
|
<el-menu-item index="10">其他网址</el-menu-item>
|
|
|
</el-submenu>
|
|
|
|
|
@@ -43,7 +45,7 @@
|
|
|
</div>
|
|
|
|
|
|
<div style="padding: 15px 20px 0 20px; height: calc(100% - 160px);">
|
|
|
- <el-input type="textarea" :rows="5" placeholder="请输入网址链接(例:https://www.example.com)" v-model="url"></el-input>
|
|
|
+ <el-input type="textarea" :rows="5" :placeholder="'请输入网址链接(例:' + exampleUrl[menuIndex-1] + ')'" v-model="url"></el-input>
|
|
|
|
|
|
<div style="padding: 20px 0;">
|
|
|
<el-row>
|
|
@@ -84,7 +86,11 @@
|
|
|
</template>
|
|
|
|
|
|
<template v-if="menuIndex == '2'">
|
|
|
- <el-button size="small" type="info" @click="accountLogin()" >检测登录状态</el-button>
|
|
|
+ <el-checkbox :value="true" style="opacity: 0.6; cursor: not-allowed;">下载主图</el-checkbox>
|
|
|
+ <el-checkbox v-model="settingData.detailImg" >下载详情图</el-checkbox>
|
|
|
+ <el-checkbox v-model="settingData.skuImg" >下载SKU图</el-checkbox>
|
|
|
+ <!-- <el-checkbox v-model="settingData.commentImg" >下载评论图</el-checkbox> -->
|
|
|
+ <el-checkbox v-model="settingData.video" >下载视频</el-checkbox>
|
|
|
</template>
|
|
|
|
|
|
</el-row>
|
|
@@ -154,6 +160,7 @@
|
|
|
video: true,
|
|
|
},
|
|
|
activities: [],
|
|
|
+ exampleUrl: ['https://www.1688.com', 'https://www.jd.com', 'https://www.tmall.com', 'https://www.taobao.com'],
|
|
|
|
|
|
fileList: [],
|
|
|
|
|
@@ -325,7 +332,13 @@
|
|
|
case '2': // 京东
|
|
|
this.jdDownload();
|
|
|
break;
|
|
|
- case '10': // 其他网址
|
|
|
+ case '3': // 天猫
|
|
|
+ this.tmallDownload();
|
|
|
+ break;
|
|
|
+ case '4': // 淘宝
|
|
|
+ this.tbDownload();
|
|
|
+ break;
|
|
|
+ case '10': // 普通网址
|
|
|
this.normalDownload();
|
|
|
break;
|
|
|
}
|
|
@@ -470,97 +483,230 @@
|
|
|
})();
|
|
|
},
|
|
|
|
|
|
- // 账号登录
|
|
|
- accountLogin(type){
|
|
|
+ // 京东下载
|
|
|
+ jdDownload(){
|
|
|
(async () => {
|
|
|
try{
|
|
|
- if(!this.jdBrowser){
|
|
|
- this.jdBrowser = await puppeteer.launch({ headless: false });
|
|
|
- }
|
|
|
- const page = await this.jdBrowser.newPage();
|
|
|
- await page.setViewport({ width: 1280, height: 800 });
|
|
|
+ const jdBrowser = await puppeteer.launch();
|
|
|
+ const page = await jdBrowser.newPage();
|
|
|
+ await page.setViewport({ width: 1280, height: 800 });
|
|
|
+
|
|
|
+ let jdImgInfo = {
|
|
|
+ mainImg: [],
|
|
|
+ skuImg: [],
|
|
|
+ commentImg: [],
|
|
|
+ detailImg: [],
|
|
|
+ video: []
|
|
|
+ };
|
|
|
+
|
|
|
+ let titleFlag = true;
|
|
|
|
|
|
page.on('response', async(response) => {
|
|
|
+
|
|
|
+ if(titleFlag){ // 第一次生成页面标题
|
|
|
+ await this.getTitle(page);
|
|
|
+ titleFlag = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(this.activities.length < 2){
|
|
|
+ this.activities.push({id: 2, num:0, content: '图片下载中...',type: 'success'});
|
|
|
+ }
|
|
|
+
|
|
|
// 检查响应的 MIME 类型是否以 'image/' 开头
|
|
|
- if (response.headers()['content-type'] && response.headers()['content-type'].startsWith('application/json')) {
|
|
|
+ if (response.headers()['content-type'] && response.headers()['content-type'].startsWith('application/json')) {
|
|
|
+
|
|
|
+ let detailUrl = '';
|
|
|
+ let videoUrl = '';
|
|
|
+ if(response.url().indexOf('&callback=showdesc') > -1 && response.url().indexOf('/description/') > -1){ // 商品详情接口
|
|
|
+ detailUrl = response.url();
|
|
|
+ }
|
|
|
|
|
|
- console.log(response.url(), response.headers()['content-type']);
|
|
|
+ if(response.url().indexOf('/tencent/video_v3') > -1){ // 商品视频接口
|
|
|
+ videoUrl = response.url();
|
|
|
+ }
|
|
|
+
|
|
|
+ if(detailUrl && this.settingData.detailImg){ // jd商品详情
|
|
|
+ try {
|
|
|
+ let data = await response.text();
|
|
|
+ data = data.slice(0, -1).replace('showdesc(', '');
|
|
|
+ let detailInfo = JSON.parse(data);
|
|
|
+ let regex = /(http|https):\/\/img[0-9]+.360buyimg.com\S+.(jpg|jpeg|png|gif|avif|tif|tiff)/g;
|
|
|
+ let detailImgArr = [];
|
|
|
+ if(detailInfo && detailInfo.content){
|
|
|
+ detailImgArr = detailInfo.content.match(regex);
|
|
|
+ }
|
|
|
+ jdImgInfo.detailImg = detailImgArr;
|
|
|
+
|
|
|
+ for(let i = 0; i < detailImgArr.length; i++){
|
|
|
+ let fileName = detailImgArr[i].split('/').pop();
|
|
|
+ if(fileName){
|
|
|
+ var queryIndex = fileName.indexOf('?');
|
|
|
+ if (queryIndex !== -1) {
|
|
|
+ fileName = fileName.substr(0, queryIndex);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!fs.existsSync(this.handleData.newPath + '\\详情图')) {
|
|
|
+ fs.mkdirSync(this.handleData.newPath + '\\详情图');
|
|
|
+ }
|
|
|
+
|
|
|
+ let outputPath = this.handleData.newPath + '\\详情图\\' + fileName;
|
|
|
+ await this.downloadImage(detailImgArr[i], outputPath);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ } catch (error) {
|
|
|
+ console.error('详情图片解析失败:', error);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(videoUrl && this.settingData.video){ // jd商品视频
|
|
|
+ try {
|
|
|
+ let data = await response.text();
|
|
|
+ data = data.slice(0, -1).replace(/^jQuery[0-9]+\(/, '');
|
|
|
+ let videoInfo = JSON.parse(data);
|
|
|
+ let videoUrl = videoInfo.playUrl;
|
|
|
+ jdImgInfo.video.push(videoUrl);
|
|
|
+
|
|
|
+ let fileName = videoUrl.split('/').pop();
|
|
|
+ if(fileName){
|
|
|
+ var queryIndex = fileName.indexOf('?');
|
|
|
+ if (queryIndex !== -1) {
|
|
|
+ fileName = fileName.substr(0, queryIndex);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!fs.existsSync(this.handleData.newPath + '\\视频')) {
|
|
|
+ fs.mkdirSync(this.handleData.newPath + '\\视频');
|
|
|
+ }
|
|
|
+
|
|
|
+ let outputPath = this.handleData.newPath + '\\视频\\' + fileName;
|
|
|
+ await this.downloadImage(videoUrl, outputPath);
|
|
|
+ }
|
|
|
+
|
|
|
+ } catch (error) {
|
|
|
+ console.error('视频解析失败:', error);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (response.headers()['content-type'] && response.headers()['content-type'].startsWith('image/')) {
|
|
|
+ let regex = /^https:\/\/img[0-9]+.360buyimg.com\/n/;
|
|
|
+ if(regex.exec(response.url())){ // 匹配符合规则的图片路径
|
|
|
+ let reg = /\/n[0-9]+\/jfs\//;
|
|
|
+ if(response.url().indexOf('/s40x40_jfs/') > -1 && this.settingData.skuImg){ // sku图片
|
|
|
+ let skuImgUrl = response.url().replace('/s40x40_jfs/', '/jfs/').replace(/\/n[0-9]+\/jfs\//, '/n1/jfs/');;
|
|
|
+ jdImgInfo.skuImg.push(skuImgUrl);
|
|
|
+
|
|
|
+ let fileName = skuImgUrl.split('/').pop();
|
|
|
+ if(fileName){
|
|
|
+ var queryIndex = fileName.indexOf('?');
|
|
|
+ if (queryIndex !== -1) {
|
|
|
+ fileName = fileName.substr(0, queryIndex);
|
|
|
+ }
|
|
|
+ if (!fs.existsSync(this.handleData.newPath + '\\sku图')) {
|
|
|
+ fs.mkdirSync(this.handleData.newPath + '\\sku图');
|
|
|
+ }
|
|
|
+ let outputPath = this.handleData.newPath + '\\sku图\\' + fileName;
|
|
|
+ await this.downloadImage(skuImgUrl, outputPath);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(response.url().match(reg)){ // 主图
|
|
|
+ let mainImgUrl = response.url().replace(/\/n[0-9]+\/jfs\//, '/n1/jfs/');
|
|
|
+ jdImgInfo.mainImg.push(mainImgUrl);
|
|
|
+
|
|
|
+ let fileName = mainImgUrl.split('/').pop();
|
|
|
+ if(fileName){
|
|
|
+ var queryIndex = fileName.indexOf('?');
|
|
|
+ if (queryIndex !== -1) {
|
|
|
+ fileName = fileName.substr(0, queryIndex);
|
|
|
+ }
|
|
|
+ if (!fs.existsSync(this.handleData.newPath + '\\主图')) {
|
|
|
+ fs.mkdirSync(this.handleData.newPath + '\\主图');
|
|
|
+ }
|
|
|
+ let outputPath = this.handleData.newPath + '\\主图\\' + fileName;
|
|
|
+ await this.downloadImage(mainImgUrl, outputPath);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
});
|
|
|
|
|
|
- //await page.setJavaScriptEnabled(false);
|
|
|
- // await page.goto('https://www.jd.com/', {waitUntil : 'networkidle2'});
|
|
|
- await page.goto('https://item.jd.com/10056666299521.html', {waitUntil : 'networkidle2'});
|
|
|
+ await page.goto(this.url, {waitUntil : 'networkidle2'});
|
|
|
|
|
|
- page.on('request', request => {
|
|
|
- console.log(request);
|
|
|
- // 检查请求的 URL 是否符合可能导致跳转的条件
|
|
|
- // if (/* 某些条件,比如 URL 包含特定字符串 */) {
|
|
|
- // request.abort(); // 取消请求
|
|
|
- // } else {
|
|
|
- // request.continue(); // 允许请求继续
|
|
|
- // }
|
|
|
- });
|
|
|
- await page.setRequestInterception(true);
|
|
|
+ await jdBrowser.close();
|
|
|
+ this.activities.push({id: 3, content: '图片下载完成',type: 'success'});
|
|
|
+ }catch(e){
|
|
|
+ this.showError(e);
|
|
|
+ }
|
|
|
+ })();
|
|
|
+ },
|
|
|
+
|
|
|
+ // 天猫下载
|
|
|
+ tmallDownload(){
|
|
|
+ (async () => {
|
|
|
+ try{
|
|
|
+ const jdBrowser = await puppeteer.launch();
|
|
|
+ const page = await jdBrowser.newPage();
|
|
|
+ await page.setViewport({ width: 1280, height: 800 });
|
|
|
|
|
|
+ let jdImgInfo = {
|
|
|
+ mainImg: [],
|
|
|
+ skuImg: [],
|
|
|
+ commentImg: [],
|
|
|
+ detailImg: [],
|
|
|
+ video: []
|
|
|
+ };
|
|
|
|
|
|
-
|
|
|
+ let titleFlag = true;
|
|
|
+
|
|
|
+ page.on('response', async(response) => {
|
|
|
+
|
|
|
+ // if(titleFlag){ // 第一次生成页面标题
|
|
|
+ // await this.getTitle(page);
|
|
|
+ // titleFlag = false;
|
|
|
+ // }
|
|
|
+
|
|
|
+ if(this.activities.length < 2){
|
|
|
+ this.activities.push({id: 2, num:0, content: '图片下载中...',type: 'success'});
|
|
|
+ }
|
|
|
|
|
|
- let loginResult = await page.evaluate(() => {
|
|
|
- if(document.querySelector('.link-login')){
|
|
|
- document.querySelector('.link-login').click();
|
|
|
- return false;
|
|
|
- }else{
|
|
|
- return true;
|
|
|
+ // 检查响应的 MIME 类型是否以 'image/' 开头
|
|
|
+ if (response.headers()['content-type'] && response.headers()['content-type'].startsWith('application/json')) {
|
|
|
+
|
|
|
+ let data = await response.text();
|
|
|
+ console.log(data);
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if (response.headers()['content-type'] && response.headers()['content-type'].startsWith('image/')) {
|
|
|
+
|
|
|
}
|
|
|
+
|
|
|
});
|
|
|
|
|
|
- if(loginResult){ // 登录成功
|
|
|
- //const cookies = await page.cookies('https://www.jd.com/');
|
|
|
- //await page.setViewport({ width: 1, height: 1 });
|
|
|
- console.log('登录成功');
|
|
|
- }else{ //登录失败
|
|
|
- console.log('登录失败');
|
|
|
- }
|
|
|
-
|
|
|
- // let scrollHeight = pageInfo.scrollHeight;
|
|
|
- // let cHeight = pageInfo.cHeight;
|
|
|
-
|
|
|
- // let num = Math.ceil(scrollHeight / cHeight);
|
|
|
- // let start = -1;
|
|
|
- // let scrollInt = setInterval(async() => {
|
|
|
- // start ++;
|
|
|
- // await page.evaluate((start) => {
|
|
|
- // let cHeight = document.documentElement.clientHeight;
|
|
|
- // window.scrollTo({
|
|
|
- // top: cHeight * start,
|
|
|
- // behavior: "smooth"
|
|
|
- // });
|
|
|
- // }, start);
|
|
|
- // if(start > num || start > 500){ // 防止页面过长,滚动500次自动停止
|
|
|
- // clearInterval(scrollInt);
|
|
|
- // await this.scanImg(this.jdBrowser, page);
|
|
|
- // this.loading = false;
|
|
|
- // }
|
|
|
- // }, 500);
|
|
|
+ let testUrl = 'https://detail.tmall.com/item.htm?id=666055276707&spm=a21bo.jianhua%2Fa.201876.d9.5af92a895n1RYy&scm=1007.40986.276750.0&pvid=5feff41b-7992-483e-96dc-b87acafa1ea9&xxc=home_recommend&utparam=%7B%22aplus_abtest%22%3A%22b579fe12b84b34042c867320618f0c6b%22%7D&priceTId=2147807217241454856155439e67b8&pisk=fG5xstAYAuqDq32GGZwksGpFOMUo6sQqmi7IshxmCgIRRwoDCh2VXdIG4d1DiZj-u_IKsjq43NG9sCZ3xWVhurRw1k2muoem0E8K15x6fLGYU_n7xWVhy-T2saZ37kskZH8M1E9jhbaJSeGs1G9sNaty7FiX5jaRP3861F9shagWoFTsfxG5tlKSlhcOChxReugMGfG1G5JvvLDi6fdXlKC1z3BlE_LvHH9uKDcNGgb1isJzEYRNr9IOCGynUIQ1hIThuShJOZ6l6UfgSAKfr_Q5ML3K9KB6WpO6eVG1yI6DFsAQO0LPFZX1gi3t1E5ctdKeePGwIQ1Hd9sx7y7WGFswL1qEgn_186WH97DXOaB1vOIPf6fLn-oHvFDbyzHZQKTojP1_90ukYHYJxrFtQAJzzUK3yzHZQKTyyH4YDAkwUz5..';
|
|
|
|
|
|
+ await page.goto(testUrl, {waitUntil : 'networkidle2'});
|
|
|
|
|
|
+ await jdBrowser.close();
|
|
|
+ this.activities.push({id: 3, content: '图片下载完成',type: 'success'});
|
|
|
}catch(e){
|
|
|
this.showError(e);
|
|
|
}
|
|
|
})();
|
|
|
},
|
|
|
|
|
|
- // 京东下载
|
|
|
- jdDownload(){
|
|
|
+ //淘宝下载
|
|
|
+ tbDownload(){
|
|
|
|
|
|
},
|
|
|
|
|
|
-
|
|
|
- // 扫描并下载图片
|
|
|
+ // 阿里巴巴 - 扫描并下载图片
|
|
|
async scanImg(browser, page){
|
|
|
//detailImg:详情图;skuImg:sku图片;commentImg: 评论图;video: 视频
|
|
|
-
|
|
|
const imgInfo = await page.evaluate(() => {
|
|
|
let outObj = {
|
|
|
mainImg: [],
|
|
@@ -701,7 +847,6 @@
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
await browser.close();
|
|
|
this.activities.push({id: 3, content: '图片下载完成',type: 'success'});
|
|
|
},
|