• Stars
    star
    164
  • Rank 230,032 (Top 5 %)
  • Language
    JavaScript
  • Created about 7 years ago
  • Updated about 6 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

王者荣耀故事站--小程序

heroStory

王者荣耀故事站--小程序

前言

一直想学习开发一款小程序,无奈拖延至今,恰逢王者荣耀周年庆,然后本人对王者英雄的人物、配音比较感兴趣,就有开发一款王者荣耀故事站的小程序的念头。想要了解故事背景就直接打开小程序就好了。

ps: 因为是业余时间做的,所以 pc 端的爬虫数据展示方面就有点粗糙。

技术栈

小程序 + nuxt + koa2 + vue2.0 + vuex + nginx + pm2

小程序效果图

WechatIMG2252.jpeg

pc 爬虫效果图

44 44 44 44

线上地址

https://storyweb.naice.me/

首先说下爬虫数据

小程序后台爬虫: https://github.com/naihe138/hero-story-crawer

数据爬虫都是从王者荣耀故事站官网来爬取的,然后直接用 next/koa 作为后台,用cheerio模块和request-promise模块基本就可以爬到我们想要的数据了,有时候爬取出来的数据回事乱码(非 utf-8的)我们就借助iconv模块去转成我们想要的中文字符。这些模块说明文档在相应的 gihub中都说的很详细。就不一一介绍。 下面举例一下爬虫英雄列表首页的过程,都注释在代码里面

// 引入相应的模块
import rp from 'request-promise'
import cheerio from 'cheerio'
import { writeFileSync } from 'fs'

const Iconv = require('iconv').Iconv
const iconv = new Iconv('GBK', 'UTF-8')

// request 国外网站的时候使用本地的 VPN
// import Agent from 'socks5-http-client/lib/Agent'

// 爬取英雄列表
const getHeroStory = async() => {
  // request-promise的配置
  const options = {
    uri: 'https://pvp.qq.com/act/a20160510story/herostory.htm',
    // agentClass: Agent,
    // agentOptions: {
    //   socksHost: 'localhost',
    //   socksPort: 1080 // 本地 VPN 的端口,这里用的 shadowsocks
    // },
    transform: body => cheerio.load(body) // 转成相应的爬虫
  }
  // 爬取导航复制给cheerio的$对象
  const $ = await rp(options)
  let navArr = []
  let heroList = []
  $('#campNav li').each(function () {
    // 分析节点拿到数据
    const type = $(this).attr('data-camptype')
    const text = $(this).find('a').text()
    // push 到navArr数组中
    navArr.push({ type, text })
  })
  // 爬取英雄列表
  const hreodata = await rp({
    uri: 'https://pvp.qq.com/webplat/info/news_version3/15592/18024/23901/24397/24398/m17330/list_1.shtml'
  })
  // 数据处理
  let str = hreodata.replace('createHeroList(', '')
  str = str.substr(0, str.length - 1)
  let r = JSON.parse(str)
  heroList = r.data.filter(item => item)

  let result = {
    nav: navArr,
    heroList
  }
  // 写入文件
  writeFileSync('./server/crawerdb/heroList.json', JSON.stringify(result, null, 2), 'utf-8')

  return result
}

// 跟去英雄 id,和 url 爬取英雄的详细介绍
const getHeroDatail = async(url, _id) => {
  // 配置
  const option = {
    encoding: null,
    url
  }
  // 爬取英雄详情
  const $ = await rp(option).then(body => {
    // 字符乱码处理
    var result = iconv.convert(new Buffer(body, 'binary')).toString()
    return cheerio.load(result)
  })
  // 这里拿到$之后就像 jq那样子,根据文档就可以进行爬虫的数据处理了
  // 下面都是数据处理
  let heroName = ''
  let heroDetail = []
  let ht = ''
  let hc = ''
  if ($('#heroStory').length) {
    heroName = $('.hero_name pf').text()
    $('#heroStory p').each(function () {
      let text = $(this).text().trim()
      heroDetail.push({
        type: 'text',
        text: text
      })
    })
  } else if ($('.textboxs').length) {
    $('.textboxs p').each(function () {
      if ($(this).find('img').length) {
        let src = $(this).find('img').attr('src')
        heroDetail.push({
          type: 'img',
          text: 'https:' + src
        })
      } else {
        let text = $(this).text().trim()
        heroDetail.push({
          type: 'text',
          text: text
        })
      }
    })
  }
  let hStr = ($('#history_content').text()).replace(/(^\s+)|(\s+$)/g, '');

  if (hStr.length > 0) {
    ht = $('.history_story h3').text()
    hc = $('#history_content').text()
  }
  let result = {
    heroName,
    heroDetail,
    historyTitle: ht,
    historyContent: hc
  }
  // 写入文件
  writeFileSync('./server/crawerdb/herodetail' + _id + '.json', JSON.stringify(result, null, 2), 'utf-8')
  return result
}

export default {
  getHeroStory,
  getHeroDatail
}

然后在 koa里面配置好路由就可以一步步爬取数据了

nuxt

Nuxt.js 是一个基于 Vue.js 的通用应用框架。通过对客户端/服务端基础架构的抽象组织,Nuxt.js 主要关注的是应用的 UI渲染。我们的目标是创建一个灵活的应用框架,你可以基于它初始化新项目的基础结构代码,或者在已有 Node.js 项目中使用 Nuxt.js。Nuxt.js 预设了利用Vue.js开发服务端渲染的应用所需要的各种配置。

根据文档 page 下面的结构就是对应的 vue 的路由结构,然后配置好nuxt.config.js你所需要模块、插件、webpack 配置等等都有很好的中文文档说明。会 vue的同学,去看一下官网就可以大概有个很好的了解了。 下面是整个项目的目录结构

.nuxt/
build/  ---打包发布
components/ ---组件
layout/   ---布局
pages/    ---对应的路由
--| about.vue/
--| music.vue/
--| word.vue/
--| skin/
--| index.vue
--| ....
server/  --对应的koa 后台
static/  ---静态资源
store/  --vuex

小程序

这是我第一个小程序。所以一开始看文档,写起数据绑定的时候,会有种跟 vue 的异曲同工的感觉. 下面是官荒的小例子

demo.wxml

<view> Hello {{name}}! </view>
<view wx:for="{{array}}">
  {{index}}: {{item.message}}
</view>

demo.js

Page({
  data: {
    name: '小程序',
    array: [{
      message: 'foo',
    }, {
      message: 'bar'
    }]
  }
})

是不是太熟悉了????当然里面实现的技术还是想差别很大的,想去详细的了解,我觉得《一起脱去小程序的外套 - 微信小程序架构解析》这篇文章,很是不错,我初学的时候,是先体验一番小程序的demo,然后直接动手(光看不动瞎扯淡),再去深入了解原理、pages 的生命周期,逻辑处理、框架、组件、api 等等,理解了这些之后,后面就很容易啦!!

附一张小程序的运行生命周期图(来源于遇见大神的文章) 44

github

小程序:https://github.com/naihe138/heroStory 小程序后台爬虫: https://github.com/naihe138/hero-story-crawer

如果大家觉得有用的话,求一个闪晶晶的 start 谢谢各位大佬

More Repositories

1

vue-picker

A picker componemt for vue
Vue
306
star
2

GraphQL-demo

🎉Koa + GraphQL + Apollo-Server demo
JavaScript
243
star
3

naice-blog

😺 新的博客上线啦
Vue
101
star
4

vue-table

a table component for vue2.0
Vue
72
star
5

nvue

master分支:webpack4实现一个vue的打包的项目,incremental: 实现增量模块打包
JavaScript
58
star
6

naice-blog-koa

博客后台node-koa
JavaScript
40
star
7

naice-blog-admin

👏👏👏博客后台管理系统(react-hooks+typeScript)
TypeScript
40
star
8

react-plan

react、 react-router、redux 最佳实践
JavaScript
35
star
9

vue-imageview

A preview image component for Vue3
Vue
33
star
10

hero-story-crawer

王者荣耀故事站 node爬虫
JavaScript
30
star
11

koa-upload

koa upload image
JavaScript
17
star
12

write-vue

自己理解vue源码与核心方法编写,每一个commit对应每个功能点实现
JavaScript
15
star
13

proxy-mvvm

用proxy简单实现一个mvvm
HTML
15
star
14

micro-zone

这是用koa2 react mongoose 等等构建的一个微说说项目
JavaScript
12
star
15

wangdai

网贷网站的一个html小项目
HTML
5
star
16

beauty-vote

这是用vue2.0,vue-router2.0,vuex2.0构建的一个投票小项目~~~~
JavaScript
5
star
17

vue-reactive

实现一下vue3的响应式原理
JavaScript
5
star
18

algorithm-problem

A daily algorithm problem(每天刷一道算法题)
5
star
19

vue2.0-webpack-mui

基于vue2.0手脚架搭建的自定义的,打包框架,多页,单组建,公共文件打包,代码分割。。。。
JavaScript
5
star
20

aboutMe

自我简介-aboutMe
HTML
4
star
21

webpack-notes

一个从基础配置到webpack的实现、loader的编写、plugin的编写的笔记
JavaScript
2
star
22

webgl-courseware

webgl课件
2
star
23

beauty-vote-api

这是用koa2,mongodb,mongoose,构建的投票小项目的后台,利于新手学习
JavaScript
2
star
24

vue-koa-ssr

vue-koa-ssr build a project
JavaScript
2
star
25

node-book-system

这是用node + mongodb + mongoos 构建的一个小型的图书管理系统,麻雀虽小,但是涉及到的却是很全面
JavaScript
2
star
26

canvasRed

canvas微信朋友圈红包小demo
HTML
1
star
27

NeteaseCloudMusic

😝👏Building a desktop music app with electron+vue3.0
JavaScript
1
star
28

write-vuex

vuex实现及简略解析
JavaScript
1
star
29

vue-microfrontends

基于qiankun的微前端,企业级解决方案,包括一键启动、配置公共cdn、公共组件、公共工具方法、事件通讯的包装。
JavaScript
1
star
30

small-talk

一款基于socket.io高颜值的聊天app(A chat app based on socket.io)
JavaScript
1
star
31

nvue-cli

nvue项目的手脚架
JavaScript
1
star
32

vue2.0-mintui

基于 vue2.0全家桶与vue2.0-MintUI框架搭建
Vue
1
star
33

learn-go

学习go的日志
1
star
34

naihe138.github.io

我的博客地址:
HTML
1
star
35

iFirstAg

我的第一个less+angular的小项目,-------
CSS
1
star