zoukankan      html  css  js  c++  java
  • nodeJS 爬虫,通过Puppeteer实现滚动加载

    最近在研究爬虫,所以用自己熟悉的node简单写了一个。

    开始用的是phantomjs来获取HTML,但是看了文档之后发现很久没有维护了,所以就放弃了。

    后来寻寻觅觅发现了 Puppeteer,看了下是Google开发的,所以果断上手试了试,感觉比phantom不知道高到哪里去了。

    B话少说,直接贴项目地址。

    github.com/Huoshendame…

    项目简介

    技术栈

    node、puppeteer、cheerio(虽然puppeteer集成了Jq,但是既然已经装了就用一下吧)

    安装注意事项

    在运行npm install 在安装 puppeteer的时候会报错,因为node下载chrome(puppeteer依赖chrome浏览器)会报错。所以先忽略掉chrome

    npm install puppeteer --ignore-scripts
    复制代码

    安装成功之后,在去运行

    npm install复制代码

    装好之后,手动吧项目里的 chrome-win 文件夹 放到D盘根目录。

    PS:或者你自己放到自己的指定目录,但是在项目里的reptile.js里面 puppeteer.launch的时候需要指定绝对定位的地址

     

    功能介绍

    1.通过Puppeteer打开头条新闻页面 https://www.toutiao.com/ch/news_game/。

    2.获取page实例,通过注入js来实现页面滚动

    3.在通过cheerio,分析dom结构,获取标题、图片及链接地址。

    4.存储到本地文件。(也可以放到DB里,我这里是直接接口返回了获取的数据,并且顺手存到了本地文件)

    /* 引入相关 工具 */
    const fs = require('fs')
    const cheerio = require('cheerio')
    const puppeteer = require('puppeteer')
     
    /* 定义函数 */
    let getListData = async function(Category) {
     /* 初始化 puppeteer*/
     const browser = await puppeteer.launch({
      executablePath: 'D:\chrome-win\chrome.exe',//把项目中的这个chrome-win文件夹放到D盘根目录
      headless: false //这个是 是否打开chrome可视化窗口 true是不打开 false是打开
     })
     //获取page实例
     const page = await browser.newPage()
     //我这里是通过 入参传过来的 分类来判断抓取相应页面的数据
     let url = ''
     switch (Category) {
      case '0':
       url = 'https://www.toutiao.com/ch/news_game/'
       break;
      case '1':
       url = 'https://www.toutiao.com/ch/news_entertainment/'
       break;
      case '2':
       url = 'https://www.toutiao.com/ch/news_history/'
       break;
      case '3':
       url = 'https://www.toutiao.com/ch/news_finance/'
       break;
     }
     //打开页面
     await page.goto(url)
     //定义页面内容及Jquery
     var content , $
     /* 页面滚动方法 */
     async function scrollPage(i) {
      content = await page.content();
      $ = cheerio.load(content);
      /*执行js代码(滚动页面)*/
      await page.evaluate(function () {
       /* 这里做的是渐进滚动,如果一次性滚动则不会触发获取新数据的监听 */
       for (var y = 0; y <= 1000*i; y += 100) {
        window.scrollTo(0,y)
       }
      })
      // 获取数据列表
      const li = $($('.feedBox').find('ul')[0]).find('li')
      return li
     }
     let i = 0
     let li = await scrollPage(++i)
     //如果数据列表 不够30 则一直获取
     while (li.length < 30) {
      li = await scrollPage(++i)
     }
     let data = {
       list: []
     }
     /* 封装返回的数据*/
     li.map(function (index,item) {
      $(item).find('img').attr('src') != undefined ?
       data.list.push({
        src: $(item).find('img').attr('src'),
        title: $($(item).find('.title')).text(),
        source:$($(item).find('.source')).text(),
        href:$($(item).find('.title')).attr('href')
       }):''
     })
     //顺手存入本地文件
     fs.writeFileSync('tt.JSON',JSON.stringify(data))
     fs.writeFileSync('tt.html',content)
     /* 关闭 puppeteer*/
     await browser.close()
      return data
    }
    module.exports = getListData复制代码

    最近在研究爬虫,所以用自己熟悉的node简单写了一个。

    开始用的是phantomjs来获取HTML,但是看了文档之后发现很久没有维护了,所以就放弃了。

    后来寻寻觅觅发现了 Puppeteer,看了下是Google开发的,所以果断上手试了试,感觉比phantom不知道高到哪里去了。

    B话少说,直接贴项目地址。

    github.com/Huoshendame…

    项目简介

    技术栈

    node、puppeteer、cheerio(虽然puppeteer集成了Jq,但是既然已经装了就用一下吧)

    安装注意事项

    在运行npm install 在安装 puppeteer的时候会报错,因为node下载chrome(puppeteer依赖chrome浏览器)会报错。所以先忽略掉chrome

     

     

     

     

    1.  
      npm install puppeteer --ignore-scripts
    2.  
      复制代码

    安装成功之后,在去运行

     

     

     

     

    npm install复制代码

    装好之后,手动吧项目里的 chrome-win 文件夹 放到D盘根目录。

    PS:或者你自己放到自己的指定目录,但是在项目里的reptile.js里面 puppeteer.launch的时候需要指定绝对定位的地址

     

    功能介绍

    1.通过Puppeteer打开头条新闻页面 https://www.toutiao.com/ch/news_game/。

    2.获取page实例,通过注入js来实现页面滚动

    3.在通过cheerio,分析dom结构,获取标题、图片及链接地址。

    4.存储到本地文件。(也可以放到DB里,我这里是直接接口返回了获取的数据,并且顺手存到了本地文件)

     

    源码

     

    1.  
      /* 引入相关 工具 */
    2.  
      const fs = require('fs')
    3.  
      const cheerio = require('cheerio')
    4.  
      const puppeteer = require('puppeteer')
    5.  
       
    6.  
      /* 定义函数 */
    7.  
      let getListData = async function(Category) {
    8.  
      /* 初始化 puppeteer*/
    9.  
      const browser = await puppeteer.launch({
    10.  
      executablePath: 'D:\chrome-win\chrome.exe',//把项目中的这个chrome-win文件夹放到D盘根目录
    11.  
      headless: false //这个是 是否打开chrome可视化窗口 true是不打开 false是打开
    12.  
      })
    13.  
      //获取page实例
    14.  
      const page = await browser.newPage()
    15.  
      //我这里是通过 入参传过来的 分类来判断抓取相应页面的数据
    16.  
      let url = ''
    17.  
      switch (Category) {
    18.  
      case '0':
    19.  
      url = 'https://www.toutiao.com/ch/news_game/'
    20.  
      break;
    21.  
      case '1':
    22.  
      url = 'https://www.toutiao.com/ch/news_entertainment/'
    23.  
      break;
    24.  
      case '2':
    25.  
      url = 'https://www.toutiao.com/ch/news_history/'
    26.  
      break;
    27.  
      case '3':
    28.  
      url = 'https://www.toutiao.com/ch/news_finance/'
    29.  
      break;
    30.  
      }
    31.  
      //打开页面
    32.  
      await page.goto(url)
    33.  
      //定义页面内容及Jquery
    34.  
      var content , $
    35.  
      /* 页面滚动方法 */
    36.  
      async function scrollPage(i) {
    37.  
      content = await page.content();
    38.  
      $ = cheerio.load(content);
    39.  
      /*执行js代码(滚动页面)*/
    40.  
      await page.evaluate(function () {
    41.  
      /* 这里做的是渐进滚动,如果一次性滚动则不会触发获取新数据的监听 */
    42.  
      for (var y = 0; y <= 1000*i; y += 100) {
    43.  
      window.scrollTo(0,y)
    44.  
      }
    45.  
      })
    46.  
      // 获取数据列表
    47.  
      const li = $($('.feedBox').find('ul')[0]).find('li')
    48.  
      return li
    49.  
      }
    50.  
      let i = 0
    51.  
      let li = await scrollPage(++i)
    52.  
      //如果数据列表 不够30 则一直获取
    53.  
      while (li.length < 30) {
    54.  
      li = await scrollPage(++i)
    55.  
      }
    56.  
      let data = {
    57.  
      list: []
    58.  
      }
    59.  
      /* 封装返回的数据*/
    60.  
      li.map(function (index,item) {
    61.  
      $(item).find('img').attr('src') != undefined ?
    62.  
      data.list.push({
    63.  
      src: $(item).find('img').attr('src'),
    64.  
      title: $($(item).find('.title')).text(),
    65.  
      source:$($(item).find('.source')).text(),
    66.  
      href:$($(item).find('.title')).attr('href')
    67.  
      }):''
    68.  
      })
    69.  
      //顺手存入本地文件
    70.  
      fs.writeFileSync('tt.JSON',JSON.stringify(data))
    71.  
      fs.writeFileSync('tt.html',content)
    72.  
      /* 关闭 puppeteer*/
    73.  
      await browser.close()
    74.  
      return data
    75.  
      }
    76.  
      module.exports = getListData复制代码

     

     
  • 相关阅读:
    6.金额中带有逗号不能直接parseFloat
    5-不要在ajax中return false不会生效的
    4.xx is not defined at HTMLAnchorElement.onclick 的问题
    3.git更新地址也更改
    2.文件上传后没有权限不够
    第三章
    oracle-sql
    华为杯 数模
    Learning Dynamic Context Graphs for Predicting Social Events
    图神经网络
  • 原文地址:https://www.cnblogs.com/Im-Victor/p/15062564.html
Copyright © 2011-2022 走看看