欢迎光临散文网 会员登陆 & 注册

基于Python Selenium对阿b短评区数据的统计总结

2023-04-16 00:11 作者:icyhat3  | 我要投稿

声明:本专栏所含内容系应用技术对公开数据的统计分析,完全符合《用户规范》中的规定

工具:Python Selenium库,Chrome浏览器及Selenium驱动,F12网页控制台

 

本专栏笔者技术有限,对且此部分内容知之不详,且本专栏技术难度不高且并不专业,如有知识性错误或优化方案请多包涵。而且笔者的文章能力较弱,可能会有解释不清的地方,仍请包涵。

 

(如果想要跳过论证过程而直接看到结论,那么请拉到最后,没错我就是为了这点醋包的饺子lol)

众所周知,F12在网页调试中是一个有利工具,你可以在F12中查看网页源html文件中的元素信息,我们以https://www.bilibili.com/bangumi/media/md4315402#short这部动画的短评区为例:

从此可以看到网页源代码。那怎么确定某一文本在网页源代码中的位置呢?F12大法也为我们提供一个方便的按键,它就在我们伟大F12的最左上角:                

右框内左上角的图标变亮了


单击后鼠标移动到对应区域便可以看到源代码也随之移动,单击显示具体位置。

那么这跟我们本文的主题有何关系呢?Python Selenium 是一个用于网页自动化测试的第三方库,而它又被常常用做爬虫。之所以不选用简单的BeautifulSoup而选用Selenium,则主要由于这个原因:

当我们下滑鼠标时出现新短评信息,说明这是由动态html渲染出来的,真正的数据不直接在网页源代码,而是保存在数据库中,用户访问则调用返回。(事实上这在此类网页是非常常用的)

如果我们要使用Selenium获取网页某部分信息,那么我们必定要获取这部分信息所在的位置。那么我们找到了位置怎么传给代码呢?伟大的F12门再次为我们提供了方法:

如图所示,右键元素可以复制元素的selector,js路径,xpath,这都是非常常用的定位方法。而Selenium使用的是xpath定位,复制xpath粘贴入对应函数就解决了!

/html/body/div[2]/div[2]/div[2]/div/div[1]/div/div/div[4]/div/div/ul/li[1]这是第一个评论的完整xpath路径。

观察路径我们可以发现,我们想要的只有li[]中的数字改变了,改变这个数字就可以得到其他评论的路径,而从路径中可以提取class为review-stars的元素,其中包含了网页显示的“星星“,观察到星星的class名为icon-star,如果亮,则又为icon-star-light。我们利用find_elements函数寻找这两个class对应的所有元素,返回一个python的list,使用len()就可以得到元素数目了。累加入全局变量做统计。

review-stars内的目标元素

现在只剩下最难解决的一个问题了:如何不重不漏的在动态html环境下统计数据。如果我们直接find_elements,会得到约20个短评数据,因为以下的部分还没有被网页请求获取。可以发现网页处理获取新数据的方法是滚轮向下至一定位置后加载新的约20条数据。此时若我们仍find_elements会重复之前的数据。因此我们利用xpath语法,对于上一次读到的最后一个数据所在位置pos,我们选择position>pos的元素。而pos是个每次读取都会增加的变量,我们可以用%d(类似C语法)的方法传入pos值(这里不能直接写>pos,因为python为了防止内存泄漏不允许这么做)。

然后对于每次新读取,我们使用JavaScript的函数scrollIntoView(),将鼠标滚轮移动到pos元素的相应位置,使得浏览器能加载出来下面的数据。该函数使用Selenium的execute_script()函数实现,同样需要用%来传入pos参数。

然后小小的sleep零点几秒,便大功告成了!

虽然如此,但是我实测会在一千多条数据的时候停下,且与sleep时间长度无关,推测是虽然滚轮移动至pos位置但是下面仍然没有加载出来,这可能与具体机器有关。因此我设置重复尝试读取,并且每次尝试读取将鼠标滚轮向下150个像素(大约是一个短评框的长度),最后成功读到了几乎所有的数据。但是与显示的13195条不同,少了十几条为13178条,原因不明(不知道是网站的问题还是代码的问题),但不足以影响数据。

 

说了这么多我们来看数据吧:

最终的星星数empty_stars=65980,full_stars=44934,比率ratio=0.6810。但我没有获取长评区的数据,由最终分8.2可以估算出长评区的ratio为约为1.03。由此可推断出结论,有能力写长评的人果然都有着优秀的文学素养与鉴赏能力,其平均分为五又二十分之三星,恭喜。

 

那么本文作为一个技术性专栏就到此结束了。依照类似的方法我们也可以去获取长评区数据信息。把url换成别的动画也可以成立。

感谢各位阅读。

 代码链接:https://www.aliyundrive.com/s/yUPdzvgVzUc 提取码:8e7r


基于Python Selenium对阿b短评区数据的统计总结的评论 (共 条)

分享到微博请遵守国家法律