最新Python爬虫:斗鱼TV,面试官最后应该说什么

如果你也是看准了Python,想自学Python,在这里为大家准备了丰厚的免费学习大礼包,带大家一起学习,给大家剖析Python兼职、就业行情前景的这些事儿。

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

如果是像我上面说的那么简单,也就不必再写一篇文章。毕竟,网页小爬虫没有什么技术含量。分布式爬虫才有。

通常情况下的网页小爬虫无非要解决如下问题:

请求,如果对方有一定策略的反爬虫,那需要反反爬虫。比如,

  • header带上host,带上refer,带上其他

  • 需要验证,那就申请用户名和密码,然后登陆

  • 如果在登录时期有防跨站机制,那就先获取一次登录页面,然后解析出token,带上对应的token然后登陆。

  • 在程序中加入Log,并且存到本地。防止出现各种各样的反爬虫机制ban掉了程序,从而方便进行下一步防反爬虫对策。

并且,由于请求响应机制的存在,通常情况下,每一个请求对应一个响应,如果出错了,要么超时,要么有状态码,所以普通的web爬虫也相对而言比较容易些。

那么,斗鱼TV的站点是不是这样子的就能够容易爬取呢?

你猜到了,答案是“不是”。

由于弹幕具有实时性,就决定了斗鱼TV的弹幕无法通过保存完整指定时间端弹幕的XML(比如BILIBILI的一个视频弹幕是存在一段xml中的)或者Json数据来显示弹幕。要不然的话,那主播操作很出色的时候,观众的弹幕岂不是无法实时显示了么?

那么,肯定就是WebSocket了,于是,我一如既往的打开F12,查看网络流量。

正如你想到的那样,没有任何的弹幕流量来往。一个WebSocket的消息都没有。

那么,消息肯定是有的,但是消息并不是通过HTTP协议或者WebSocket协议传输的,那么问题会出在哪呢?

分析前端的代码,找出获取弹幕的JS代码,苦于代码太多,找了很久没有找到。那也就是执行逻辑可能在flash里面。

于是祭出大杀器WireShark,抓一下流量。终于看到弹幕的样子了。

是这样的。

douyutveachmsg.png

原来使用的是Flash的Socket功能。

那么,我们只需要模拟Socket的每一条消息就好了.

多分析几组数据,但还是对发送消息内容缺乏把握,特别是在用户认证,用户接收弹幕这一块。在搜索引擎上搜索了一阵,发现知乎上有个帖子,读完终于解了我的疑惑。

地址为: https://www.zhihu.com/question/29027665

在此基础上,省略若干消息分析过程。

总结后得出斗鱼TV网站的服务器分布。

douyutvinfo.jpg

1.2.房间信息和弹幕认证服务器获取

首先我们拿随便一个主播房间来说,比如,qiuri

Ta的房间链接分为两种

对这个主播房间页面请求,正常,所有的有用信息都不是放在HTML中渲染出来,而是有一条放在HTML中内置的JS脚本中,这是为了减少服务器渲染HTML的压力?可是渲染放在JS里面不也一样需要渲染?(不明白)总之,就是程序先加载没有具体数据填充页面,然后JS更新数据。

内置的两段JS脚本,JS脚本中有两个变量,该变量很容易转换成JSON数据,也就是两段JSON数据,一个是关于主播的个人信息,另一个是关于弹幕认证服务器的列表(该列表中的任意一个服务器均可以认证,但每一次请求主播页面得到的认证服务器列表都不一样)

Sc

Screen Shot 2016-02-09 at 1.01.51 PM.png

Screen Shot 2016-02-09 at 12.44.01 PM.png

通过这步,我们就拿到了主播的信息以及弹幕服务器的认证地址,端口。

1.3.发送Socket消息的流程简介

我们通过抓包,分析那一大坨数据包,可以确定以下通过以下的流程便可以获取弹幕消息。(分析过程比较繁琐)

首先建立两个Socket。一个用于认证(@danmu_auth_socket),另一个用户获取弹幕(@danmu_client)。

  • 步骤1: @danmu_auth_socket 发送消息登陆,获取消息1解析出匿名用户的用户名,再获取消息2解析出gid

  • 步骤2: @danmu_auth_socket 发送qrl消息,获取两个没有什么用的消息

  • 步骤3: @danmu_auth_socket 发送keeplive消息

  • 步骤4: @danmu_socket 发送伪登陆消息(所有匿名用户都一样只需要输入步骤一中用户名就行了,因为认证已经在上面做过了)

  • 步骤5: @danmu_socket 发送join_group消息需要步骤一中国的gid

  • 步骤6: @danmu_socket 不断的recv消息就可以获取弹幕消息了

后面会详细解释

2.1.消息Socket消息格式以及发送一条消息

既然是发消息,那么每条消息总是有些格式的。

斗鱼的消息格式大致如下:

douyutveachmsg.png

每一条消息并遵循下面的格式:

1.通信协议长度,后四个部分的长度,四个字节

2.第二部分与第一部分一样

3.请求代码,发送给斗鱼的话,内容为0xb1,0x02, 斗鱼返回的代码为0xb2,0x02

4.发送内容

5.末尾字节

-- encoding : utf-8 -- class Message # 向斗鱼发送的消息 # 1.通信协议长度,后四个部分的长度,四个字节 # 2.第二部分与第一部分一样 # 3.请求代码,发送给斗鱼的话,内容为0xb1,0x02, 斗鱼返回的代码为0xb2,0x02 # 4.发送内容 # 5.末尾字节 #pack(‘c*’)是字节数组转字符串的一种诡异的转化方式 def initialize(content) @length = [content.size + 9,0x00,0x00,0x00].pack(‘c*’) @code = @length.dup @magic = [0xb1,0x02,0x00,0x00].pack(‘c*’) @content = content @end = [0x00].pack(‘c*’) end def to_s @length + @code + @magic + @content + @end end end

经过封装,我们仅仅关注那些可见的字符串,也就是Content部分就可以了。

content部分,也就是发送消息的内容,在文章后面将会详解。

开启两个Socket,一个用户认证,另一个用于弹幕的获取。

用于用户弹幕认证的,是2.1中所说的认证服务器列表中任意一个。挑选出来一组ip和端口

@danmu_auth_socket = TCPSocket.new @auth_dst_ip,@auth_dst_port

用户获取弹幕的只要为

danmu.douyutv.com:8601 danmu.douyutv.com:8602 danmu.douyutv.com:12601 danmu.douyutv.com:12602

四组域名:端口均可以作为如下的DANMU_SERVER和PORT

@danmu_socket = TCPSocket.new DANMU_SERVER,DANMU_PORT

发送一条消息只需如此

data = "type@=loginreq/username@="+@username+"/password@=1234567890123456/roomid@=" + @room_id.to_s + "/" all_data = message(data) @danmu_socket.write all_data

把需要传输的字符串放进去就好了.

接下来,我们需处理上面说的六个步骤

2.2.发送消息详细流程之步骤一

发送消息内容为:

type@=loginreq/username@=/ct@=0/password@=/roomid@=156277/devid@=DF9E4515E0EE766B39F8D8A2E928BB7C/rt@=1453795822/vk@=4fc6e613fc650a058757331ed6c8a619/ver@=20150929/

我们需要注意的内容如下:

type 表示消息的类型登陆消息为loginreq username 不需要,请求登陆以后系统会自动的返回对应的游客账号。 ct 不清楚什么意思,默认为0并无影响 password 不需要 roomid 房间的id devid 为设备标识,无所谓,所以我们使用随机的UUID生成 rt 应该是runtime吧,时间戳 vk 为时间戳+“7oE9nPEG9xXV69phU31FYCLUagKeYtsF”+devid的字符串拼接结果的MD5值(这个是参考了一篇文章,关于这一处我也不大明白怎么探究出来的) ver 默认

通过这一步,我们可以获取两条消息,并从消息中使用正则表达式获取对应的用户名以及gid

str = @danmu_auth_socket.recv(4000) @username= str[/\/username@=(.+)\/nickname/,1] str = @danmu_auth_socket.recv(4000) @gid = str[/\/gid@=(\d+)\//,1]

2.3.发送消息详细流程之步骤二

发送的消息内容为

“type@=qrl/rid@=” + @room_id.to_s + “/”

无需多说,类型为qrl,rid为roomid,直接发送这条消息就好。返回的两条消息也没有什么价值。

data = "type@=qrl/rid@=" + @room_id.to_s + "/" msg = message(data) @danmu_auth_socket.write msg str = @danmu_auth_socket.recv(4000) str = @danmu_auth_socket.recv(4000)

2.4.发送消息详细流程之步骤三

发送的消息内容为

“type@=keeplive/tick@=” + timestamp + “/vbw@=0/k@=19beba41da8ac2b4c7895a66cab81e23/”

直接发送。无太大意义。

最后

Python崛起并且风靡,因为优点多、应用领域广、被大牛们认可。学习 Python 门槛很低,但它的晋级路线很多,通过它你能进入机器学习、数据挖掘、大数据,CS等更加高级的领域。Python可以做网络应用,可以做科学计算,数据分析,可以做网络爬虫,可以做机器学习、自然语言处理、可以写游戏、可以做桌面应用…Python可以做的很多,你需要学好基础,再选择明确的方向。这里给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

👉Python所有方向的学习路线👈

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

👉Python必备开发工具👈

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

👉Python全套学习视频👈

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

👉实战案例👈

学python就与学数学一样,是不能只看书不做题的,直接看步骤和答案会让人误以为自己全都掌握了,但是碰到生题的时候还是会一筹莫展。

因此在学习python的过程中一定要记得多动手写代码,教程只需要看一两遍即可。

👉大厂面试真题👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

代码,教程只需要看一两遍即可。

👉大厂面试真题👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值