├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── analysis ├── bili-video-data-hsql-database.ipynb ├── bili-video-data-hsql-database.py ├── export │ ├── batch │ │ └── .githold │ └── bubble │ │ ├── animated_bubble.gif │ │ ├── duration_step01.png │ │ ├── duration_step02.png │ │ ├── duration_step03.png │ │ ├── duration_step04.png │ │ ├── duration_step05.png │ │ ├── duration_step06.png │ │ ├── duration_step07.png │ │ ├── duration_step08.png │ │ ├── duration_step09.png │ │ ├── duration_step10.png │ │ ├── duration_step11.png │ │ ├── duration_step12.png │ │ ├── duration_step13.png │ │ ├── duration_step14.png │ │ ├── duration_step15.png │ │ ├── duration_step16.png │ │ ├── duration_step17.png │ │ ├── duration_step18.png │ │ ├── duration_step19.png │ │ └── duration_step20.png ├── history-sect-slicing.ipynb └── vis.ipynb ├── app ├── LICENSE.md ├── README.md ├── about.html ├── assets │ ├── css │ │ ├── bulma.css │ │ ├── bulma.css.map │ │ └── style.css │ ├── mongo.js │ └── vue │ │ ├── README.md │ │ ├── vue.common.js │ │ ├── vue.esm.browser.js │ │ ├── vue.esm.js │ │ ├── vue.js │ │ ├── vue.min.js │ │ ├── vue.runtime.common.js │ │ ├── vue.runtime.esm.js │ │ ├── vue.runtime.js │ │ └── vue.runtime.min.js ├── bilicrawler-0.1.1.js ├── bilicrawler.js ├── index.html ├── main.js ├── package.json └── renderer.js ├── biliSpider-logo.jpg ├── connect_to_remote_mongodb_demo.ipynb ├── iodata ├── iodata.sln ├── iodata │ ├── dllmain.c │ ├── iodata.cpp │ ├── iodata.vcxproj │ ├── iodata.vcxproj.filters │ ├── iodata.vcxproj.user │ ├── stdafx.cpp │ ├── stdafx.h │ ├── targetver.h │ └── x64 │ │ └── Release │ │ ├── dllmain.obj │ │ ├── iodata.log │ │ ├── iodata.tlog │ │ ├── CL.command.1.tlog │ │ ├── CL.read.1.tlog │ │ ├── CL.write.1.tlog │ │ ├── iodata.lastbuildstate │ │ ├── iodata.write.1u.tlog │ │ ├── link.command.1.tlog │ │ ├── link.read.1.tlog │ │ └── link.write.1.tlog │ │ └── vc141.pdb ├── readme.md ├── x64 │ └── Release │ │ ├── iodata.dll │ │ ├── iodata.exp │ │ ├── iodata.iobj │ │ ├── iodata.ipdb │ │ ├── iodata.lib │ │ └── iodata.pdb └── 例子.nb ├── node-spider-dist ├── .editorconfig ├── .eslintrc.yml ├── client.js ├── client │ ├── constants.js │ ├── nest.js │ ├── process.js │ ├── proxy │ │ ├── 89ip.js │ │ ├── cn-proxy.js │ │ ├── kuaidaili.js │ │ ├── mayidaili.js │ │ ├── mogudaili.js │ │ ├── xdaili.js │ │ ├── xicidaili.js │ │ └── yundaili.js │ ├── spider.js │ └── utils.js ├── data-transfer.js ├── index.js ├── package.json ├── server.js └── test │ ├── index.js │ └── user-info.json ├── spider.py ├── 专栏跟踪爬虫-氘化氢.nb ├── 极速视频爬虫2.2.nb ├── 视频跟踪爬虫-LePtC.nb └── 视频跟踪爬虫的可视化.nb /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | 49 | # Translations 50 | *.mo 51 | *.pot 52 | 53 | # Django stuff: 54 | *.log 55 | local_settings.py 56 | 57 | # Flask stuff: 58 | instance/ 59 | .webassets-cache 60 | 61 | # Scrapy stuff: 62 | .scrapy 63 | 64 | # Sphinx documentation 65 | docs/_build/ 66 | 67 | # PyBuilder 68 | target/ 69 | 70 | # Jupyter Notebook 71 | .ipynb_checkpoints 72 | 73 | # pyenv 74 | .python-version 75 | 76 | # celery beat schedule file 77 | celerybeat-schedule 78 | 79 | # SageMath parsed files 80 | *.sage.py 81 | 82 | # dotenv 83 | .env 84 | 85 | # virtualenv 86 | .venv 87 | venv/ 88 | ENV/ 89 | 90 | # Spyder project settings 91 | .spyderproject 92 | .spyproject 93 | 94 | # Rope project settings 95 | .ropeproject 96 | 97 | # mkdocs documentation 98 | /site 99 | 100 | # mypy 101 | .mypy_cache/ 102 | 103 | # node and electron 104 | 105 | node_modules 106 | app/dist/ 107 | package-lock.json 108 | yarn.lock -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | 3 | node_js: 4 | - "lts/*" 5 | 6 | install: 7 | - "cd node-spider-dist" 8 | - "npm install" 9 | 10 | script: 11 | - "npm run lint" 12 | - "npm run test" -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # BiliSpider 2 | 3 | 【本项目孵化自 [idea #4](https://github.com/orgs/uupers/teams/daily-idea/discussions/4)】 4 | 5 | # 简介 6 | 7 | 这里是UUPs爬虫主项目组,任何新技术均会首先应用在B站爬虫上。我们的目标是为每位up主的创作之路助力,主要体现在: 8 | 9 | 1. 数据获取与管理:利用爬虫技术获取全B站的视频与用户数据,并用维护数据库的方法管理它们,为创作者提供检索服务 10 | 2. 数据筛选与可视化:在海量数据中筛选出有效且感兴趣的信息,并研究将它们可视化的方法,为创作者提供创作素材 11 | 3. 数据分析与科研:根据获取到的有效数据,对B站推广机制,用户习惯等进行研究,为创作者提供推广经验 12 | 13 | # 数据来源 14 | 目前已经迁移到本项目[Wiki](https://github.com/uupers/BiliSpider/wiki)页面 15 | -------------------------------------------------------------------------------- /analysis/bili-video-data-hsql-database.py: -------------------------------------------------------------------------------- 1 | class Cleaner: 2 | """ Data Cleaner """ 3 | 4 | def __init__(self): 5 | self.raw = [] 6 | self.data = [] 7 | 8 | 9 | def hay(self,path): 10 | 11 | with open(path) as f: 12 | for line in f: 13 | self.raw.append(line) 14 | 15 | def dval(self, bgp=None,edp=None, seg=None): 16 | if bgp == None: 17 | bgp = 7 18 | if edp == None: 19 | edp = -1 20 | if seg == None: 21 | seg = 2 22 | 23 | arr = self.raw[bgp:edp:seg] 24 | data1 = [] 25 | 26 | for elem in arr: 27 | data1.append( elem[38:-2] ) 28 | 29 | for elem in data: 30 | self.data.append( elem.split(",") ) 31 | 32 | for i in range(len(self.data)): 33 | for j in range( len(self.data[i]) ): 34 | self.data[i][j] = int( (self.data)[i][j] ) 35 | 36 | -------------------------------------------------------------------------------- /analysis/export/batch/.githold: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uupers/BiliSpider/95c07da2f7abf4f318dc41dff8e6dd891045b799/analysis/export/batch/.githold -------------------------------------------------------------------------------- /analysis/export/bubble/animated_bubble.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uupers/BiliSpider/95c07da2f7abf4f318dc41dff8e6dd891045b799/analysis/export/bubble/animated_bubble.gif -------------------------------------------------------------------------------- /analysis/export/bubble/duration_step01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uupers/BiliSpider/95c07da2f7abf4f318dc41dff8e6dd891045b799/analysis/export/bubble/duration_step01.png -------------------------------------------------------------------------------- /analysis/export/bubble/duration_step02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uupers/BiliSpider/95c07da2f7abf4f318dc41dff8e6dd891045b799/analysis/export/bubble/duration_step02.png -------------------------------------------------------------------------------- /analysis/export/bubble/duration_step03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uupers/BiliSpider/95c07da2f7abf4f318dc41dff8e6dd891045b799/analysis/export/bubble/duration_step03.png -------------------------------------------------------------------------------- /analysis/export/bubble/duration_step04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uupers/BiliSpider/95c07da2f7abf4f318dc41dff8e6dd891045b799/analysis/export/bubble/duration_step04.png -------------------------------------------------------------------------------- /analysis/export/bubble/duration_step05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uupers/BiliSpider/95c07da2f7abf4f318dc41dff8e6dd891045b799/analysis/export/bubble/duration_step05.png -------------------------------------------------------------------------------- /analysis/export/bubble/duration_step06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uupers/BiliSpider/95c07da2f7abf4f318dc41dff8e6dd891045b799/analysis/export/bubble/duration_step06.png -------------------------------------------------------------------------------- /analysis/export/bubble/duration_step07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uupers/BiliSpider/95c07da2f7abf4f318dc41dff8e6dd891045b799/analysis/export/bubble/duration_step07.png -------------------------------------------------------------------------------- /analysis/export/bubble/duration_step08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uupers/BiliSpider/95c07da2f7abf4f318dc41dff8e6dd891045b799/analysis/export/bubble/duration_step08.png -------------------------------------------------------------------------------- /analysis/export/bubble/duration_step09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uupers/BiliSpider/95c07da2f7abf4f318dc41dff8e6dd891045b799/analysis/export/bubble/duration_step09.png -------------------------------------------------------------------------------- /analysis/export/bubble/duration_step10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uupers/BiliSpider/95c07da2f7abf4f318dc41dff8e6dd891045b799/analysis/export/bubble/duration_step10.png -------------------------------------------------------------------------------- /analysis/export/bubble/duration_step11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uupers/BiliSpider/95c07da2f7abf4f318dc41dff8e6dd891045b799/analysis/export/bubble/duration_step11.png -------------------------------------------------------------------------------- /analysis/export/bubble/duration_step12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uupers/BiliSpider/95c07da2f7abf4f318dc41dff8e6dd891045b799/analysis/export/bubble/duration_step12.png -------------------------------------------------------------------------------- /analysis/export/bubble/duration_step13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uupers/BiliSpider/95c07da2f7abf4f318dc41dff8e6dd891045b799/analysis/export/bubble/duration_step13.png -------------------------------------------------------------------------------- /analysis/export/bubble/duration_step14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uupers/BiliSpider/95c07da2f7abf4f318dc41dff8e6dd891045b799/analysis/export/bubble/duration_step14.png -------------------------------------------------------------------------------- /analysis/export/bubble/duration_step15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uupers/BiliSpider/95c07da2f7abf4f318dc41dff8e6dd891045b799/analysis/export/bubble/duration_step15.png -------------------------------------------------------------------------------- /analysis/export/bubble/duration_step16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uupers/BiliSpider/95c07da2f7abf4f318dc41dff8e6dd891045b799/analysis/export/bubble/duration_step16.png -------------------------------------------------------------------------------- /analysis/export/bubble/duration_step17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uupers/BiliSpider/95c07da2f7abf4f318dc41dff8e6dd891045b799/analysis/export/bubble/duration_step17.png -------------------------------------------------------------------------------- /analysis/export/bubble/duration_step18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uupers/BiliSpider/95c07da2f7abf4f318dc41dff8e6dd891045b799/analysis/export/bubble/duration_step18.png -------------------------------------------------------------------------------- /analysis/export/bubble/duration_step19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uupers/BiliSpider/95c07da2f7abf4f318dc41dff8e6dd891045b799/analysis/export/bubble/duration_step19.png -------------------------------------------------------------------------------- /analysis/export/bubble/duration_step20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uupers/BiliSpider/95c07da2f7abf4f318dc41dff8e6dd891045b799/analysis/export/bubble/duration_step20.png -------------------------------------------------------------------------------- /analysis/history-sect-slicing.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## History data" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 197, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "import numpy as np\n", 17 | "import pandas as pd\n", 18 | "import matplotlib.pyplot as plt\n", 19 | "from pandas.plotting import scatter_matrix\n", 20 | "\n", 21 | "import seaborn as sns\n", 22 | "sns.set_style(\"white\")\n", 23 | "fig_w = 2530\n", 24 | "fig_h = 1900\n", 25 | "my_dpi=200\n", 26 | "\n", 27 | "import dateutil" 28 | ] 29 | }, 30 | { 31 | "cell_type": "markdown", 32 | "metadata": {}, 33 | "source": [ 34 | "Config plot styles" 35 | ] 36 | }, 37 | { 38 | "cell_type": "code", 39 | "execution_count": 198, 40 | "metadata": {}, 41 | "outputs": [], 42 | "source": [ 43 | "plt.style.use('ggplot')\n", 44 | "\n", 45 | "from matplotlib import rcParams\n", 46 | "# plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签\n", 47 | "plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号\n", 48 | "\n", 49 | "plt.rc('font', family='BabelStone Han', size=13) # 选择你自己电脑上的字体" 50 | ] 51 | }, 52 | { 53 | "cell_type": "markdown", 54 | "metadata": {}, 55 | "source": [ 56 | "Load data" 57 | ] 58 | }, 59 | { 60 | "cell_type": "code", 61 | "execution_count": 199, 62 | "metadata": {}, 63 | "outputs": [], 64 | "source": [ 65 | "# 如果还没有数据,来群里索要数据文件就行\n", 66 | "\n", 67 | "df = pd.read_csv('data/full-data.csv') " 68 | ] 69 | }, 70 | { 71 | "cell_type": "markdown", 72 | "metadata": {}, 73 | "source": [ 74 | "Validate all the possible columns of data frame" 75 | ] 76 | }, 77 | { 78 | "cell_type": "code", 79 | "execution_count": 200, 80 | "metadata": {}, 81 | "outputs": [ 82 | { 83 | "data": { 84 | "text/plain": [ 85 | "['Unnamed: 0',\n", 86 | " 'aid',\n", 87 | " 'uid',\n", 88 | " 'time',\n", 89 | " 'duration',\n", 90 | " 'state',\n", 91 | " 'view',\n", 92 | " 'danmaku',\n", 93 | " 'coin',\n", 94 | " 'favorite',\n", 95 | " 'share',\n", 96 | " 'reply',\n", 97 | " 'like',\n", 98 | " 'sectid',\n", 99 | " 'sectname']" 100 | ] 101 | }, 102 | "execution_count": 200, 103 | "metadata": {}, 104 | "output_type": "execute_result" 105 | } 106 | ], 107 | "source": [ 108 | "list(df.columns.values)" 109 | ] 110 | }, 111 | { 112 | "cell_type": "code", 113 | "execution_count": 201, 114 | "metadata": {}, 115 | "outputs": [], 116 | "source": [ 117 | "df['time'] = pd.to_datetime(df['time'],unit='s')#.dt.date" 118 | ] 119 | }, 120 | { 121 | "cell_type": "code", 122 | "execution_count": 195, 123 | "metadata": {}, 124 | "outputs": [], 125 | "source": [ 126 | "# df;" 127 | ] 128 | }, 129 | { 130 | "cell_type": "markdown", 131 | "metadata": {}, 132 | "source": [ 133 | "## Group by sects" 134 | ] 135 | }, 136 | { 137 | "cell_type": "markdown", 138 | "metadata": {}, 139 | "source": [ 140 | "Get all the sects by sectname" 141 | ] 142 | }, 143 | { 144 | "cell_type": "code", 145 | "execution_count": 202, 146 | "metadata": {}, 147 | "outputs": [ 148 | { 149 | "data": { 150 | "text/plain": [ 151 | "'连载剧集'" 152 | ] 153 | }, 154 | "execution_count": 202, 155 | "metadata": {}, 156 | "output_type": "execute_result" 157 | } 158 | ], 159 | "source": [ 160 | "sects = df.sectname.unique()\n", 161 | "sects[0]" 162 | ] 163 | }, 164 | { 165 | "cell_type": "markdown", 166 | "metadata": {}, 167 | "source": [ 168 | "Create a dataframe to store the average data" 169 | ] 170 | }, 171 | { 172 | "cell_type": "code", 173 | "execution_count": 213, 174 | "metadata": {}, 175 | "outputs": [ 176 | { 177 | "name": "stdout", 178 | "output_type": "stream", 179 | "text": [ 180 | "Dealing with: 连载剧集\n", 181 | "Start date:2017-08-30 13:14:52\n", 182 | "End date:2017-10-24 09:16:47\n", 183 | "连载剧集 has 5rows\n", 184 | "Data saved\n", 185 | "Dealing with: flash游戏\n", 186 | "Start date:2010-10-04 23:00:49\n", 187 | "End date:2012-03-30 07:24:04\n", 188 | "flash游戏 has 54rows\n", 189 | "Data saved\n", 190 | "Dealing with: 单机联机\n", 191 | "Start date:2009-07-03 11:10:16\n", 192 | "End date:2018-02-28 07:36:52\n", 193 | "单机联机 has 316rows\n", 194 | "Data saved\n", 195 | "Dealing with: Mugen\n", 196 | "Start date:2009-07-14 14:59:24\n", 197 | "End date:2018-02-28 07:10:03\n", 198 | "Mugen has 315rows\n", 199 | "Data saved\n", 200 | "Dealing with: 宅舞\n", 201 | "Start date:2009-07-15 12:34:50\n", 202 | "End date:2018-02-28 07:39:39\n", 203 | "宅舞 has 314rows\n", 204 | "Data saved\n", 205 | "Dealing with: 日常\n", 206 | "Start date:2009-06-26 07:15:45\n", 207 | "End date:2018-02-28 08:06:32\n", 208 | "日常 has 316rows\n", 209 | "Data saved\n", 210 | "Dealing with: 鬼畜调教\n", 211 | "Start date:2009-07-14 01:23:55\n", 212 | "End date:2018-02-28 07:09:05\n", 213 | "鬼畜调教 has 315rows\n", 214 | "Data saved\n", 215 | "Dealing with: MAD-AMV\n", 216 | "Start date:2009-07-15 07:12:48\n", 217 | "End date:2018-02-28 08:16:54\n", 218 | "MAD-AMV has 315rows\n", 219 | "Data saved\n", 220 | "Dealing with: MMD-3D\n", 221 | "Start date:2009-09-16 05:11:11\n", 222 | "End date:2018-02-28 08:24:46\n", 223 | "MMD-3D has 308rows\n", 224 | "Data saved\n", 225 | "Dealing with: 音MAD\n", 226 | "Start date:2009-07-09 07:55:49\n", 227 | "End date:2018-02-28 08:01:25\n", 228 | "音MAD has 315rows\n", 229 | "Data saved\n", 230 | "Dealing with: 综合\n", 231 | "Start date:2009-07-13 11:36:05\n", 232 | "End date:2018-02-28 08:37:09\n", 233 | "综合 has 315rows\n", 234 | "Data saved\n", 235 | "Dealing with: 原创音乐\n", 236 | "Start date:2010-03-18 16:03:38\n", 237 | "End date:2018-02-28 08:01:19\n", 238 | "原创音乐 has 290rows\n", 239 | "Data saved\n", 240 | "Dealing with: 三次元音乐\n", 241 | "Start date:2009-07-14 10:46:02\n", 242 | "End date:2018-02-28 08:49:01\n", 243 | "三次元音乐 has 315rows\n", 244 | "Data saved\n", 245 | "Dealing with: VOCALOID-UTAU\n", 246 | "Start date:2009-07-12 15:15:53\n", 247 | "End date:2018-02-28 08:20:34\n", 248 | "VOCALOID-UTAU has 315rows\n", 249 | "Data saved\n", 250 | "Dealing with: 翻唱\n", 251 | "Start date:2009-07-13 13:17:13\n", 252 | "End date:2018-02-28 09:01:31\n", 253 | "翻唱 has 315rows\n", 254 | "Data saved\n", 255 | "Dealing with: 完结动画\n", 256 | "Start date:2009-08-26 06:57:38\n", 257 | "End date:2018-02-28 03:25:16\n", 258 | "完结动画 has 310rows\n", 259 | "Data saved\n", 260 | "Dealing with: 连载动画\n", 261 | "Start date:2009-10-06 03:29:23\n", 262 | "End date:2018-02-28 02:12:46\n", 263 | "连载动画 has 306rows\n", 264 | "Data saved\n", 265 | "Dealing with: 人文历史\n", 266 | "Start date:2010-10-11 05:21:01\n", 267 | "End date:2018-02-28 07:18:50\n", 268 | "人文历史 has 269rows\n", 269 | "Data saved\n", 270 | "Dealing with: 演讲-公开课\n", 271 | "Start date:2010-06-17 00:21:36\n", 272 | "End date:2018-02-28 09:16:24\n", 273 | "演讲-公开课 has 281rows\n", 274 | "Data saved\n", 275 | "Dealing with: 未知\n", 276 | "Start date:2015-05-11 08:43:27\n", 277 | "End date:2015-05-11 08:43:27\n", 278 | "未知 has 0rows\n", 279 | "Dealing with: MMD.3D\n", 280 | "Start date:2011-09-01 02:19:42\n", 281 | "End date:2014-05-09 03:06:24\n", 282 | "MMD.3D has 98rows\n", 283 | "Data saved\n", 284 | "Dealing with: 短片-手书-配音\n", 285 | "Start date:2009-07-14 01:34:49\n", 286 | "End date:2018-02-28 09:21:30\n", 287 | "短片-手书-配音 has 315rows\n", 288 | "Data saved\n", 289 | "Dealing with: 资讯\n", 290 | "Start date:2010-08-30 13:33:38\n", 291 | "End date:2018-02-28 13:18:07\n", 292 | "资讯 has 273rows\n", 293 | "Data saved\n", 294 | "Dealing with: OP-ED-OST\n", 295 | "Start date:2009-09-20 09:22:24\n", 296 | "End date:2018-02-28 09:09:17\n", 297 | "OP-ED-OST has 308rows\n", 298 | "Data saved\n", 299 | "Dealing with: 演奏\n", 300 | "Start date:2009-07-21 03:20:03\n", 301 | "End date:2018-02-28 09:28:44\n", 302 | "演奏 has 314rows\n", 303 | "Data saved\n", 304 | "Dealing with: 网络游戏\n", 305 | "Start date:2010-04-28 12:27:00\n", 306 | "End date:2018-02-28 10:18:47\n", 307 | "网络游戏 has 286rows\n", 308 | "Data saved\n", 309 | "Dealing with: 单机游戏\n", 310 | "Start date:2012-06-25 14:18:48\n", 311 | "End date:2014-08-14 04:34:01\n", 312 | "单机游戏 has 77rows\n", 313 | "Data saved\n", 314 | "Dealing with: 综艺\n", 315 | "Start date:2010-10-01 05:01:59\n", 316 | "End date:2018-02-28 10:33:32\n", 317 | "综艺 has 270rows\n", 318 | "Data saved\n", 319 | "Dealing with: 动物圈\n", 320 | "Start date:2010-02-23 06:23:13\n", 321 | "End date:2018-02-28 10:44:47\n", 322 | "动物圈 has 292rows\n", 323 | "Data saved\n", 324 | "Dealing with: 美食圈\n", 325 | "Start date:2010-03-25 04:19:33\n", 326 | "End date:2018-02-28 10:55:24\n", 327 | "美食圈 has 289rows\n", 328 | "Data saved\n", 329 | "Dealing with: 喵星人\n", 330 | "Start date:2014-04-22 11:31:46\n", 331 | "End date:2014-04-22 11:31:46\n", 332 | "喵星人 has 0rows\n", 333 | "Dealing with: 美食视频\n", 334 | "Start date:2014-04-18 14:33:01\n", 335 | "End date:2014-08-21 05:14:23\n", 336 | "美食视频 has 12rows\n", 337 | "Data saved\n", 338 | "Dealing with: 电影相关\n", 339 | "Start date:2013-02-07 02:20:21\n", 340 | "End date:2017-10-31 15:01:36\n", 341 | "电影相关 has 172rows\n", 342 | "Data saved\n", 343 | "Dealing with: 其他国家\n", 344 | "Start date:2016-02-22 12:41:35\n", 345 | "End date:2017-12-20 10:59:06\n", 346 | "其他国家 has 66rows\n", 347 | "Data saved\n", 348 | "Dealing with: 短片\n", 349 | "Start date:2010-03-24 18:05:57\n", 350 | "End date:2018-02-28 11:01:11\n", 351 | "短片 has 289rows\n", 352 | "Data saved\n", 353 | "Dealing with: 特摄\n", 354 | "Start date:2010-06-21 20:00:07\n", 355 | "End date:2018-02-28 10:43:29\n", 356 | "特摄 has 280rows\n", 357 | "Data saved\n", 358 | "Dealing with: 剧场版\n", 359 | "Start date:2014-08-01 11:16:26\n", 360 | "End date:2015-03-17 14:01:30\n", 361 | "剧场版 has 22rows\n", 362 | "Data saved\n", 363 | "Dealing with: 数码\n", 364 | "Start date:2010-07-22 15:58:01\n", 365 | "End date:2018-02-28 11:16:49\n", 366 | "数码 has 277rows\n", 367 | "Data saved\n", 368 | "Dealing with: 星海\n", 369 | "Start date:2011-03-22 17:55:22\n", 370 | "End date:2018-02-28 11:21:27\n", 371 | "星海 has 253rows\n", 372 | "Data saved\n", 373 | "Dealing with: 机械\n", 374 | "Start date:2010-02-14 19:57:33\n", 375 | "End date:2018-02-28 11:25:32\n", 376 | "机械 has 293rows\n", 377 | "Data saved\n", 378 | "Dealing with: GMV\n", 379 | "Start date:2010-07-26 14:57:28\n", 380 | "End date:2018-02-28 11:26:16\n", 381 | "GMV has 277rows\n", 382 | "Data saved\n", 383 | "Dealing with: 野生技术协会\n", 384 | "Start date:2009-09-09 01:09:09\n", 385 | "End date:2018-02-28 11:38:47\n", 386 | "野生技术协会 has 309rows\n", 387 | "Data saved\n", 388 | "Dealing with: 趣味科普人文\n", 389 | "Start date:2009-10-14 04:38:56\n", 390 | "End date:2018-02-28 11:49:46\n", 391 | "趣味科普人文 has 305rows\n", 392 | "Data saved\n", 393 | "Dealing with: 其他\n", 394 | "Start date:2009-09-13 07:01:43\n", 395 | "End date:2018-02-28 14:17:25\n", 396 | "其他 has 309rows\n", 397 | "Data saved\n", 398 | "Dealing with: 人力VOCALOID\n", 399 | "Start date:2009-11-20 03:59:58\n", 400 | "End date:2018-02-28 11:53:18\n", 401 | "人力VOCALOID has 302rows\n", 402 | "Data saved\n", 403 | "Dealing with: 教程演示\n", 404 | "Start date:2010-03-02 03:33:45\n", 405 | "End date:2018-02-27 15:43:02\n", 406 | "教程演示 has 291rows\n", 407 | "Data saved\n", 408 | "Dealing with: 电视剧相关\n", 409 | "Start date:2012-10-14 10:14:57\n", 410 | "End date:2017-10-31 22:39:57\n", 411 | "电视剧相关 has 184rows\n", 412 | "Data saved\n", 413 | "Dealing with: 音乐选集\n", 414 | "Start date:2009-07-09 06:07:51\n", 415 | "End date:2018-02-28 12:15:05\n", 416 | "音乐选集 has 315rows\n", 417 | "Data saved\n", 418 | "Dealing with: Korea相关\n", 419 | "Start date:2011-08-11 04:16:29\n", 420 | "End date:2018-02-28 12:28:16\n", 421 | "Korea相关 has 239rows\n", 422 | "Data saved\n", 423 | "Dealing with: 音游\n", 424 | "Start date:2009-07-21 14:14:31\n", 425 | "End date:2018-02-28 12:21:43\n", 426 | "音游 has 314rows\n", 427 | "Data saved\n", 428 | "Dealing with: 明星\n", 429 | "Start date:2012-06-10 10:56:41\n", 430 | "End date:2018-02-28 12:45:54\n", 431 | "明星 has 208rows\n", 432 | "Data saved\n", 433 | "Dealing with: 搞笑\n", 434 | "Start date:2010-02-09 09:37:26\n", 435 | "End date:2018-02-28 12:50:05\n", 436 | "搞笑 has 294rows\n", 437 | "Data saved\n", 438 | "Dealing with: 实况解说\n", 439 | "Start date:2015-04-08 17:53:37\n", 440 | "End date:2015-04-09 01:19:13\n", 441 | "实况解说 has 0rows\n", 442 | "Dealing with: 游戏集锦\n", 443 | "Start date:2015-04-08 23:17:14\n", 444 | "End date:2015-04-08 23:42:10\n", 445 | "游戏集锦 has 0rows\n", 446 | "Dealing with: 欧美电影\n", 447 | "Start date:2016-02-22 11:45:41\n", 448 | "End date:2018-02-12 15:55:51\n", 449 | "欧美电影 has 72rows\n", 450 | "Data saved\n", 451 | "Dealing with: 日本电影\n", 452 | "Start date:2016-05-11 06:11:29\n", 453 | "End date:2018-01-26 08:49:37\n", 454 | "日本电影 has 62rows\n", 455 | "Data saved\n", 456 | "Dealing with: 国产电影\n", 457 | "Start date:2012-01-03 08:49:05\n", 458 | "End date:2018-02-28 02:34:13\n", 459 | "国产电影 has 224rows\n", 460 | "Data saved\n", 461 | "Dealing with: 官方延伸\n", 462 | "Start date:2010-01-07 03:46:26\n", 463 | "End date:2018-02-28 11:37:35\n", 464 | "官方延伸 has 297rows\n", 465 | "Data saved\n", 466 | "Dealing with: 国产动画\n", 467 | "Start date:2010-01-23 22:47:56\n", 468 | "End date:2018-02-28 03:30:00\n", 469 | "国产动画 has 295rows\n", 470 | "Data saved\n", 471 | "Dealing with: 三次元舞蹈\n", 472 | "Start date:2010-09-08 21:56:54\n", 473 | "End date:2018-02-28 12:40:54\n", 474 | "三次元舞蹈 has 272rows\n", 475 | "Data saved\n", 476 | "Dealing with: 舞蹈教程\n", 477 | "Start date:2011-04-02 11:17:02\n", 478 | "End date:2018-02-28 04:07:41\n", 479 | "舞蹈教程 has 252rows\n", 480 | "Data saved\n", 481 | "Dealing with: 美妆\n", 482 | "Start date:2014-04-21 18:15:57\n", 483 | "End date:2018-02-28 13:06:05\n", 484 | "美妆 has 140rows\n", 485 | "Data saved\n", 486 | "Dealing with: 服饰\n", 487 | "Start date:2013-11-24 12:11:47\n", 488 | "End date:2018-02-28 13:00:58\n", 489 | "服饰 has 155rows\n", 490 | "Data saved\n", 491 | "Dealing with: 手工\n", 492 | "Start date:2010-09-29 17:44:14\n", 493 | "End date:2018-02-28 13:11:51\n", 494 | "手工 has 270rows\n", 495 | "Data saved\n", 496 | "Dealing with: 绘画\n", 497 | "Start date:2010-03-17 00:33:51\n", 498 | "End date:2018-02-28 12:54:55\n", 499 | "绘画 has 290rows\n", 500 | "Data saved\n", 501 | "Dealing with: 运动\n", 502 | "Start date:2010-07-24 08:31:15\n", 503 | "End date:2018-02-28 13:19:40\n", 504 | "运动 has 277rows\n", 505 | "Data saved\n", 506 | "Dealing with: 健身\n", 507 | "Start date:2014-07-28 13:04:28\n", 508 | "End date:2018-02-28 13:00:58\n", 509 | "健身 has 131rows\n", 510 | "Data saved\n", 511 | "Dealing with: 广告\n", 512 | "Start date:2009-07-13 18:34:45\n", 513 | "End date:2018-02-28 13:20:06\n", 514 | "广告 has 315rows\n", 515 | "Data saved\n", 516 | "Dealing with: 国产原创相关\n", 517 | "Start date:2009-09-30 12:42:21\n", 518 | "End date:2018-02-28 13:19:43\n", 519 | "国产原创相关 has 307rows\n", 520 | "Data saved\n", 521 | "Dealing with: 布袋戏\n", 522 | "Start date:2010-02-14 11:05:42\n", 523 | "End date:2018-02-28 09:27:27\n", 524 | "布袋戏 has 293rows\n", 525 | "Data saved\n", 526 | "Dealing with: 电子竞技\n", 527 | "Start date:2009-07-09 19:15:16\n", 528 | "End date:2018-02-28 13:49:44\n", 529 | "电子竞技 has 315rows\n", 530 | "Data saved\n", 531 | "Dealing with: 手机游戏\n", 532 | "Start date:2010-02-06 19:12:21\n", 533 | "End date:2018-02-28 14:08:13\n", 534 | "手机游戏 has 294rows\n", 535 | "Data saved\n", 536 | "Dealing with: 桌游棋牌\n", 537 | "Start date:2010-03-27 14:17:19\n", 538 | "End date:2018-02-28 14:07:32\n", 539 | "桌游棋牌 has 289rows\n", 540 | "Data saved\n", 541 | "Dealing with: ASMR\n", 542 | "Start date:2010-05-29 03:11:51\n", 543 | "End date:2018-02-28 14:22:05\n", 544 | "ASMR has 283rows\n", 545 | "Data saved\n", 546 | "Dealing with: 汽车\n", 547 | "Start date:2011-01-12 13:41:51\n", 548 | "End date:2018-02-28 14:19:35\n", 549 | "汽车 has 260rows\n", 550 | "Data saved\n", 551 | "Dealing with: 科学探索\n", 552 | "Start date:2010-06-03 09:55:15\n", 553 | "End date:2018-02-28 10:01:16\n", 554 | "科学探索 has 282rows\n", 555 | "Data saved\n", 556 | "Dealing with: 热血军事\n", 557 | "Start date:2010-12-23 06:50:28\n", 558 | "End date:2018-02-28 06:08:24\n", 559 | "热血军事 has 262rows\n", 560 | "Data saved\n", 561 | "Dealing with: 舌尖上的旅行\n", 562 | "Start date:2011-06-08 23:18:17\n", 563 | "End date:2018-02-28 10:58:27\n", 564 | "舌尖上的旅行 has 245rows\n", 565 | "Data saved\n", 566 | "Dealing with: 影视杂谈\n", 567 | "Start date:2011-07-08 04:36:59\n", 568 | "End date:2018-02-28 14:28:54\n", 569 | "影视杂谈 has 242rows\n", 570 | "Data saved\n", 571 | "Dealing with: 影视剪辑\n", 572 | "Start date:2010-02-03 14:12:18\n", 573 | "End date:2018-02-28 15:00:27\n", 574 | "影视剪辑 has 294rows\n", 575 | "Data saved\n", 576 | "Dealing with: 预告 资讯\n", 577 | "Start date:2009-06-26 07:11:36\n", 578 | "End date:2018-02-28 14:45:07\n", 579 | "预告 资讯 has 316rows\n", 580 | "Data saved\n", 581 | "Dealing with: 国产剧\n", 582 | "Start date:2011-02-04 11:04:49\n", 583 | "End date:2018-02-28 08:04:43\n", 584 | "国产剧 has 258rows\n", 585 | "Data saved\n", 586 | "Dealing with: 海外剧\n", 587 | "Start date:2014-08-09 05:55:52\n", 588 | "End date:2018-02-25 02:00:00\n", 589 | "海外剧 has 129rows\n", 590 | "Data saved\n" 591 | ] 592 | } 593 | ], 594 | "source": [ 595 | "index_store = ['date','tduration', 'tview', 'tcoin', 'tfavorite', 'tlike','totalv','mostaid']\n", 596 | "\n", 597 | "# idx = 3\n", 598 | "for idx in np.arange(len(sects) ):\n", 599 | " df_sect = df[df['sectname']==sects[idx]] \n", 600 | "\n", 601 | " max_date = df_sect.time.max()\n", 602 | " min_date = df_sect.time.min()\n", 603 | " sect_id_str = str(df_sect.sectid.unique()[0])\n", 604 | " sect_name_str = str(sects[idx])\n", 605 | " print('Dealing with: '+sect_name_str)\n", 606 | " print('Start date:' + str(min_date))\n", 607 | " print('End date:' + str(max_date))\n", 608 | "\n", 609 | " dateseries = pd.date_range(start=min_date, end=max_date, freq='10D')\n", 610 | "\n", 611 | "\n", 612 | " df_store = pd.DataFrame(columns=index_store)\n", 613 | "\n", 614 | "\n", 615 | " ########\n", 616 | " # Loop Through Dates\n", 617 | " ########\n", 618 | "\n", 619 | " # d_idx = 0\n", 620 | "\n", 621 | " for d_idx in np.arange(len(dateseries) -1 ):\n", 622 | " df_sect_temp = df_sect[df_sect['time'].between(dateseries[d_idx],dateseries[d_idx+1])]\n", 623 | "\n", 624 | " if not df_sect_temp.empty:\n", 625 | " mostviewed_temp = df_sect_temp.loc[df_sect_temp['view'].idxmax()].aid\n", 626 | " totalrows_temp = len(df_sect_temp.index)\n", 627 | " sumviews_temp = np.sum(df_sect_temp['view'].values)\n", 628 | " sumduration_temp = np.sum(df_sect_temp['duration'].values)\n", 629 | " sumcoin_temp = np.sum(df_sect_temp['coin'].values)\n", 630 | " sumfav_temp = np.sum(df_sect_temp['favorite'].values)\n", 631 | " sumlike_temp = np.sum(df_sect_temp['like'].values)\n", 632 | "\n", 633 | " df_sect_temp2 = df_sect_temp.mean().round(2)\n", 634 | "\n", 635 | " values_temp = [dateseries[d_idx] , sumduration_temp, sumviews_temp, sumcoin_temp, sumfav_temp, sumlike_temp, totalrows_temp ,mostviewed_temp]\n", 636 | "\n", 637 | " df_store_temp = pd.DataFrame([values_temp],columns=['date','tduration', 'tview', 'tcoin', 'tfavorite', 'tlike','totalv','mostaid'])\n", 638 | "\n", 639 | "\n", 640 | " df_store = (pd.concat([df_store, df_store_temp]) ).reset_index(drop=True)\n", 641 | " else:\n", 642 | " values_temp = [dateseries[d_idx] , 0, 0, 0, 0, 0, 0 ,0]\n", 643 | "\n", 644 | " df_store_temp = pd.DataFrame([values_temp],columns=['date','tduration', 'tview', 'tcoin', 'tfavorite', 'tlike','totalv','mostaid'])\n", 645 | "\n", 646 | " df_store = (pd.concat([df_store, df_store_temp]) ).reset_index(drop=True)\n", 647 | "\n", 648 | " \n", 649 | " print(sect_name_str + ' has ' + str( len(df_store.index) ) + 'rows' )\n", 650 | " \n", 651 | " if not df_store.empty:\n", 652 | " df_store['date'] = df_store['date'].dt.date\n", 653 | "\n", 654 | " df_store.to_csv('export/batch/'+sect_id_str+'-'+sect_name_str+'.csv', sep=',', encoding='utf-8')\n", 655 | "\n", 656 | " print('Data saved') " 657 | ] 658 | }, 659 | { 660 | "cell_type": "code", 661 | "execution_count": null, 662 | "metadata": {}, 663 | "outputs": [], 664 | "source": [] 665 | } 666 | ], 667 | "metadata": { 668 | "kernelspec": { 669 | "display_name": "Python 3", 670 | "language": "python", 671 | "name": "python3" 672 | }, 673 | "language_info": { 674 | "codemirror_mode": { 675 | "name": "ipython", 676 | "version": 3 677 | }, 678 | "file_extension": ".py", 679 | "mimetype": "text/x-python", 680 | "name": "python", 681 | "nbconvert_exporter": "python", 682 | "pygments_lexer": "ipython3", 683 | "version": "3.6.4" 684 | } 685 | }, 686 | "nbformat": 4, 687 | "nbformat_minor": 2 688 | } 689 | -------------------------------------------------------------------------------- /app/LICENSE.md: -------------------------------------------------------------------------------- 1 | CC0 1.0 Universal 2 | ================== 3 | 4 | Statement of Purpose 5 | --------------------- 6 | 7 | The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work"). 8 | 9 | Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others. 10 | 11 | For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights. 12 | 13 | 1. Copyright and Related Rights. 14 | -------------------------------- 15 | A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following: 16 | 17 | i. the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work; 18 | ii. moral rights retained by the original author(s) and/or performer(s); 19 | iii. publicity and privacy rights pertaining to a person's image or likeness depicted in a Work; 20 | iv. rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below; 21 | v. rights protecting the extraction, dissemination, use and reuse of data in a Work; 22 | vi. database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and 23 | vii. other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof. 24 | 25 | 2. Waiver. 26 | ----------- 27 | To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose. 28 | 29 | 3. Public License Fallback. 30 | ---------------------------- 31 | Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose. 32 | 33 | 4. Limitations and Disclaimers. 34 | -------------------------------- 35 | 36 | a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document. 37 | b. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law. 38 | c. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work. 39 | d. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work. 40 | -------------------------------------------------------------------------------- /app/README.md: -------------------------------------------------------------------------------- 1 | # BiliSpider App 2 | 3 | 4 | Install `npm` 5 | 6 | Install dependencies 7 | 8 | ``` 9 | npm install 10 | ``` 11 | 12 | Run test 13 | 14 | ``` 15 | npm start 16 | ``` 17 | 18 | Build your own version of the app 19 | 20 | ``` 21 | npm run dist 22 | ``` -------------------------------------------------------------------------------- /app/about.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 |30 | 一个用来获取 Bilibili 用户数据的爬虫 31 |
32 |https://github.com/uupers/uupers.github.io33 | 34 | 35 | 36 |
56 | LOG:58 |
57 |