更新与2020-04-11

目前爬过的站点
b站,网易云音乐

B站

需求:
1.爬取外挂字幕
2.爬取up主信息
3. 获取弹幕https://api.bilibili.com/x/v1/dm/list.so?oid=122426590
4. 获取弹幕发送者的信息

网上爬取b站资料虽然很多,但是不如自己实操来的舒服。

B站防爬的策略

对于未登陆的请求,我给你缓存里面的数据,这样你伤不到我筋骨[筋骨就是关系型数据库]
只有登陆以后,我才给你最准确的数据
对于登陆的账号,不好意思,我是有请求次数和频率限制的

1. 爬取B站外挂cc字幕

import requestsurl = "https://www.bilibili.com/video/BV1t7411z7ko?from=search"payload = {}
headers = {'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1'
}response = requests.request("GET", url, headers=headers, data = payload)print(response.text.encode('utf8'))

一个问题是怎么把html中的指定字符提取出来?换一种问法就是爬虫获取网页后,想要获取网页中<script></script>下的某个变量的内容。

1.提取script中的内容,这一步容易
2.获取内容里面的指定模块,最后还是到了正则的地步

'window.__INITIAL_STATE__={"performance":{"startApiTime":0,"endApiTime":0},"common":{"userInfo":{"isLogin":false,"face":"//static.hdslb.com/images/member/noface.gif","vipStatus":0,"vipType":0},"performance":{"startAPITime":0,"endAPITime":0},"locsData":{}},"space":{"mid":0,"info":{"vip":{},"sys_notice":{}}},"flow":{},"video":{"aid":85551510,"bvid":"BV1t7411z7ko","p":1,"isClient":false,"viewInfo":{"bvid":"BV1t7411z7ko","aid":85551510,"videos":1,"tid":182,"tname":"影视杂谈","copyright":2,"pic":"http://i0.hdslb.com/bfs/archive/1c204a74f34ed7fcf47826b124ce672523e94635.jpg","title":"沉睡魔咒2花絮视频(外挂英文字幕)(Maleficent.Mistress.of.Evil.2019.Digital.Extras)","pubdate":1580278708,"ctime":1580278708,"desc":"www.youtube.com\nMaleficent.Mistress.of.Evil.2019.Digital.Extras.1080p.AMZN.WEB-DL.DDP5.1.H.264-N","state":0,"attribute":16640,"duration":1500,"rights":{"bp":0,"elec":0,"download":1,"movie":0,"pay":0,"hd5":1,"no_reprint":0,"autoplay":1,"ugc_pay":0,"is_cooperation":0,"ugc_pay_preview":0,"no_background":0},"owner":{"mid":38428817,"name":"浪迹48","face":"http://i1.hdslb.com/bfs/face/b597b49c23a41261cb8a798e487d46f1015cb080.jpg"},"stat":{"aid":85551510,"view":444,"danmaku":0,"reply":1,"favorite":12,"coin":1,"share":0,"now_rank":0,"his_rank":0,"like":10,"dislike":0,"evaluation":""},"dynamic":"#沉睡魔咒##美国##幕后#","cid":146221803,"dimension":{"width":1920,"height":1080,"rotate":0},"no_cache":false,"pages":[{"cid":146221803,"page":1,"from":"vupload","part":"Maleficent.Mistress.of.Evil.2019.Digital.Extras.1080p.AMZN.WEB-DL.DDP5.1.H.264-N","duration":1500,"vid":"","weblink":"","dimension":{"width":1920,"height":1080,"rotate":0}}],"subtitle":{"allow_submit":false,"list":[{"id":22065421844742148,"lan":"en-US","lan_doc":"英语(美国)","is_lock":false,"subtitle_url":"http://i0.hdslb.com/bfs/subtitle/8f14fe24ea2d3e916a96981eb04c64e66c01ddbf.json","author":{"mid":0,"name":"","sex":"","face":"","sign":"","rank":0,"birthday":0,"is_fake_account":0,"is_deleted":0}}]}},"playUrlInfo":[{"order":1,"length":1499499,"size":86942682,"ahead":"","vhead":"","url":"http://upos-hz-mirrorakam.akamaized.net/upgcxcode/03/18/146221803/146221803-1-16.mp4?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfq9rVEuxTEnE8L5F6VnEsSTx0vkX8fqJeYTj_lta53NCM=&uipk=5&nbs=1&deadline=1586955867&gen=playurl&os=akam&oi=2887205243&trid=eac79dcb0e44409aaa41d85d14200d3bh&platform=html5&upsig=9f43ee76aff41f51531ccd5eba798866&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&hdnts=exp=1586955867~hmac=fe20fe9d65e4af0ee332512430e5b3780290fc773540e2dd5d0b89a1c9d81237&mid=0&logo=80000000","backup_url":null}],"playState":"init","error":0,"isNew":false},"tag":{"tagInfo":{},"tagSimilar":[]}}'


最后获取到的字幕地址

2.爬取up主信息

https://space.bilibili.com/7

https://space.bilibili.com/12

我想要做的就是看看b站用户名称的规律,所以我要获取所有用户的昵称信息。
发现user_id好像是自增的,那么是否可以暴力遍历,获取到所有用户的user_id呢?
问题:时间成本和存储成本

  1. 时间成本
    python遍历1亿次本身是需要时间,大概需要5秒
    python发送http请求需要时间,每个请求大约需要0.1秒的时间
    如果单纯的串行,大概需要的时间为100000000 * 0.1/3600/24 = 115天
  2. 我需要数据库来存储数据
    1亿行的mysql数据会有多大呢?
    如果说mysql不适合那么mongodb适合吗?

爱B站,对开发者真的是友好,看看b站限速情况吧?纳尼?好像没有限速?我终于知道b站为什么爬不垮了,肯定是用了缓存,要不然数据库受不了的。

https://api.bilibili.com/

说明 请求方法 地址
个人信息接口 get https://api.bilibili.com/x/space/acc/info?mid=${userId}&jsonp=jsonp
也是个人信息接口 get https://api.bilibili.com/x/web-interface/card?mid={mid}

|

for i in range(1000, 1500):time.sleep(0.03)url = 'https://api.bilibili.com/x/space/acc/info?mid=%s&jsonp=jsonp' % ir = requests.get(url)print(r.json())

返回数据格式
code=0,代表用户存在

{'code': 0, 'message': '0', 'ttl': 1, 'data': {'mid': 1905, 'name': '青梅煮酒', 'sex': '保密', 'face': 'http://i1.hdslb.com/bfs/face/9dc28e96213281004645d990ea266b491b12e5db.jpg', 'sign': 'uid能代表什么,代表我老了ॱଳ͘', 'rank': 10000, 'level': 5, 'jointime': 0, 'moral': 0, 'silence': 0, 'birthday': '', 'coins': 0, 'fans_badge': False, 'official': {'role': 0, 'title': '', 'desc': '', 'type': -1}, 'vip': {'type': 1, 'status': 0, 'theme_type': 0}, 'pendant': {'pid': 452, 'name': '灵笼', 'image': 'http://i0.hdslb.com/bfs/face/9c5f14d6749daded668f3f66998baf4a50e7d8da.png', 'expire': 0}, 'nameplate': {'nid': 0, 'name': '', 'image': '', 'image_small': '', 'level': '', 'condition': ''}, 'is_followed': False, 'top_photo': 'http://i2.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png', 'theme': {}, 'sys_notice': {}}}

code -404,代表用户不存在

{'code': -404, 'message': '啥都木有', 'ttl': 1, 'data': None}

3.获取弹幕

接口地址
https://api.bilibili.com/x/v1/dm/list.so?oid=122426590

4.获取弹幕发送者信息

这个值是userId的hash得到的,可以通过彩虹表反向得到,对不起,b站可能大概也许谁知道呢修复了这个问题

import binascii
for i in range(1,100000000):if binascii.crc32(str(i).encode("utf-8")) == 0x11ec39b9:print(i)

京东

百度

微博

网易云音乐

网易云的用户 https://music.163.com/#/user/home?id=29879272
网易云的音乐 https://music.163.com/#/song?id=65766

第一步,查看《富士山下》
打开页面 https://music.163.com/#/song?id=65766
分析网络请求,看到有这样的请求
Request URL: https://music.163.com/weapi/song/enhance/player/url/v1?csrf_token=77b1ff400d812a327d4b8ee9f1e09b36

这个地址就是资源地址

所以重点就是分析这个接口的食用方法。
所以这里的问题就变成了API逆向解析问题。
weapi/song/enhance/player/url/v1
params
encSecKey
我们发现网易云音乐的js代码经过了混淆,非常不方便人类阅读,这真不是人干的事情啊~
浏览器断点调试原理?
获取调试过程中变量的值,你代码可以混淆,但是你变量的值是没法混淆的。

asrsea是一个d函数,d入参四个

找到a函数

找到b函数

找到c函数

!function() {function a(a) {var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = "";for (d = 0; a > d; d += 1)e = Math.random() * b.length,e = Math.floor(e),c += b.charAt(e);return c}function b(a, b) {var c = CryptoJS.enc.Utf8.parse(b), d = CryptoJS.enc.Utf8.parse("0102030405060708"), e = CryptoJS.enc.Utf8.parse(a), f = CryptoJS.AES.encrypt(e, c, {iv: d,mode: CryptoJS.mode.CBC});return f.toString()}function c(a, b, c) {var d, e;return setMaxDigits(131),d = new RSAKeyPair(b,"",c),e = encryptedString(d, a)}function d(d, e, f, g) {var h = {}, i = a(16);return h.encText = b(d, g),h.encText = b(h.encText, i),h.encSecKey = c(i, e, f),h}function e(a, b, d, e) {var f = {};return f.encText = c(a + e, b, d),f}window.asrsea = d,window.ecnonasr = e
}();

最后就变成了一个问题,python怎么获取js引擎的上下文,这样的话我不用把js转为python了。

可以通过python调用selenium,在selenium中执行js代码片段,这样的话即使js中包含三方依赖,那么也不会特别麻烦

网易云参考资料
https://blog.csdn.net/weixin_38936572/article/details/98608191
https://blog.csdn.net/weixin_44530979/article/details/87925950
https://github.com/metowolf/NeteaseCloudMusicApi/wiki/%E7%BD%91%E6%98%93%E4%BA%91%E9%9F%B3%E4%B9%90API%E5%88%86%E6%9E%90—weapi
https://www.zhihu.com/question/36081767


参考 https://juejin.im/post/5c8f15bde51d451d1118db99


喜欢一个人,就像喜欢富士山。你可以看到它,但是不能搬走它。你有什么方法可以移动一座富士山呢?回答是,你自己走过去。爱情也是如此,逛过就已经足够。 —云评论

常用网站URL规划分析相关推荐

  1. 常用网站流量检测分析工具

    您需要一款流量统计工具,实时监控您网站的流量统计和访客来源,从而得到更多关于您网站的数据分析报告. 目前国内有很多免费的流量统计工具,下面介绍几种用的比较广泛的流量统计. ·站长统计(http://w ...

  2. 常用正则:手机号码、中文名字、邮箱、身份证号码、网站URL

    常用正则 1手机号码 1.1精确匹配(11位) /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8} ...

  3. 大型网站系统架构分析--转

    大型网站系统架构分析 原文地址:http://www.cnblogs.com/Mainz/archive/2009/04/28/1445424.html 千万级的注册用户,千万级的帖子,nTB级的附件 ...

  4. 网站蜘蛛日志分析解读,SEO站长自查诊断

    什么是网站日志 通过百科我们也可以了解到,所谓的网站日志指的就是记录web服务器接收处理请求以及运行时错误等各种原始信息的以log结尾的文件.这里站长们要注意的是文件以log为后缀,只需将其下载下来使 ...

  5. 数据分析---网站日志流分析

    文章目录 数据分析平台介绍 网站流量分析项目的一些问题 1.数据处理流程 1.数据采集 2.数据预处理 3.数据入库 4.数据分析(ETL) 5.数据展现 2.mr程序进行数据预处理理论方面 3.流量 ...

  6. seo的不同阶段的表现和网站SE表现分析

    目录 一 seo的不同阶段的表现 二:网站SE表现分析Search engine(搜索引擎) 1.域名信息 2.主机信息 3.seo信息 一 seo的不同阶段的表现 1.seo初级 网站SE表现分析( ...

  7. 浅析网站URL优化有哪些问题需要注意呢?

    众所周知,网站优化工作是确保网站长久性运营的基础,在众多优化内容方面有一项重要内容,那就是网站URL的优化.所谓的网站URL就是网站在互联网中每一信息资源的统一且在互联网中的唯一地址,也是大家俗称的网 ...

  8. 服务器网站访问日志分析,服务器日志分析与流量统计_直观快捷分析每个网站的日志...

    本帖最后由 软程科技 于 2019-9-9 19:13 编辑 应用名称:日志分析与流量统计 价格:1元 作者:软程科技 版本: 2.1.9 提示(使用前必读): 1. 此插件未在超大(超过1G)的日志 ...

  9. js如何将跨域打开的窗口放到最前面_程序员的强迫症-便捷打开常用网站

    根据上一篇 程序员的强迫症–如何让电脑桌面变得非常干净?可以让电脑桌面非常简洁.干净,win + r 快速打开应用程序.常用文件夹. 这篇就介绍 win + r 便捷打开常用网站,优化管理 我们在日常 ...

最新文章

  1. 每天三分钟玩转Git(已完结)
  2. hashmap 判断key是否存在
  3. rxjs里merge operators的用法
  4. 【转】utf-8的中文是一个汉字占三个字节长度
  5. 【51Nod - 1215 】数组的宽度 (单调栈 或 分治 或 单调队列,算贡献,需去重)
  6. 通过Chrome扩展来批量复制知乎好友
  7. 大数据培训:小白如何学好大数据
  8. 苹果修复已遭在野利用的 iOS 和 macOS 0day
  9. 城镇化进程中的粮食生产问题
  10. verilog REG 寄存器、向量、整数、实数、时间寄存器
  11. 服务器数据库只读怎么修改权限,设置mysql数据库为只读权限
  12. java对excel加密_java poi对Excel文件加密
  13. 雷电模拟器重置开机密码
  14. oracle审计功能有什么用,Oracle审计功能
  15. CCPC-Wannafly Winter Camp Day8 (Div2, onsite)
  16. 集成学习(voting)
  17. Hi3559AV100/Hi3559CV100 DDR4参数配置说明
  18. PSP2000将支持Skype网络电话功能
  19. C++编写的简易宝可梦对战小游戏
  20. springboot整合mybatis实现增删改查

热门文章

  1. Python——编码风格建议
  2. C++——析构函数为什么要为虚函数
  3. SelectSort 选择排序
  4. Vim配置文件(.vimrc),Vim配置教程
  5. 草稿 12月第2周 排课
  6. 知识点old1908
  7. mysql-数据库操作-连接-创建-删除-修改编码-查询-切换
  8. js中的字符长度问题
  9. linux服务器时间不同步解决方法
  10. [Centos 6.2] centos 6.2(64位)网络配置