Skip to content
/ eva Public

信息聚合工具:使用Puppeteer+Tensorflow+Egg+React每日从各大信息渠道,收集用户定制的目标内容,帮助用户高效学习、节省生命

Notifications You must be signed in to change notification settings

zhentaoo/eva

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

41 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

为什么要做信息聚合工具?意义是什么?

  • 在日常工作生活中,�多数人遇到新知识、新事物,第一反应便是去百度、知乎、�bing、各个社区论坛,搜集信息,然后消化学习~~~
  • 那么作为Coder的我们,为什么要手动去多个平台搜集信息,能不能有什么工具�帮我们去各个平台搜集信息,最好还是消化过的,然后把有用的信息给我们呢?
  • OK,今天先讨论如何从各个平台搜集信息
  • ��嗯,如标题所示,这里采用的的技术方案是Puppeteer。至于为什么要用Puppeteer?原因有二:1. 使用Puppeteer模拟用户操作,而不是简单的接口调用去获取数据,极大降低被判定为爬虫的风险。2. Puppeteer可以抓取客户端渲染的站点内容,这是传统爬虫�难以做到的!

其次对Puppeteer进行简介

  • Puppeteer本质是一个node�库,他提供了一组通过DevTools Protocol来操纵Headless Chrome的高级API
  • �其他详细介绍:请猛戳Puppeteer官方文档

Puppeteer 核心功能

  • 生成网页PDF、截图
  • 从网站抓取内容
  • 爬取SPA应用,并生成预渲染内容
  • UI自动化操作:表单提交、UI测试、键盘输入等
  • 创建一个最新的自动化测试环境(chrome),可以直接在此运行测试用例
  • 捕获站点时间线,帮助分析网站性能问题

接下来�开始实战,Repo在 Github Eva

  1. 运行Puppeteer
  puppeteer.launch().then(async browser => {
    ......
    // do what you want
    ......
  })
  1. 开一个新的tab页,跳转至事先定义好的站点
  let page = await browser.newPage();
  await page.goto('https://www.tianyancha.com/search?key=${key}');
  1. 分析站点dom结构,抓取你想要的内容
  let data = await page.evaluate(() => {
      let list = [...document.querySelectorAll('.search_result_single')]

      return list.map(el => {
        return { html: el.innerHTML, content: el.innerText }
      })
    })
  1. 将内容写入文件(如果大家感兴趣可以做成数据库存取,这不是重点)
  fs.appendFileSync(`./src/data/tianyancha-${key}.txt`, `startTime: ${new Date().toUTCString()}`+'\r');

  fs.appendFileSync(`./src/data/tianyancha-${key}.txt`, JSON.stringify(content, null , ' ')+'\r');
  1. 5.翻页操作,获取下一页的�内容
  for (let index = 0; index < needPageMaxNum; index++) {
    var nextPage = await page.$('#web-content > div > div > div > div.col-9.search-2017-2.pr15.pl0 > div.b-c-white.clearfix.position-rel.mb30 > div > div.search_pager.human_pager.in-block > ul > li.pagination-next.ng-scope > a')

    await nextPage.click()
    await timeout(6 * 1000 * Math.random());
    await getDataFromDom()
  }
  1. 数据获取完毕,关闭页面
  await page.close()
  1. 小细节,为了更加真实,在模拟用户操作的的过程中,使用随机时间作为间隔
    await timeout(6 * 1000 * Math.random());
  1. 最后说明,这里只做了最基础的数据爬取,后续可能会做出duckduckgo么?敬请期待

  2. 完整代码在: https://github.com/zhentaoo/eva (Demo型项目,无敏感信息)

  3. 项目运行

  • git clone https://github.com/zhentaoo/eva
  • npm install (puppeteer在win下100+M、mac下70+M,请耐心等候,如果安装不了,请使用cnpm)
  • npm start

About

信息聚合工具:使用Puppeteer+Tensorflow+Egg+React每日从各大信息渠道,收集用户定制的目标内容,帮助用户高效学习、节省生命

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published