Pupeteer爬虫实践(爬取淘宝商品)

概要

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。

原文地址:https://www.cnblogs.com/JessicaIsEvolving/p/9639336.html