网页新闻抓取(前段时间爬过某家公司的信息怎么样?本地测试)
优采云 发布时间: 2022-04-18 05:21网页新闻抓取(前段时间爬过某家公司的信息怎么样?本地测试)
因为前段时间爬过某家公司的资料,也因为有网友比较感兴趣,特写一封小信表示诚意:
npm i node-fetch
npm i cheerio
然后我们在根目录下创建一个文件 server.js:
const fetch = require('node-fetch')
const cheerio = require('cheerio')
const getPagesArray = (numberOfPosts) =>
Array(Math.ceil(numberOfPosts / 30)) //divides by 30 (posts per page)
.fill() //creates a new array
.map((_, index) => index + 1) //[1, 2, 3, 4,..] PagesArray
const getPageHTML = (pageNumber) =>
fetch(`https://news.ycombinator.com/news?p=${pageNumber}`)
.then(resp => resp.text()) //Promise
const getAllHTML = async (numberOfPosts) => {
return Promise.all(getPagesArray(numberOfPosts).map(getPageHTML))
.then(htmls => console.log(htmls.join(''))) //one JOINED html
}
getAllHTML(5) // get all HTML for 5 posts
代码写好后,我们可以在本地测试node server.js,会发现我们有五个html文件:
接下来我们需要做的是获取我们想要的有价值的数据,例如作者、时间、文章 连接等:
const getPosts = (html, posts) => {
let results = []
let $ = cheerio.load(html)
$('span.comhead').each(function() {
let a = $(this).prev()
let title = a.text()
let uri = a.attr('href')
let rank = a.parent().parent().text()
let subtext = a.parent().parent().next().children('.subtext').children()
let author = $(subtext).eq(1).text()
let points = $(subtext).eq(0).text()
let comments = $(subtext).eq(5).text()
let obj = {
title: title,
uri: uri,
author: author,
points: points,
comments: comments,
rank: parseInt(rank)
}
if (obj.rank 0) {
console.log(results)
return results
}
}
我们现在修改 getAllHTML 函数以调用 getPosts 方法:
const getAllHTML = async (numberOfPosts) => {
return Promise.all(getPagesArray(numberOfPosts).map(getPageHTML))
.then(htmls => getPosts(htmls.join(''), numberOfPosts))
}
getAllHTML(5)
节点服务器,我们可以通过本地测试获取相关信息,但显然我们希望这是一个爬虫工具,而不是本地测试脚本。让我们开始包装这个脚本。
首先安装指挥官,npm i 指挥官。然后添加以下代码:
#!/usr/bin/env node
const program = require('commander')
program
.option('-p, --posts [value]', 'Number of posts', 30)
.action(args =>
getAllHTML(args.posts)
.then(html => getPosts(html, args.posts))
)
program.parse(process.argv)
修改getAllHTML:
const getAllHTML = async (numberOfPosts) => {
return Promise.all(getPagesArray(numberOfPosts).map(getPageHTML))
.then(htmls => htmls.join(''))
}
本地测试请求数:node server -p 10
最后我们将命令行添加到工具中:
"dependencies": {
"cheerio": "^1.0.0-rc.2",
"commander": "^2.18.0",
"node-fetch": "^2.2.0"
},
"bin": {
"hackernews": "./server.js"
}
}
通过npm publish上传并安装到本机后,我们可以直接在本地运行hackernew -p [number]。