Jsoup在Android的使用(三)获取图片

        这篇文章,讲一下如何在Android端使用Jsoup获取网上的图片,例如(百度图片,搜狗图片等)。本来这篇文章应该会在Jsoup在Android的使用(二)爬取简书的文章之后写的。但是,写了标题后,没时间去写,就一直推到现在了。今天,把如何使用Jsoup爬取图片整理一下,希望有需要的朋友可以借鉴。关于Jsoup的使用,我不会在这篇博客中详细介绍,不知道Jsoup怎么使用的可以去查一下或者参考我在篇首提到的上一篇博客。

一、准备

1、明确需求

        首先,我们需要明确,从哪里获取图片呢?其实很多图片网站都可以获取,例如百度图片,搜狗图片等。爬取的方式大差不差,只要掌握了Jsoup的使用,那么只要允许你爬,只要你想爬,你就可以爬。在这篇文章中,我将以搜狗图片爬取为例。我们大致实现的如下的界面。我们爬取搜狗图片的若干美女图片,并且使用RecyclerView展示出来。当然,在我自己的小项目中,除了爬图以外,也做了大图浏览和下载等功能,但是这不是这篇博客的重点。

2、搜狗图片地址的确认

        既然上面明确了需求,那么我们接下来打开搜狗图片,地址:搜狗图片搜索 - 上网从搜狗开始。我们任意搜一个关键词,例如鞠婧祎,可以看到,搜索出很多鞠婧祎的照片:

        我们把地址栏自动生成的链接复制粘贴一下:

https://pic.sogou.com/pics?query=%BE%CF%E6%BA%B5t&w=05009900&p=&_asf=pic.sogou.com&_ast=1585753626&sc=index&sut=14107&sst0=1585753626316

        很长的一大串,我们无法从中找到规律,甚至我们连鞠婧祎三个字都没看到。那么,我们接下来慢慢地删除掉其中的一些字符串,只要删除后还能继续访问并且搜索到图片就可以。删除不是乱删的,一般我们以&为分割,例如我先删除最后一个&及其后面的字符串,得到:

https://pic.sogou.com/pics?query=%BE%CF%E6%BA%B5t&w=05009900&p=&_asf=pic.sogou.com&_ast=1585753626&sc=index&sut=14107

        用上面的地址访问一下,还是可以搜索到鞠婧祎的照片,那么我们继续删除。当然,你会发现,一直删除到第一个&,都是可以搜索到鞠婧祎的照片。其实,我们根本不用关心后面的一坨。得到的地址如下:

https://pic.sogou.com/pics?query=%BE%CF%E6%BA%B5t

        从很长的一串地址中,我们得到了一个看似比较简洁的地址,但是,这还不够,后面这一坨%XX的是什么,其实这就是“鞠婧祎”,做了编码而已。我们直接大胆的把链接改为:

https://pic.sogou.com/pics?query=鞠婧祎

        访问一下,Ok,还是可以打开的,还是能看到鞠婧祎小姐姐的美貌。很开心,这样的话,我们搜索其他关键字,那么我们的链接就是这样的:

https://pic.sogou.com/pics?query=关键字

        我们再试一下,把query=后面换成程序员,如下所示,我搜到了总是招黑的悲催的程序员:

         对了,在这里我要告诉大家一个事情,这种大量的图片,往往是分页的,但是我们不知道搜狗图片是如何分页的。或许借助一些抓包工具可以查到,但是我目前没有这样的工具,我就大胆的猜了一下,我猜的是page = x。试了一下,还真的是,因此,如果考虑分页爬取的话,我们最终的地址可以是这样:

https://pic.sogou.com/pics?query=鞠婧祎&page=1

3、查看网页源码

        确认好要爬取的地址后,接下来我们可以查看源码了。其实,查看源码跟上面也没什么关系,不管我们以什么地址进入,源码都是那样的。在这里呢,我想说的是,大家都是做开发的,那么平时都用什么代表图片或者图片的地址呢。比如:img,image,photo,pic,url之类的。那么,我们可以直接去源码中找到一个真正的图片地址,找啊找,找到了:

        我们打开pic_url或者ori_pic_url,都可以打开一张一模一样的图片,这就是我们要爬取的图片地址。拿到了所有图片的地址,那么我们想怎么显示怎么显示。接下来,就是如何爬取图片了!

二、获取图片

        在这里,我就直接把代码丢出来了。如下所示:

Document document = null;
                try {
                    document = Jsoup.connect(url)
                            .userAgent("Mozilla/5.0 (Windows NT 6.1; rv:30.0) Gecko/20100101 Firefox/30.0")
                            .get();
                } catch (IOException exception) {
                    exception.printStackTrace();
                }

                mImageList = new ArrayList<>();

                String xmlSource = document.toString();
                xmlSource = Html.escapeHtml(xmlSource);

                String reg = "ori_pic_url\":\"http://.+?\\.(gif|jpeg|png|jpg|bmp)";
                Pattern pattern = Pattern.compile(reg);
                Matcher m = pattern.matcher(xmlSource);
                while (m.find()) {
                    ImageBean image = new ImageBean();
                    String url = m.group().substring(14);
                    image.setUrl(url);
                    mImageList.add(image);
                }

        跟着上面的代码,我大致给大家总结一下过程:

1、建立连接

        如果你对Jsoup有了解,或者看过我关于Jsoup的两篇文章,那么应该知道,要爬取资源首先就是要与目标地址建立连接,如下所示:

document = Jsoup.connect(url)
                            .userAgent("Mozilla/5.0 (Windows NT 6.1; rv:30.0) Gecko/20100101 Firefox/30.0")
                            .get();

2、xml解析

        建立连接后,我们接下来获取xml的源代码,也就是我们在上面查看过的源码:

String xmlSource = document.toString();
xmlSource = Html.escapeHtml(xmlSource);

3、匹配

        解析获取到xml代码后,我们要从代码中去把图片的地址挑选出来。在上面,我们已经知道,图片的地址是pic_url或者ori_pic_url,在这里,我们使用ori_pic_url。要问为什么的话,就是因为ori_pic_url包含着pic_url吧,我们直接使用这个长的。那么如何获取url,这就要用到正则匹配。这是一个比较简单的正则表达式,也就是ori_pic_url开头,包含http:,并且以.gif,.jpg等结尾:

String reg = "ori_pic_url\":\"http://.+?\\.(gif|jpeg|png|jpg|bmp)";
Pattern pattern = Pattern.compile(reg);
Matcher m = pattern.matcher(xmlSource);       

4、得到Url

        经过上面的步骤后,我们可以获取到很多的"ori_pic_url:":"http//xxx.jpg"。但是,我们需要的仅仅是http:xxx.jpg。因此,我们需要对获取到的地址进行格式化,很简单,字符串截取即可,把“ori_pic_url:”(包含引号)截掉:

                while (m.find()) {
                    ImageBean image = new ImageBean();
                    String url = m.group().substring(14);
                    image.setUrl(url);
                    mImageList.add(image);
                    }

5、加载图片

        通过上面步骤,我们拿到了图片url的List,接下来的加载很简答了,我们可以直接使用Glide进行加载。为了避免有的图片资源因为不存在等原因无法加载,我们设置一个error图片:

Glide.with(mContext)
                .load(imageBean.getUrl())
                .error(R.drawable.default_small)
                .into(holder.iv);

        简单总结一下,这篇博客介绍了如何使用Jsoup爬取网上的图片。本来这篇博客应该是半年前就该完成的,一直拖着就忘掉了。在这篇文章中,我是以爬取搜狗图片为例。当然,爬取百度图片也是一样的道理,只不过链接和关键字的有所差别。

 最后,分享一款免费看热门电影和电视剧的app,仅限Android:

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个玩游戏的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值