最近遇到了点麻烦事,各种学习网站的不维护或者转移路线,于是将目标站点定位到了b站的学习资源
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)) 12
做爬虫永远不是进行数据抓取的工作最为复杂,反而数据清洗的工作时间可能占据着相当大的部分。上文说到,我们数据有学校、专业、老师、资源名称等字段,那怎么将这部分的数据清洗到能入库的程度呢?
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('_')
1234567891011121314151617这次主要提供了一个抓取脏乱数据的思路,在前期的几个分类库的构建中花费了大量的时间(一个反复调优的过程),爬虫的工作并不只是简单的数据抓取,而是要处理抓取的过程中所遇到的问题,当数据不符合入库的标准时,需要将之处理成所需的数据,当遇到反爬时,就需要和网站做斗争。大数据时代,数据就是金钱,怎么获取到想要的数据,就是我们爬虫的职责所在(由于不是私人项目,不方便进行代码发布)。
相关知识
园艺教学试验站
中学生物学教学资源的开发与应用研究
网上教学资源
百度移动搜索手机站优化指南V1.1
Python3.X网络爬虫学习(六)
网课资源的正确打开方式
B站播放量购买指南,了解1w播放量的价格和购买方式!
左手流量,右手搞钱:B站、小红书音乐博主生态观察
爬虫第一弹:安居客房地产数据爬虫
b站老年人诱捕器是什么梗
网址: B站教学资源爬虫 https://m.huajiangbk.com/newsview1835933.html
上一篇: (待会删)付费搞来的19G资源, |
下一篇: 数据库资源集合 |