B站教学资源爬虫

B站教学资源爬虫

最近遇到了点麻烦事,各种学习网站的不维护或者转移路线,于是将目标站点定位到了b站的学习资源


所用语言和相关模块

  • python3.6
  • requests`
  • PIL

目前网站特点分析

b站是一个具有大量资源数据的网站,但是如何将目标网站中资源按照目前我们公司的学习资源库进行抓取并进行数据清洗,这将是一件非常磨人的事情。

前期的准备工作

我们库中的分类主要有学校、专业、老师等字段,于是,需要准备一下内容:
1、学校分类库,用于进行学校的搜索及资源名称的清洗
2、专业分类库
3、老师分类库,用于进行资源清洗

页面数据抓取

通过构建的学校分类库对每个学校在b站进行搜索
在b站搜索学校,分析交互,数据交互url为:https://s.search.bilibili.com/main/suggest?jsoncallback=jqueryCallback_bili_9732151391157637&func=suggest&suggest_type=accurate&sub_type=tag&main_ver=v1&highlight=&bangumi_acc_num=1&special_acc_num=1&topic_acc_num=1&upuser_acc_num=3&tag_num=10&special_num=10&bangumi_num=10&upuser_num=3&term=%E6%B8%85%E5%8D%8E%E5%A4%A7%E5%AD%A6&rnd=0.6259336836542948&_=1597045672018
在这里插入图片描述
通过变化不同的keyword(搜索字段),及不同的page(页数),能得到相关的想要的结果,值得一提的是,b站在这边有个小反爬机制,必须在请求头添加相应的referer

url = 'https://api.bilibili.com/x/web-interface/search/type?context=&page={}&order=totalrank&keyword={}&duration=4&tids_2=&__refresh__=true&_extra=&search_type=video&tids=36&highlight=1&single_column=0&jsonp=jsonp&callback=__jp35'.format(page, quote(xx))
headers['referer'] = 'https://search.bilibili.com/all?keyword={}'.format(quote(xx))

数据清洗

做爬虫永远不是进行数据抓取的工作最为复杂,反而数据清洗的工作时间可能占据着相当大的部分。上文说到,我们数据有学校、专业、老师、资源名称等字段,那怎么将这部分的数据清洗到能入库的程度呢?
资源的名称
1、资源名称中的学校提取
通过搜索字段去除资源名称中的学校,同时对比搜索的学校字段及资源名称中的能否找到其他的学校字段,如果有,则跳过该资源(宁缺毋滥)。
2、资源名称中的老师提取
通过前面所提的老师分类库,将资源中的老师名称进行提取。
3、资源名称的清洗
1)去除学校字段
2)去除老师字段
3)去除无关的字段
通过不断的反复抓取及清洗规则的调优,最后清洗的结果如下
优化结果对比图

反爬处理

b站作为一个比较大型的网站,对自己的资源保护还是比较好的,当相当一段时间请求资源详情页面过多的时候,会弹出相应的验证码进行验证。
通过相应的交互能得到:
提交验证的链接:https://sec.biliapi.net/th/captcha/check
请求验证图片的链接:https://sec.biliapi.net/th/captcha/get
获取验证的图片,调用相应的百度文字识别api进行识别,将识别的结果提交给验证的链接,能进行解锁。(值得注意的是,百度的识别并不是百分之一百,需要进行错误了的再次验证处理,也可以用代理ip进行抓取), 部分代码:

def get_baidu_api(img):
    """
    调用百度的文字认证识别接口
    :param img:图片信息
    :return:
    """
    headers['Content-Type'] = 'application/x-www-form-urlencoded'
    api_key = ''	# 百度识别的参数
    secret_key = ''	# 百度识别的参数
    access_url = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={}&client_secret={}&'.format(
        api_key, secret_key)
    r = requests.get(access_url)
    access_token = json.loads(r.text)['access_token']
    data_url = 'https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic' + "?access_token=" + access_token
    params = {"image": img}
    r = requests.post(data_url, headers=headers, data=params)
    return json.loads(r.text)['words_result'][0]['words'].strip().strip('_')

总结

这次主要提供了一个抓取脏乱数据的思路,在前期的几个分类库的构建中花费了大量的时间(一个反复调优的过程),爬虫的工作并不只是简单的数据抓取,而是要处理抓取的过程中所遇到的问题,当数据不符合入库的标准时,需要将之处理成所需的数据,当遇到反爬时,就需要和网站做斗争。大数据时代,数据就是金钱,怎么获取到想要的数据,就是我们爬虫的职责所在(由于不是私人项目,不方便进行代码发布)。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值