写点什么

五步带你探究爬虫爬取视频弹幕背后的真相,附爬虫实现源码

用户头像
小Q
关注
发布于: 2020 年 12 月 30 日

前言


好久没更新,不知道各位粉丝有没有等着急,没办法,这不是要到年底了啊,又要开始准备一年一度的工作汇报了,咱到现在也不知道这玩意到底有什么用,反正就是每一家公司都需要这么个玩意,其中,最让我头疼的就是这个未来展望的环节,我要是能预测未来我不早就去买彩票发大财,还在这给你写什么规划。但是谁让你是老大呢,哎,所以,没办法,就是从网上各种找资料或者一些数据,写未来的规划,正好的,反正也是年底了,没啥事干,闲着也是闲着,就接了几个兼职的单子,赚点钱回家给小辈发红包啊!不知道大家有没有遇到这样的困境


再网上查找一些资料的时候,发现在网上对于 python 爬虫的案例讲解比较少,并且比较散,反正最近我从网上找资料,甚至是兼职的单子都是跟爬虫相关,今天就给大家简单介绍一下爬虫的相关内容,大家没啥事也可以自己练习着玩一下嘛


公众号:Java 架构师联盟

开发环境


开发工具:pycharm

开发环境:python3.8.5


原理讲解


其实说起来爬虫,简单点的理解,就是我们要去将我们在网页上查看的内容中的某一部分保存到本地,为什么这么说呢?


举个例子,大家都知道,我们在浏览器上浏览某个网站信息的时候,其实他是去后台请求相应的数据,然后,后台服务器相应这个数据请求,将数据返回到我们的前端界面(也就是你能看到的业面),如果这么说有点复杂的话,那结合一张图我们来看一下



这个过程通俗点来说就是:


浏览器提交请求->下载网页代码->解析/渲染成页面


而爬虫要做的其实就很简单了,也很好理解,既然你在浏览器中查看某些信息的时候,是执行的一个和服务器之间进行通信的过程,那你现在要求的不就是模拟浏览器的一个行为,然后将数据存储到本地吗?


流程如下:


模拟浏览器发送请求->下载网页代码->只提取有用的数据->存放于数据库或文件中


用一张图解释就是下面这样的****



实现流程


既然前面我们整理清楚了爬虫的一个工作原理,接下来不就简单了啊,我们就是看一下代码实现流程,写代码是最没有技术含量的


第一、获取数据的请求地址


因为现在是我们要模拟浏览器的一个行为,那我们最起码要知道数据的一个请求地址。也就是 url,我今天提供给大家的源码时爬取 B 站弹幕,那我就以此为例进行讲解


那 url 我们该怎么查找,首先,前面的时候我说了,我们在前面说了,我们要先模拟一个网站发起一个 request 请求,那我们要去查看的应该就是一个 request 的 url


注:什么是 request


使用http库向目标站点发起请求,即发送一个Request
复制代码


Request包含:请求头、请求体等
复制代码



我们按 F12 打开开发者模式,然后在页面中点击弹幕列表,在选择要查看的弹幕日期之后,在下方控制台中会出现一个 history 开头的选项,点击,我们会看到 request url 的选项


第二、模拟用户请求


主要包括两个方面,用户模拟以及登陆模拟


用户模拟


因为我们现在是模拟浏览器向服务器发起请求,就好像有一个陌生人来敲你家的门一样,这样的情况,你会开门吗?不会,那如果我们伪装成亲戚朋友的话,你就开门了把,在请求中,我们有一个用户代理(user-agent)来表明我们的身份选项****


注:


User Agent 中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。



登陆模拟


上面的问题解决了,同时也引出了下一个问题,我们在进行这个信息查看的时候,是通过一个已经登陆的账号,当你在未登陆的情况下****



你是无法查看这个历史的弹幕数据的,那我们在模拟的时候如何模式登陆行为的呢


这个时候,不得不提的就是浏览器的一个行为,当我们登录某个网站之后,再次访问的时候,很多时候是不需要再次登录的,那这是为什么呢?是因为当你登录之后,浏览器会在本地生成一个 cookie 的问题件,cookie 与特定的 Web 文档关联在一起, 保存了该客户机访问这个 Web 文档时的信息, 当客户机再次访问这个 Web 文档时这些信息可供该文档使用。这样一来也就完成了我们的直接访问行为



也就是说,只要我们获取这个 cookie,我们在访问后台服务器的时候,也是不需要什么登陆操作的,一气呵成


第三步:请求数据


经历上面的步骤,我们已经成功的向服务器发起请求,当你执行前面几步得操作后,你会得到这样的一个结果



这说明,我们成功和服务器进行了链接


响应状态200:代表成功301:代表跳转404:文件不存在403:权限502:服务器错误
复制代码


接下来我们要通过我们传入的 user-agent 以及 cookie 来确立我需要哪些数据,获取 url 请求过来的数据


也就是这样的一个结果



第四步,数据分析


到第三步,我们已经获取完成了相应的数据信息,但是我们只需要其中的一部分,所以要进行解析,留下的是我们自己需要的数据


第五步,数据存储


解析完成的数据,我们保存到本地,至此,数据爬取的工作完成


好了,一个数据爬虫的工作到这里就结束了,希望大家没啥事的时候可以自己动手实际操作一下,下面是我实现的代码,大家可以自己参考

代码实现


为了照顾刚接触这个的朋友,所以这里我写的会相对的详细一些,其中一些细小的知识点就不展开讲解了,毕竟我还要写苦逼的年终总结


# 爬取B站弹幕
# 什么是模块:模块就是用一堆的代码实现了一些功能的代码的集合,通常一个或者多个函数写在一个.py文件里import requests
url='https://api.bilibili.com/x/v2/dm/history?type=1&oid=260575715&date=2020-12-20'
# 如何获取路径下的信息# urllib(python自带的) request(第三方模块)
# 字典:字典是python里的一种数据类型,特点是元素的无序性,和键key的唯一性。字典的创建方法是{key:values}
getdata=requests.get(url)print(getdata)
headers={
#user-agent,就好像我们去一个人家串门,但是,如果主人不认识你,肯定不会给你开门,但是,如果你伪装成一个他认识的人,就像易容一样,那他是不是就给你开门了啊 # 模拟浏览器的行为 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', #cookie:我们在登录的时候会进行用户名和密码的输入,之后我们在登陆的时候就不需要再进行登陆了,那这个地方就是因为,这个账号和密码信息缓存到一起 # 你要自己实现的时候要换成自己的哦
'cookie': "_uuid=326F06D1-FE8D-9191-42CE-DD309D14353C67633infoc; buvid3=33D869DB-6F2F-4BB0-B607-1B7B34F07CFD53925infoc; sid=4lmxv7lu; rpdid=|(u)Y|l|uJRk0J'ulmJY|kRR|; dy_spec_agreed=1; LIVE_BUVID=AUTO2815973097085458; blackside_state=1; CURRENT_FNVAL=80; bp_video_offset_26390853=467157764523510086; bp_t_offset_26390853=467157764523510086; fingerprint=073aaf7f9d22ae55cfafd954c7f31b26; buivd_fp=33D869DB-6F2F-4BB0-B607-1B7B34F07CFD53925infoc; buvid_fp_plain=BCE2280A-DF5C-4872-98E2-4002159A716F143082infoc; PVID=3; bfe_id=fdfaf33a01b88dd4692ca80f00c2de7f; buvid_fp=33D869DB-6F2F-4BB0-B607-1B7B34F07CFD53925infoc; DedeUserID=26390853; DedeUserID__ckMd5=8d24b1d50476c5e5; SESSDATA=c6386003%2C1624877887%2Ca501d*c1; bili_jct=704cf795ee7a134f74dd244b80c5107d"}
resq = requests.get(url,headers=headers)
resq.encoding='utf-8'
print(resq.text)

#<d p="25.25400,1,25,16777215,1608370925,0,aded156e,42587259146338307">别啊,我的快乐啊</d>

# 使用python进行编程,一定要注意导入import re
data=re.findall(r'<d p=".*?">(.*?)</d>',resq.text)# 缓存 cookieprint(data)
# as 起别名import pandas as pd# 改变格式之后的数据test=pd.DataFrame(data=data)test.to_csv('e:/testcsv.csv',encoding='utf-8')
复制代码


刚刚接触 python 的小伙伴,可以每获取一步数据就打印一次,这样可能对于你的理解有一定的帮助


分享自己的码云地址,除了资料之外,还有我分享的学习代码,可以自行下载


发布于: 2020 年 12 月 30 日阅读数: 63
用户头像

小Q

关注

还未添加个人签名 2020.06.30 加入

小Q 公众号:Java架构师联盟 作者多年从事一线互联网Java开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。如果能为您提供帮助,请给予支持(关注、点赞、分享)!

评论 (1 条评论)

发布
用户头像
牛皮
2021 年 02 月 26 日 09:31
回复
没有更多了
五步带你探究爬虫爬取视频弹幕背后的真相,附爬虫实现源码