网页新闻抓取(前段时间爬过某家公司的信息怎么样?本地测试)

优采云 发布时间: 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]。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线