java 动态爬虫_用selenium(Java)爬取b站up的动态

新人第一次发文,请多多指教。

selenium设计目的是进行自动化测试,但是很显然这样的功能同样是爬虫所需要的。本文介绍如何用selenium爬取b站up动态。

无意中发现有很多up在动态中发布一些奇怪的福利,精心挑选的二次元美图。作为一只老二刺螈,当然不能让美图从身边溜走-------爬虫走起。具体的网页

首先分析网页结构:

????是up的uid。

打开开发者工具,发现动态是这样排列的:一条条动态

这些动态是由ajax动态加载的,作为一只菜鸡,我毫不犹豫的选择了用selenium,而不是分析request(懂得都懂)。

右键检查图片元素,发现了这个,被包含在一个动态里:图片url所在位置

显然,红线部分就是图片对应的url,可以看到中间有个@符号分开了两个jpg。

这个@有什么用呢,等把图片爬下来我们就会发现,后面的jpg只是一个缩略图。不仅清晰度差,尺寸还小。所以等会写正则表达式时注意,去掉@及后面的部分。

好,到此思路就清晰了:先确定你要爬取的up的uid,带入上面我们给的网址中。

用selenium打开这个网址,调用js,自动滚动,加载ajax,直到到底。(由于不是很熟悉前端,我用循环的方式,每隔一段时间检查一下dom的底部是否出现了特定的字符串,比如现在就是检测“你已经到达了世界的尽头”)。

到底以后,js获取document,接下来解析。我直接把它赋值给一个字符串,然后用正则表达式获取url。

观察发现,每个福利动态都有一些特定的字符串出现,这是图片的来源。比如说下面,标注了图片来自Pixiv,画师是谁。没有这种标志的,一般都是一些无关的,不要爬,否则你会得到大量垃圾图片。(不得不说,这些up们的版权意识很好,没有一个不标的。不知道这是不是一个商业模式,有知道的评论一下呗)

我们通过这种标志筛选了一遍动态,接下来再用筛选这个动态的html中的url,

我用到的两个正则分别为:1. (Pixiv)|(ID)|(id)|(\u753b\u5e08)

2. //i0[^@]{50,100}(png|jpg)

获取到这些url后,下载到本地。下面是下载函数:下载一个图片到本地批量下载图片

不出意外的话,尽管我们经过了上面的筛选,还是会有一些垃圾图片混进来,一般都是一些表情符号,小的数kB,大的几百kB,而大部分图片的大小都大于1M。于是通过下面的函数,根据文件的大小,去掉不符合要求的图片:

还没完,如果你不知疲倦地爬了很多up的动态(说实话,光我看到的up就有十几个,我估计全站得有上百个这种up),这些图片难免会有重复,怎么办呢?

1是计算每张图片的hash值,比如计算md5,这样好处是几乎不可能误删图片,但是速度慢,也不简单。

2是用图片识别技术,相同的就删掉。

3是获得每张图片的大小,大小相同的就删掉。但是相比前两种误删的可能性较大。

但我在这里采用第三种,说实话,误删率很低,而且我没有一张不漏的需求,下面给出函数代码:函数有点长,去github拿吧

好了,爬虫到这里就完工了。测试了一下,在限制速度的情况下(每下载一张图片停0.5到1s),爬了900多张,用时不到10多分钟。满速度情况下,跟直接下载图片没区别,毕竟selenium加载占的时间不长。不过,为了可持续发展和爬虫道德,如果没紧急需求的话还是爬慢点吧。反正,我在爬完的那一瞬间就索然无味了。

还有一些额外的细节,要是都写出来篇幅就太大了,去看源代码吧。

另外,不能保证代码的时效性,毕竟是爬虫。

下面是github的链接:https://github.com/ai25395/py_selenium_translate/blob/master/getPictures.java​github.com

如果有用,留个赞,点个关注呗。

有什么问题的话,欢迎在评论区讨论。不能用了的话也可以说一下,有时间就修改修改。

禁止用作商业用途,如果侵权,本人不承担任何法律责任。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值