以『山河令』为实战案例,手把手教会你用Python爬取『优酷』视频评论
大家好,我是辰哥。
最近在网上搜了各大技术博客平台以及开源代码,都没有最新爬取『优酷』视频评论的文章或者案例。以前(2020之前)的爬取『优酷』视频评论的方法现在也都不适用(优酷新加了加密反爬)。所以今天辰哥就手把手教大家爬取『优酷』视频评论。
是的,你没看错,辰哥选择了『山河令』作为实战案例。『山河令』刚开播就天天在优酷热播榜首(优酷独播),热度到现在也一直都没减。
其实在五一的时候,辰哥就想爬取『山河令』的视频评论,奈何优酷平台的视频评论有逆向加密反爬。一直到今天之前都没有解决。不过现在既然辰哥发出来了,说明已经爬取成功了。(实际上最开始的加密反爬没有解决,辰哥换了另外一种方法)
在开始说最终的解决方法之前,先给大家介绍一下『优酷』的加密反爬(辰哥没有搞定,如果有大佬或者感兴趣的可以去研究一下,跟辰哥探讨一起解决)。
咱们这么以『山河令』的第一集为例,爬取视频评论。
https://v.youku.com/v_show/id_XNTEwMTg0NjE5Mg==.html?spm=a2h0c.8166622.PhoneSokuProgram_1.dselectbutton_1&showid=ceba4745ea10415eb791
评论信息如下:
在页面下方有:查看更多评论
点击之后方面页面链接没有变化,说明是Ajax异步加载,我们去network里面查看数据包。可以成功找到对应的响应数据。
1.数据包响应内容
可以在页面上看到响应的数据(视频评论)
2.请求链接和参数
上面这个是请求链接
这是请求参数,可以看到是get请求。ok竟然知道这些,那么我们可以在python里面构建数据包
3.构造数据包
上面就是通过python代码构造的数据包,请求之后,可以成功返回数据
以为成功了!NO NO NO
4.加密反爬
上面的结果看着是成功了,实际上是没有成功的,为什么这么说,接着辰哥给你分析一下。
反爬:
sign授权验证有效期(约2分钟失效),也就是说,这个链接2分钟就失效了。
可以看到请求参数里面有sign参数吧。通过js逆向看到,这个sign是通过其他的一些参数进行hash而来。这里的一些指多少个没明确。辰哥也时候过进行从1个到全部的测试hash,但是都失败。
辰哥的hash代码如下:
这个sign参数的获得就是『优酷』的加密反爬,辰哥没有搞定,就测试了另一种方法。
看到Seleium大家应该都不陌生。辰哥就是使用了Seleniumn方式去采集到了『优酷』的视频评论。
1.安装Selenium
通过下面命令可以安装
pip install Selenium
Selenium3.x调用浏览器必须有一个webdriver驱动文件。
Chrome驱动文件下载
https://chromedriver.storage.googleapis.com/index.html?path=2.35/
Firefox驱动文件下载
https://github.com/mozilla/geckodriver/releases
2.采集实战
在使用Selenium之前,先引入库
from selenium import webdriver
然后引入webdriver,我这里是下载好之后放在D盘下面(辰哥这里使用chrome)
#1.创建Chrome浏览器对象,这会在电脑上在打开一个浏览器窗口
browser = webdriver.Chrome(executable_path ="D:\chromedriver.exe")
然后开始请求目标网页(山河令:第一集)
#2.通过浏览器向服务器发送URL请求
browser.get("https://v.youku.com/v_show/id_XNTEwMTg0NjE5Mg==.html?spm=a2h0c.8166622.PhoneSokuProgram_1.dselectbutton_1&showid=ceba4745ea10415eb791")
完整请求代码如下:
运行代码之后,自动打开浏览器
请求到之后开始进行对应页面自动化操作
3.到达页面底部
评论是在页面的底部(因为页面滚动到底部,才会加载出来评论),我们需要让页面到底部加载出评论到页面
其效果如下:
因为评论加载出来了,页面变长了,所以一开始的底部就只是靠近中间位置。
4.解析网页
既然评论数据加载到网页了,可以使用xpath对网页进行解析,提取出评论数据。先看一下页面标签
可以看到评论列表是在class标签comment-list-all,每一条评论都在class标签
comment-list-item里,内容是在class标签comment-list-content-text里。清楚这些之后,可以开始编写代码,进行解析。
打印输出:
内容输出没问题,最后还打印输出了评论数(10条,这里是10条是指这一页的),下面尝试爬取下一页。
5.爬取下一页
在分析之前,先看一下页面是如何加装下一页评论的
可以看到页面点击:查看更多评论,页面是异步加载下一页评论。既然知道这些,那么可以使用selenium模拟点击完成这步操作。
sleep(1)
#滚动到底部
js = "window.scrollTo(0,document.body.scrollHeight)"
browser.execute_script(js)
查看更多评论在页面底部,所以先滚动到页面底部。前面的sleep(1)是等待页面加载完毕,1秒后再开始滚动。
#点击:查看更多评论
elem1=browser.find_element_by_link_text("查看更多评论")
elem1.click()
sleep(1)
sleep(1)是等待1秒后点击。点击后就可以解析数据了。代码如下:
打印输出:
这里可以看到已经获取到加载后的数据,同时还作了对比,点击:查看更多评论前是10条评论,点击后再加载10条,那么可以获取到20条。
思路提示:可以将上面这个图中代码放到循环中,那样就可以一直爬取下一页。加入去重进制就可以避免重复保存之前已采集的内容。(这个就留给大家去发挥,动动手)。
最后附上运行的效果:
本文主要讲解如何去爬取优酷视频评论,并且以山河令为案例进行演示。
最后说一声:原创不易,求给个赞
为了大家方便学习,辰哥已经把本文的完整源码上传,需要的小伙伴在公众号后台回复:山河令
这两天辰哥会把本文讲解视频上传到B站,感兴趣的小伙伴可以点击:阅读原文,关注辰哥的B站账号。
推荐阅读