常用网站URL规划分析

更新与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 requests

url = "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/

说明请求方法地址
个人信息接口gethttps://api.bilibili.com/x/space/acc/info?mid=${userId}&jsonp=jsonp
也是个人信息接口gethttps://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' % i
    r = 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
在这里插入图片描述


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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值