最近在研究爬虫,因此用本身熟悉的node简单写了一个。html
开始用的是phantomjs来获取HTML,可是看了文档以后发现好久没有维护了,因此就放弃了。node
后来寻寻觅觅发现了 Puppeteer,看了下是Google开发的,因此果断上手试了试,感受比phantom不知道高到哪里去了。git
B话少说,直接贴项目地址。github
github.com/Huoshendame…
chrome
node、puppeteer、cheerio(虽然puppeteer集成了Jq,可是既然已经装了就用一下吧)npm
在运行npm install 在安装 puppeteer的时候会报错,由于node下载chrome(puppeteer依赖chrome浏览器)会报错。因此先忽略掉chrome浏览器
npm install puppeteer --ignore-scripts
复制代码
安装成功以后,在去运行bash
npm install复制代码
装好以后,手动吧项目里的 chrome-win 文件夹 放到D盘根目录。less
PS:或者你本身放到本身的指定目录,可是在项目里的reptile.js里面 puppeteer.launch的时候须要指定绝对定位的地址dom
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复制代码