iOS—网络实用技术OC篇网络爬虫-使用java语言抓取网络数据
网络爬虫-使用java语言抓取网络数据
前提:熟悉java语法(能看懂就行)
- 准备阶段:从网页中获取html代码
- 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件
上一片文章已经介绍我们可以使用两个方式来抓取网络数据实现网络爬虫,并且大致介绍了一下怎么使用正则表达式去实现数据的抓取
由于笔者曾经学过一段时间java和android相关的技术,今天就讲讲怎么使用java去抓取网络数据,关于Python有机会等笔者好好研究一下再来分享,但其实会一种就可以,除非你的需求非常强大或者是在想装逼。
一:准备阶段--》获取html代码
1:打开你对应想要获取数据的网页,使用firefox打开(因为他有一个自带的神器叫:firebug,关于firebug这里就多说了,反正对于网页开发来说她就是神器),这里我们使用的是dota首页英雄的介绍。
首先来看看我们需要的数据
2:由于在网页开发中也是分模块开发的,所以一定的区域在html中对应对应的html代码模块,所以我们选取界面中一个小的模块作为练习。
找到对应的模块,点击右键在firebug中查看元素
(确保已安装firebug,没有安装的去火狐工具栏中工具标签里面的一个附加组件搜索并下载安装就可以)
这个时候网页的下面就会显示对应模块的html代码,我们需要找到我们想要获取的数据对应的html模块代码,点击右键拷贝我们需要的html。
3:在界面简一个html文件将拷贝好的html代码粘贴到文件中,然后就需要哪么一丢丢的html相关知识了,就是补充html中的数据,使他成为完整的html文件
这里注意一下编码方式:开发中常用的都是utf-8的格式
二:实战阶段--》抓取html(网页数据)
然后我们就要正式开工了,后面才是重点,前面那都是傻瓜是的操作(后面的才做中需要有那么一丢丢的java或者android开发的基础,当然不会耶没有关系,笔者会完整的介绍流程)
1:代开Eclipse
新建一个java项目,并且点击项目中的src新建一个class专门用来实现数据的解析
2:新建好项目之后就要用到我们的一个java的jar包,专门用来抓取网络数据的包:关于包的下载后面笔者会给出下载链接
将下载好的jar包导入到java工程项目中。
然后我们需要将他添加到build路径(这里是一个常识,java中的jar包没有添加到build路径是不能使用的,添加之后对应的咖啡图标会变成奶瓶)
成功之后的显示
下面开始使用java正式抓取并解析html(网页)数据
根据下面的图片在java工程项目中书写html数据解析的代码:(注意里面的步骤)
java核心代码:
1 try {2 3 //文件路径4 5 String path = " /Users/icocos/Desktop/iCocos.html";6 7 8 9 //加载网页 10 11 Document doc = Jsoup.parse(new File(path), "UTF-8"); 12 13 14 15 //解析网页 16 17 Elements lis = doc.select("li"); 18 19 20 21 //遍历数组 22 23 for(int i = 0; i < eles.size(); i++) { 24 25 //根据i获取对应的元素 26 27 Element li = lis.get(i); 28 29 30 31 //取图片 32 33 Element img = li.select("img").get(0); 34 35 // System.out.println(img.attr("src")); 36 37 38 39 //获取图片名 40 41 String imgName = img.attr("src"); 42 43 44 45 Element p = li.select("p").get(0); 46 47 String personName = p.text(); 48 49 50 51 //打印数据 52 53 System.out.println(imgName + "," + personName); 54 55 56 57 } 58 59 } catch { 60 61 //错误(异常)处理 62 63 e.printStackTrace(); 64 65 }
此时点击Run运行之后,Eclipse就会根据你的代码输出对应的信息
但是这个时候我并不能直接使用数据所以需要在java代码中做一些相应的修改,使得输出的数据可以直接拷贝并且读到plist中,其实就是数组或者字典数据
我们知道在ios开发中从plist文件中读取数据时最常见的,当然你也可以使用其他方式,但是没有比这更简单了。
下面我给java代码做一些调整
1:在for循环之前输入这一行代码,实现数据拼接并且数据
- System.out.println("NSArray *apps = @[");
2:接着就需要在for循环结束之后输入预知对应的拼接数组结尾标志
- System.out.println("]");
3:在for循环内部的最后面我们需要在每次循环的时候都要使用上面的代码进行拼接并且使用逗号做相应的分割
- System.out.println("@{@\"name\":@\"" + personName + "\", @\"icon\":@\""+ imgName + "\"},");
最后完整的java获取并且解析html数据如下;
1 public class iCocos {2 3 public static void main (String[] args) {4 5 try {6 7 //文件路径8 9 String path = " /Users/icocos/Desktop/iCocos.html"; 10 11 //加载网页 12 Document doc = Jsoup.parse(new File(path), "UTF-8"); 13 14 //解析网页 15 Elements lis = doc.select("li"); 16 17 System.out.println("NSArray *apps = @["); 18 19 20 //遍历数组 21 22 for(int i = 0; i < eles.size(); i++) { 23 24 //根据i获取对应的元素 25 26 Element li = lis.get(i); 27 28 29 //取图片 30 31 Element img = li.select("img").get(0); 32 33 // System.out.println(img.attr("src")); 34 35 //获取图片名 36 37 String imgName = img.attr("src"); 38 39 Element p = li.select("p").get(0); 40 41 String personName = p.text(); 42 43 //打印数据 44 // System.out.println(imgName + "," + personName); 45 46 System.out.println("@{@\"name\":@\"" + personName + "\", @\"icon\":@\""+ imgName + "\"},"); 47 } 48 System.out.println("]"); 49 50 } catch { 51 52 //错误(异常)处理 53 e.printStackTrace(); 54 55 } 56 57 } 58 59 }
这个时候回打印输出下面的代码,
下面我们就需要在xcode中做事情了,做什么事呢,就是将输出的以NSArray开头的所有数据在Xcode中转换为plist的数据,当然你也可以不转换,做少部分的修改之后直接使用JSON解析技术去解析,但是那样不是最好的办法。
在Xcode中新建一个项目工程,在ViewDidLoad中粘贴拷贝过来的代码,这个时候是不是看起来非常熟悉,对了,她就是我吗开发中常用到的数组数据。
下面我就使用循环遍历去讲NSArray数组数据写到plist文件中。
1 - (void)viewDidLoad2 3 {4 5 [super viewDidLoad];6 7 8 9 NSArray *apps = @[ 10 11 @{@"name":@"敌法师", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/dfss.jpg"}, 12 13 @{@"name":@"火枪", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/arjj.jpg"}, 14 15 @{@"name":@"德鲁伊", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/dlyy.jpg"}, 16 17 @{@"name":@"月骑", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/yzqs.jpg"}, 18 19 @{@"name":@"变体精灵", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/btjl.jpg"}, 20 21 @{@"name":@"娜迦海妖", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/njhy.gif"}, 22 23 @{@"name":@"猴子", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/hycm.jpg"}, 24 25 @{@"name":@"白虎", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/yzjs.jpg"}, 26 27 @{@"name":@"隐形刺客", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/yxck.jpg"}, 28 29 @{@"name":@"巨魔", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/jmzj.jpg"}, 30 31 @{@"name":@"直升机", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/arzs.jpg"}, 32 33 @{@"name":@"赏金猎人", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/Naka.gif"}, 34 35 @{@"name":@"骷髅射手", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/KLSS.gif"}, 36 37 @{@"name":@"育母蜘蛛", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/YMZZ.gif"}, 38 39 @{@"name":@"血魔", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/XM.gif"}, 40 41 @{@"name":@"黑暗游侠", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/Nbrn.gif"}, 42 43 @{@"name":@"虚空假面", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/EC45.gif"}, 44 45 @{@"name":@"蛇发女妖", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/H00V.gif"}, 46 47 @{@"name":@"地卜师", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/H00I.gif"}, 48 49 @{@"name":@"地穴刺客", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/DXCK.gif"}, 50 51 @{@"name":@"蚂蚁", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/DXBZ.gif"}, 52 53 @{@"name":@"幻影刺客", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/HYCK.gif"}, 54 55 @{@"name":@"闪电幽魂", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/E002.gif"}, 56 57 @{@"name":@"影魔", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/YM01.gif"}, 58 59 @{@"name":@"小鱼人", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/yryx.gif"}, 60 61 @{@"name":@"幽鬼", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/YG1.gif"}, 62 63 @{@"name":@"圣堂刺客", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/E01Y.gif"}, 64 65 @{@"name":@"灵魂守卫", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/LHSW.gif"}, 66 67 @{@"name":@"熊战士", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/Huth.gif"}, 68 69 @{@"name":@"剧毒术士", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/JDSS.gif"}, 70 71 @{@"name":@"冥界亚龙", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/MJYL.gif"}, 72 73 @{@"name":@"复仇之魂", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/Hvwd.jpg"}, 74 75 @{@"name":@"剑圣", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/jsjs.jpg"} 76 77 ]; 78 79 80 81 [newApps writeToFile:@"/Users/icocos/Desktop/apps.plist" atomically:YES];
这个时候我吗的左面就有了这个plist文件,打开之后你会看到
最后的步骤就是图片的下载,
//简单写入
1 // for (NSDictionary *dict in apps) {2 3 // NSString *icon = dict[@"icon"];4 5 // 6 7 // // 新建网络图片的URL路径8 9 // NSURL *url = [NSURL URLWithString:icon]; 10 11 // 12 13 // // 下载图片的二进制数据 14 15 // NSData *data = [NSData dataWithContentsOfURL:url]; 16 17 // 18 19 // // 截取文件名 20 21 // NSString *filename = [icon lastPathComponent]; 22 23 // 24 25 // // 文件路径 26 27 // NSString *iconPath = [NSString stringWithFormat:@"/Users/icocos/Desktop/Icons/%@", filename]; 28 29 // 30 31 // [data writeToFile:iconPath atomically:YES]; 32 33 // }
//由于plist中图片名使用的都是对应链接的最后一个名字,所以我们不能使用上面的方法,还需要做一些处理,才能真正使用
1 NSMutableArray *newApps = [NSMutableArray array];2 3 for (NSDictionary *dict in apps) {4 5 NSMutableDictionary *newDict = [NSMutableDictionary dictionary];6 7 newDict[@"name"] = dict[@"name"];8 9 newDict[@"icon"] = [dict[@"icon"] lastPathComponent]; 10 11 [newApps addObject:newDict]; 12 13 } 14 15 16 17 [newApps writeToFile:@"/Users/icocos/Desktop/apps.plist" atomically:YES]; 18 19 20 21 }
图片下载完成之后你会回看到对应的文件夹中快速的出现了好多的图片
此时我们就得到了一份和网页想相对应比较完整的plist数据,后面我们要做的就是将我们的plist数据显示到界面,后面我就不介绍了,详细请看:plist文件读取
最后总结一下,如果以后遇到了关于需要抓取网络数据实现网络爬虫的功能的时候,我们基本上想到的第一种方法就是使用java语言,当然公司一般不会有这样的要求,公司一般都是使用自己服务器的api来实现,特殊情况除外。
当然你也可以使用正则表达式或者Python,关于正则表达式相对来说还是比较难的,主要是细节比较多。而Python本人还没有研究过,有机会尝试一下,如果您还有什么好的方法欢迎笔者联系,相互学习与讨论。
我们基本上可以按照上面的思路去实现,只需要做少部分的修改,这里大致说一下
- 1:准备阶段根据你需要的数据会有不同的html产生
- 2:产生不同的html之后你html内部的结构就会做响应的变化,这个时候你就要去把java那段核心代码搞懂来就没问题了,最重要的还是这里。
- 3:根据对应的NSArray数据写入到plist文件中,这里是iOS开发中常用的技术我就不多说。
转载于:https://www.cnblogs.com/LifeTechnologySupporter/p/5020048.html
iOS—网络实用技术OC篇网络爬虫-使用java语言抓取网络数据相关推荐
- iOS开发——网络使用技术OC篇网络爬虫-使用正则表达式抓取网络数据
网络爬虫-使用正则表达式抓取网络数据 关于网络数据抓取不仅仅在iOS开发中有,其他开发中也有,也叫网络爬虫,大致分为两种方式实现 1:正则表达 2:利用其他语言的工具包:java/Python 先来看 ...
- vs2015编写python爬虫_使用Python抓取网页数据(一)
iOS python 爬虫 LoL 学习iOS开发有一段时间了,最近想做一个自己的App玩玩,自己比较喜欢玩LOL,所以想试着做一个LOL资料库的App,那么问题来了,这么多英雄,物品等数据怎么获取呢 ...
- 手机应用url抓取_Python爬虫入门,快速抓取大规模数据(第六部分)
在前面的章节中,我们以尽量少的代码演示了爬虫的基本原理.如果只是需要抓取一些简单的数据,那么我们修改一下前面的代码就可以完成任务了.但是当我们需要完成一些复杂的大型抓取任务时,我们就需要考虑更多东西, ...
- Node.js学习之网络爬虫(使用cheerio抓取网页数据)
准备工作 1.安装node.js开发环境:http://www.runoob.com/nodejs/nodejs-install-setup.html 2.了解cheerio库 英文:https:// ...
- python抓取网页数据并截图_网络爬虫-使用Python抓取网页数据
搬自大神boyXiong的干货! 闲来无事,看看了Python,发现这东西挺爽的,废话少说,就是干 准备搭建环境 因为是MAC电脑,所以自动安装了Python 2.7的版本 添加一个 库 Beauti ...
- 手把手教你使用R语言爬虫在气象网站抓取气象数据并分析绘制热力日历图(1)
我们做临床研究常见的烦恼为没有好的数据,目前气象网站上有很多关于气象因素和空气质量数据,但是没有系统的整理和格式等问题,我们使用起来非常不方便,而且很费时间,我们可以使用R语言爬虫工具对网站上的数据进 ...
- Python,网络爬虫selenium与pyautogui抓取新浪微博用户数据
Python,网络爬虫selenium与pyautogui抓取新浪微博用户数据 不需要登陆新浪微博账户,直接运行就可以通过python爬虫爬取新浪微博用户数据.本例selenium与pyautogui ...
- Python网络爬虫,pyautogui与pytesseract抓取新浪微博数据,OCR
Python网络爬虫,pyautogui与pytesseract抓取新浪微博数据,OCR方案 用ocr与pyautogui,以及webbrowser实现功能:设计爬虫抓取新浪微博数据,比如,抓取微博用 ...
- 基于Java的网络爬虫实现抓取网络小说(一)
基于Java的网络爬虫实现抓取网络小说(一) 今天开始写点东西,一方面加深印象一方面再学习. 网络爬虫(Web crawler),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,它们被广泛用 ...
最新文章
- 读了这篇文字,做年薪百万的NLP工程师
- CentOS网络配置
- python rbf神经网络_原创,基于径向基函数(RBF)神经网络RBF网络的举例应用!
- iOS之Socket的使用-AsyncSocket
- 小程序跨行跨列多列复杂表格实现
- 在没人相信的时候,你的坚持才真正可贵
- mysql1440秒未活动_phpMyAdmin登陆超时1440秒未活动请重新登录
- python调用菜单响应事件_Python处理菜单消息操作示例【基于win32ui模块】
- es6 新增数据类型_ES6新增特性整理
- AudioTrack播放acc格式音频
- C语言知识点总结2022
- Unity的渲染管线
- python查看微信撤回消息怎么弄_Python | 查看微信撤回的消息(完整代码)
- Http头:only-if-cached
- idea中用git管理文件之后文件颜色的含义
- 【总结】研究生数学建模优秀论文——面向康复工程的脑电信号分析和判别模型
- 计算机在识别图像时“看到”了什么?
- Apache Camel - 4 - Camel元素
- Python爬虫:逆向分析某酷音乐请求参数
- reactjs前端数据导出
热门文章
- ActionBarTest、FragmentTest
- 测试开发之Python核心笔记(15):迭代器与生成器
- python画一颗小心心
- (十四)从零开始学人工智能-深度学习基础及CNN
- com.netflix.client.ClientException: load balancer doer not hava available server for client: XXX 的报错
- 腾讯云服务器违规封禁数据恢复和迁移教程,腾讯云账号违规被封如何解封迁移数据
- android屏幕适配:一个很棒的屏幕适配文章
- 浮云绘图编辑器之文字、图片基础图元操作及源码,用于文本描述及拓扑图、平面布局图开发
- Java是如何实现平台无关性(跨平台)的?
- 对企业数字化转型的思考