简易移动端爬虫实现pixabay网站图片搜索

news/2024/5/13 0:04:54/文章来源:https://blog.csdn.net/zy_jibai/article/details/89485651

有些时候你想在你的应用需要用到一些背景图片,但是没有图片啊,没有图片啊,没有图片啊。。。。。

当然你可以在应用内内置很多的精美图片,然后就造成了一些问题:你的apk变得贼大,其次想换一些新的图片只能在下一次应用更新。

或者搞一个服务器,用网络请求去访问服务器的图片,那么问题来了:谁去搞服务器,服务器的图片哪里来的。相信很多android端盆友对搭建服务器还是比较陌生的(比如我)。

于是我想了个可以投机取巧的办法,用别人家的图片,对,没有错,虽然这种方式有点不要脸,但是我只能这么干了。。。

主体思路如下:

应用http访问网页,获取网页界面,然后用正则将详情图匹配出来,获取到所有图片的url。。。

不多说了,开干吧。

找一个目标网页

首先要确定想要从什么网站上面爬取图片数据,我在github中的一个项目里是爬取的google图片搜索网站的图片数据,这里我从爬取pixabay的图片吧,链接:https://pixabay.com/

了解目标网页的url结构以及参数功能

有的盆友可能说了我没做过前端啊,,,我知道我也没做过,但是没吃过猪肉还没么见过猪跑吗,一点一点摸出来就可以了

比如我在pixabay搜索动物anim,结果如下:

他是通过path的方式去访问的,行,了解,先写一个http请求去访问这个界面,看看拿到的是什么东西,因为本人比较懒,所以直接用okhttp去写网络请求了;

public class PixabayUtils {public static void search() {OkHttpClient client = new OkHttpClient.Builder().build();final Request request = new Request.Builder().header("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36").url("https://pixabay.com/images/search/anim/").build();client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {Log.e("GFZY", "onFailure: " + e.getMessage());}@Overridepublic void onResponse(Call call, Response response) throws IOException {
//                        Log.i("GFZY", "onResponse: " + response.body().string());Log.i("GFZY", "onResponse: ");FileOutputStream fileOutputStream = new FileOutputStream(new File(Environment.getExternalStorageDirectory(), "AAAG.html"));fileOutputStream.write(response.body().string().getBytes());fileOutputStream.close();}});}
}

这里简单说一下为什么要添加User-Agent,原因有两个:在进行网络请求时,有些‘错误’的请求头会被网站当做爬虫(也就是咱们),所以为了模仿一个正常的网页打开,我们要设置一个user-agent,俗称反爬。其次,有些用过okhttp的同学可能接触过okhttp会将你的user-agent替换为okhttp-xxx,这样你拿到的数据就会有问题,当时在访问google图片的时候就是因为没有设置user-agent,所以拿到的结果没有详情图的url。

至于这个user-agent从哪里拿,网上有很多android获取默认user-agent的博客,大家自己找一下吧,再或者你可以打开你的网站的开发者模式,点开network,锁边找到一个网路请求,然后找到他的请求头,直接复制过来?


至于将网页结果存到手机,是为了验证拿到的结果是不是正确的,不必太在意。

行,这个事情就到这里,我们接着走。

简单跑一下(如果你说程序跑的时候有什么问题,先检查一下读写权限和网络权限),然后把结果html用电脑打开:

返回结果

是正常的。看来现在为止没什么问题,看到图片地址了,是不是很高兴!

别高兴太早了,这只是一个缩略图,分辨率低的可怜,除非你的显示区域很小,要是想弄全屏的,你可以看下效果,马赛克亮瞎你的眼。

找详情图url

网页上放置的大多数都是缩略图,而不同的网站详情图url放置的位置不一样,想google会把详情图url放在网页底部,等待动态调用,而大多数跳转式的网页应该会附带详情图的url,再点击后二次请求(个人猜测,)所以说这个工作还是要往出试。

这样的话那先点击一下进入详情页看看url的变化:

在我点击详情页之后path从anim变成了这个东西,如果说网页内可以找到这段path,那就什么都好说了,来我们看一下预览界面有没有这个字段哈哈:

果真如此,也就是说预览网址在href字段中会保留详情页的跳转界面 (只是针对pixabay,其他网站还需要自己往出推)

我们看看详情页中详情图的url存放在哪里:

好了,我们总结一下:对于这种跳转式的网站,想要获取他的详情图,需要进行如下的几个步骤:

  1. 观察url参数,知道关键的字段功能
  2. 在预览网页中找到详情页的url
  3. 在详情页中找到详情图的图片url
  4. 在一次访问获取所有详情页url后,遍历访问所有详情页url,抓取详情图的url

正则匹配url

可能抓取url的方式有很多,个人感觉正则是比较方便的一个方法。

首先获取预览网页中所有详情页的url:

                    @Overridepublic void onResponse(Call call, Response response) throws IOException {
//                        Log.i("GFZY", "onResponse: " + response.body().string());Log.i("GFZY", "onResponse: ");
//                        FileOutputStream fileOutputStream = new FileOutputStream(new File(Environment.getExternalStorageDirectory()
//                                , "AAAG.html"));
//                        fileOutputStream.write(response.body().string().getBytes());
//
//                        fileOutputStream.close();String resStr = response.body().string();Pattern pattern = Pattern.compile("(?<=href=\").*?(?=\")");Matcher matcher = pattern.matcher(resStr);ArrayList<String> detailsUrlList = new ArrayList<>();while (matcher.find()) {String group = matcher.group();//根据目标特征限制条件,否则匹配的情况太多了if (group.startsWith("/photos")&& group.charAt(group.length() - 1) >= '0'&& group.charAt(group.length() - 1) <= '9') {detailsUrlList.add("https://pixabay.com" + group);}}for (String s : detailsUrlList) {Log.i("GFZY", "onResponse: " + s);}}

结果如下:

遍历list,二次访问

                    for (String s : detailsUrlList) {
//                            Log.i("GFZY", "onResponse: " + s);Request detailRequest = new Request.Builder().url(s).get().header("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36").url("https://pixabay.com/images/search/anim/").build();client.newCall(detailRequest).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {Log.e("GFZY", "onFailure: " + e.getMessage());}@Overridepublic void onResponse(Call call, Response response) throws IOException {String resStr = response.body().string();
//                                            Log.i("GFZY", "onResponse: " + resStr);Pattern detailPattern = Pattern.compile("(?<=srcset=\").*?(?=\")");Matcher detailMatcher = detailPattern.matcher(resStr);while (detailMatcher.find()) {Log.i("GFZY", "onResponse: " + detailMatcher.group());}}});}

结果如下:

这个就是我们最后想要拿到的数据了,至于这两个网页怎么处理,大家可以自己弄了。


拿到详情图的url后,是想自己下载还是加载显示出来看大家需求了,这个功能到这里就完成了,怎么样,高兴不

 

 

之前我是搜索的Google图片网站,已经把功能封装成依赖,大家是在不想看上面这一坨坨的话可以远程直接调用,github链接如下:

https://github.com/gfzy9876/GoogleImgSearch

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_840181.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 安装xml文件,虚拟机XML文件 - Ubuntu 16.04 下 OpenStack 安装部署_服务器应用_Linux公社-Linux系统门户网站...

//如果是Xen&#xff0c;则type‘xen’Ubuntu //虚拟机名称&#xff0c;同一物理机唯一fd3535db-2558-43e9-b067-314f48211343 //同一物理机唯一&#xff0c;可用uuidgen生成524288524288 //memory这两个值最好设成一样2 //虚拟机可使用的cpu个数&#xff0c;查看…

#友盟杯#一步步教你为网站开发Android客户端

本文参与&#xff1a;友盟—安卓巴士Android开发原创教程大赛本文面向Android初级开发者&#xff0c;有一定的Java和Android知识即可。文章覆盖知识点&#xff1a;HttpWatch抓包&#xff0c;HttpClient模拟POST请求&#xff0c;Jsoup解析HTML代码&#xff0c;动态更新ListView背…

如何在Android Market中SEO你的APP应用

什么是Android Market应用描述优化&#xff0c;它有用吗?很简单&#xff0c;就是修改你的应用在Android Market中的描述&#xff0c;使之能更容易被用户找到&#xff0c;更容易被搜索引擎检索到&#xff0c;并让用户看上去更有下载的冲动。我见过太多的应用描述&#xff0c;实…

精品网站鉴赏 3

[转自&#xff1a;www.blueidea.com/bbs 作者&#xff1a;小毅]Контидом www.kontidom.ru  &#xff3b;.ru 是俄罗斯联邦的域名&#xff3d;序今天在网上看到一个非常不错的网站,还是FLASH的网站.一开始我打开网址一看也没有什么特别的地方&#xff0c;后来打开里面看…

电商网站下单过程涉及的网络协议

用一个下单的过程&#xff0c;看看互联网世界的运行过程中&#xff0c;都使用了哪些网络协议。 应用层 首先在浏览器里面输入https://www.kaola.com&#xff0c;这是一个URL。浏览器只知道名字是“www.kaola.com”&#xff0c;但是不知道具体的地点&#xff0c;所以不知道应该…

我是如何对网站CSS进行架构的

一、写在前面的 都是自己积累形成的一些东西&#xff0c;可能带有明显的个人印记。不是专业内容&#xff0c;不是权威指南&#xff0c;只是展示一点自己的观点&#xff0c;借此希望能与各位优秀的同行交流看法&#xff0c;见解。以得到进步与提高。 本文原地址&#xff1a;http…

centos查看端口启动的目录_(四)深入浅出TCPIP之TCP三次握手和四次挥手(下)的抓包分析-WEB资讯专栏-DMOZ中文网站分类目录

目录 1. 通过netstat来分析服务器和客户端的TCP状态 2.通过tcpdump抓包分析服务器和客户端的TCP状态 语法 抓包返回格式 抓包的FLags标记? 分析三次握手,数据收发 四次挥手的状态 目录1. 通过netstat来分析服务器和客户端的TCP状态2.通过tcpdump抓包分析服务器和客户端的TCP状…

iis使用nginx实现网站负载(转)

如果你关注过nginx&#xff0c;必定知道nginx这个软件有什么用的&#xff0c;如果你的网站访问量越来越高&#xff0c;一台服务器已经没有办法承受流量压力&#xff0c;那就增多几台服务器来做负载吧。做网站负载可以买硬件设备来实现&#xff0c;比如F5&#xff0c;不过价格就…

备份和恢复 cmdlet (SharePoint 2010)--还原网站集(5)

参数 参数2 详细说明 Restore-SPSite cmdlet 将网站集还原到 Identity 参数指定的位置中。内容数据库可以只包含一个网站集副本。如果在备份网站集之后将其还原到同一 Web 应用程序中的不同 URL 位置&#xff0c;必须提供其他内容数据库&#xff0c;以保存此网站集的已还原副本…

thinkphp5 图片压缩旋转_推荐6款图片在线压缩网站,从1M到1Kb一键搞定

(前言&#xff1a;最大程度保证图片的完整性、清晰度)高清图片内存太大了怎么办&#xff1f;最近写文章时&#xff0c;好不容易从摄图网上找到了一张契合主题的高清图片&#xff0c;奈何图片文件太大(足足26M)&#xff0c;无法上传微信公众平台(最大5M)使用裁剪工具&#xff0c…

Asp.Net基础 - 1.Web应用程序和网站 + 2.最简单的ASP.Net程序处理过程 + 3.ASP.Net的IsPostBack揭秘...

1.Web应用程序和网站 2.最简单的ASP.Net程序处理过程 3.ASP.Net的IsPostBack揭秘 1.Web应用程序和网站 WebApplication&#xff08;Web应用程序&#xff09;和WebSite&#xff08;网站&#xff09;的区别&#xff0c;WebSite是为了兼容从ASP转过来的开发人员的习惯而存在的&…

Android 5.0 开发者官方网站疏理知识结构

Android 5.0 开发人员官网知识结构疏理太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es)本文遵循“署名-非商业用途-保持一致”创作公用协议转载请保留此句&#xff1a;太阳火神的漂亮人生 - 本博客专注于 敏捷开发及移动和物联设备研究&#xff1a;iOS、Android、Html5、…

Node.js + Express + Mongodb 开发搭建个人网站(三)

三、后台架构 1、在根目录下&#xff08;和 views 文件夹同级&#xff09;创建 lib 文件夹 以后所有后端内容 都是在这里写&#xff0c;分别创建三个文件夹 到 lib 目录下&#xff1a; mongo 放的是数据的存储 module 放的是逻辑的处理 util 就是工具类文件 lib下 会有pa…

ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(二) 实现聊天室连接

上一篇已经简单介绍了layim WebUI即时通讯组件和获取数据的后台方法。现在要讨论的是SingalR的内容&#xff0c;之前都是直接贴代码。那么在贴代码之前先分析一下业务模型&#xff0c;顺便简单讲一下SingalR里的部分方法。 进入正题&#xff0c;我们要做&#xff0c;即时通讯&a…

我是如何给品牌独立站做 SEO 服务的

写下一些关于品牌独立站 SEO 的服务内容&#xff0c;帮助致力于需要服务品牌独立站 SEO 的朋友&#xff0c;也适合一些品牌站的负责人&#xff0c;老板了解付费 SEO 的关键点。 文章比较长&#xff0c;很多地方还可以继续深入的详说&#xff0c;对于广告投放等其它媒介来说&am…

实操:Shopify 如何纯靠 SEO 和社交媒体做到月入 $2600

写一篇关于 Shopify 靠 SEO 和社媒流量做运营推广的内容&#xff0c;帮助一些在做 Shopify&#xff0c;WooCommerce 等海外英文站&#xff0c;或者是 Niche 站的朋友&#xff0c;了解一些 Shopify 引流方法。 上线快一年多的 Shopify 店铺&#xff0c;纯靠 SEO 和社交媒体流量&…

独立站最好用的 SEO 工具之一:Ahrefs 使用指南

一、Ahrefs 是什么 Ahrefs 是一个国外的 SEO 工具&#xff0c;基本是每个做独立站 SEO&#xff0c;国外英文站运营必备工具。Ahrefs 通常被用在 SEO 关键字调研、独立站外链建设&#xff0c;竞争对手外链反查上。 通常我自己用 Ahrefs 查看竞对网站长尾词比较多&#xff0c;通…

独立站最好用的 SEO工具之一:Semrush 使用指南

一、Semrush 是什么 Semrush 一款在独立站 SEO 工具&#xff0c;它的主要用于网站付费广告查看&#xff0c;关键字调研&#xff0c;关键字排名数据研究。和 Ahrefs 一样&#xff0c;基础的关键字难度&#xff0c;搜索量&#xff0c;CPC 成本&#xff0c;竞争对手的 CPC 广告等都…

网站优化:测试网站速度的8款免费工具推荐

网站的加载速度是决定网站成败的重要因素&#xff0c;值得站长特别关注。原因很简单&#xff0c;没有人愿意为了打开一个网页而等老半天&#xff0c;换句话说&#xff0c;如果你的网站打开速度很慢&#xff0c;将流失大量的访客&#xff0c;甚至出现多米诺效应的不良影响&#…

网站建设指南(一)

网站建设指南一个网站开发人员必须掌握的知识是什么&#xff1f;HTML 和 CSS客户端脚本 - JavaScript and the DOM服务端脚本 - ASP, PHPXML 和SQLWWW 指南-万维网联盟(World Wide Web)WWW - 万维网联盟WWW通常称为网络。web是一个世界各地的计算机网络。电脑在Web上使用标准语…