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. let getListData = async function(Category) {

  7. /* 初始化 puppeteer*/

  8. const browser = await puppeteer.launch({

  9. executablePath: 'D:\\chrome-win\\chrome.exe',//把项目中的这个chrome-win文件夹放到D盘根目录

  10. headless: false //这个是 是否打开chrome可视化窗口 true是不打开 false是打开

  11. })

  12. //获取page实例

  13. const page = await browser.newPage()

  14. //我这里是通过 入参传过来的 分类来判断抓取相应页面的数据

  15. let url = ''

  16. switch (Category) {

  17. case '0':

  18. url = 'https://www.toutiao.com/ch/news_game/'

  19. break;

  20. case '1':

  21. url = 'https://www.toutiao.com/ch/news_entertainment/'

  22. break;

  23. case '2':

  24. url = 'https://www.toutiao.com/ch/news_history/'

  25. break;

  26. case '3':

  27. url = 'https://www.toutiao.com/ch/news_finance/'

  28. break;

  29. }

  30. //打开页面

  31. await page.goto(url)

  32. //定义页面内容及Jquery

  33. var content , $

  34. /* 页面滚动方法 */

  35. async function scrollPage(i) {

  36. content = await page.content();

  37. $ = cheerio.load(content);

  38. /*执行js代码(滚动页面)*/

  39. await page.evaluate(function () {

  40. /* 这里做的是渐进滚动,如果一次性滚动则不会触发获取新数据的监听 */

  41. for (var y = 0; y <= 1000*i; y += 100) {

  42. window.scrollTo(0,y)

  43. }

  44. })

  45. // 获取数据列表

  46. const li = $($('.feedBox').find('ul')[0]).find('li')

  47. return li

  48. }

  49. let i = 0

  50. let li = await scrollPage(++i)

  51. //如果数据列表 不够30 则一直获取

  52. while (li.length < 30) {

  53. li = await scrollPage(++i)

  54. }

  55. let data = {

  56. list: []

  57. }

  58. /* 封装返回的数据*/

  59. li.map(function (index,item) {

  60. $(item).find('img').attr('src') != undefined ?

  61. data.list.push({

  62. src: $(item).find('img').attr('src'),

  63. title: $($(item).find('.title')).text(),

  64. source:$($(item).find('.source')).text(),

  65. href:$($(item).find('.title')).attr('href')

  66. }):''

  67. })

  68. //顺手存入本地文件

  69. fs.writeFileSync('tt.JSON',JSON.stringify(data))

  70. fs.writeFileSync('tt.html',content)

  71. /* 关闭 puppeteer*/

  72. await browser.close()

  73. return data

  74. }

  75. module.exports = getListData复制代码

相关资源:使用puppeteer操作web页面