通过puppeteer爬取书籍信息

简单介绍

个人理解:就是一个模拟用户对页面操作和获取页面信息,处理页面请求的工具.

可以用于爬虫或自动化测试.

中文文档

puppeteer.js中文文档|puppeteerjs中文网|puppeteer爬虫教程

学习看文档就可以,此处仅仅通过一个例子来学习,记录

例子

介绍

通过puppeteer爬取书本信息(书本的下载地址,书本的名称以及下载密码).

准备工作

默认安装NodeJs,并有一定的Js基础。
下载所需工具

npm install puppeteer

代码同级目录,建text.txt文件

代码
const puppeteer = require("puppeteer");
const url = require('url');
const fs = require('fs');
//进入网站,获取网站列表页的页数
//获取表页的所有链接
//进入每一个电子书的详情页获取下载电子书的网盘地址
let httpUrl = 'https://sobooks.cc/';
let anhao = '867870';
(async function(){
  //启动参数
  let options = {
    headless: true
  }
  //一个等待函数
  function lcWait(millisSecondes){
    return new Promise(function(resolve,reject){
      setTimeout(function(){
        resolve("延迟时间数");
      },millisSecondes)
    });
  }
  //启动
  let browser = await puppeteer.launch(options);
  //获取页面总数
  async function getAllNum(){
    let page = await browser.newPage();
    await page.goto(httpUrl);
    //设置选择器
    let pageNum = await page.$eval(".pagination li:last-child span",(element)=>{
      let text =element.innerHTML;
      text = text.substring(1,text.length-2).trim();
      return text;
    });
    page.close();
    return pageNum;
  }
  //获取某个页面
  async function pageList(num){
    let pageListUrl = "https://sobooks.cc/page/"+num;
    let page = await browser.newPage();
    await page.goto(pageListUrl);
    let pageArr=await page.$$eval('.card .card-item .thumb-img>a',(elements)=>{
      let arr = [];
      elements.forEach((element,i)=>{
        var obj = {
          href: element.getAttribute("href"),
          title: element.getAttribute("title")
        };
        arr.push(obj);
      });
      return arr;
    });
    page.close();
    pageArr.forEach(async (pageObj,i)=>{
      await lcWait(5000*i);
      pageInfo(pageObj);
    });
  }
  //获取页面信息
  async function pageInfo(pageObj){
    let page = await browser.newPage();
    //监听请求事件并拦截
    await page.setRequestInterception(true);
    page.on('request',interceptedRequest=>{
      let urlObj = url.parse(interceptedRequest.url());
      if(urlObj.hostname=="googleads.g.doubleclick.net"){
        interceptedRequest.abort();
      }else{
        interceptedRequest.continue();
      }
    })
    await page.goto(pageObj.href);
    //选择输入框
    let inputElement = await page.$('.euc-y-i');
    //光标选中
    await inputElement.focus();
    await page.keyboard.type(anhao);
    let btnElement=await page.$('.euc-y-s');
    await btnElement.click();
    //等待后才能获得链接
    await page.waitForSelector('.e-secret b a:first-child');
    //获取密码
    let pwd = await page.$eval('.e-secret b',(element)=>{
        let text =element.innerText;
        let s = text.indexOf('密码');
        let e = text.indexOf('\n');
        let pwd = text.substring(s+3,e);
        return pwd;
    });
    //获取网盘链接
    let hrefA = await page.$eval('.e-secret b a:first-child',el=>el.href);
    console.log(hrefA)
    hrefA = hrefA.split('?url=')[1];
    //封装
    let content = `{
      "title": "${pageObj.title}",
      "href": "${hrefA}",
      "pwd": ${pwd}
    }|`;
    await fs.writeFile('book.txt',content,{flag:"a"},()=>{
      console.log(pageObj.title+"已写入!");
      page.close();
    });
  }
   //我仅仅爬取了一页数据,如果有需要通过循环爬取每一页数据
  //let pageNum = await getAllNum();
  await pageList(1);
})();

你可能感兴趣的:(web前端,js,nodejs,web)