概要
在Puppeteer的入门教程和实践一文章,其中介绍了Puppeteer的几种使用方式,分别是网页截图,生成页面的PDF,分析当前页的脚本,写爬虫等,本文主要介绍了如何利用Puppeteer实现抓取淘宝特定商品的信息的过程。
代码
废话不多说,直接上代码。
//taobaoCrepper.js
const puppeteer = require('puppeteer');
const chalk = require('chalk');
let url = 'https://detail.tmall.com/item.htm?spm=a1z10.1-b-s.w19370147-18846483048.2.5ccf70bfVlqaMZ&id=568960237310&sku_properties=5919063:1173069333&scene=taobao_shop'; //要抓取的商品链接
let main = async function(){
let browser = await puppeteer.launch({
headless:false,
devtools:true
});
let page = await browser.newPage();
await page.goto(url,{
waitUntil:'networkidle0'
});
console.log(chalk.green('进入宝贝详情页'));
// await page.setViewport({
// 1920,
// height:1080
// });
let obj ={
title:'',
colors:[],
price:0,
suit:[],
skus:[],
detailImgs:[],
evaList:[]
};
try{
//获取模态窗口
let modalArray = await page.$$('#sufei-dialog-close');
//判断模态窗口是否存在,存在就关闭
if(modalArray.length){
await page.click('#sufei-dialog-close');
}
await page.waitFor(15000);
obj.title= await page.$eval('.tb-detail-hd > h1 >a',ele =>ele.text) ;
obj.price = await page.$eval('.tm-price',ele => ele.innerHTML);
obj.colors = await page.evaluate(()=>{
let as = [...document.querySelectorAll('li.tb-txt a > span')];
return as.map((a)=>{
return a.innerHTML;
});
});
obj.suit = await page.evaluate(()=>{
let as = [...document.querySelectorAll('li.tb-selected > a > span')];
return as.map((a)=>{
return a.innerHTML;
});
});
obj.skus = await page.evaluate(()=>{
let as = [...document.querySelectorAll('ul#J_UlThumb >li> a > img')];
return as.map((a)=>{
return a.src;
});
});
obj.detailImgs = await page.evaluate(()=>{
let as = [...document.querySelectorAll('div.ke-post > p > img')];
return as.map((a)=>{
return a.src;
});
});
await page.click('a[href="#J_Reviews"] ');
await page.waitFor(15000);
obj.evaList = await page.evaluate(()=>{
console.log('进入评价分析抓取方法');
let evaList = [...document.querySelectorAll('div.tm-rate-content>div.tm-rate-fulltxt')];
console.log(evaList);
return evaList.map((a)=>{
return a.textContent;
});
});
}catch(err){
console.log(chalk.red(err));
}
};
main();
注意事项
(1) 跳转到淘宝商品信息页面时会弹出模态窗口,有时不会,需要做一个判断。
(2)跳转到商品评价列表后要设置延时,等DOM加载完毕后再去获取对应内容。
(3)在抓取评价列表详情时,选择器不能之写成“div.tm-rate-fulltxt”,否则后把卖家回复的内容也抓取下来。
(4)本文只是把特定内容用JS爬取出来,并不涉及写入数据库的操作,待我学完再来更新呀555。