网络爬虫-使用正则表达式抓取网络数据

关于网络数据抓取不仅仅在iOS开发中有,其他开发中也有,也叫网络爬虫,大致分为两种方式实现

  • 1:正则表达
  • 2:利用其他语言的工具包:java/Python

先来看看网络爬虫的基本原理:

一个通用的网络爬虫的框架如图所示:

网络爬虫的基本工作流程如下:

1.首先选取一部分精心挑选的种子URL;

2.将这些URL放入待抓取URL队列;

3.从待抓取URL队列中取出待抓取在URL,解析DNS,并且得到主机的ip,并将URL对应的网页下载下来,存储进已下载网页库中。此外,将这些URL放进已抓取URL队列。

4.分析已抓取URL队列中的URL,分析其中的其他URL,并且将URL放入待抓取URL队列,从而进入下一个循环。

以下内容均为本人个人理解。

网络数据抓取

  • 概念:网络数据抓取,也叫网络爬虫。是在我们iOS程序中,获取要抓取到的网页上的数据。
  • 用处:如果要用到某网站的一些数据,这个时候我们就要用到抓取数据技术。
  • 建议:建议抓取过程中,多利用分类,多写一些分类方法,有助于提高程序可读性,也可提高效率。

今天先来介绍一下第一种:正则表达式

注意点:

其实网络抓取数据很简单,但是有用到正则表达式,这个有人说难,有人说很难,有人说非常难,其实我们抓取数据只会用到“." 、"*"、"?"这三个符号!

正则表达式中:“.”是包括任何字符不包括换行符,“*”是任意多个的字符,“?”是指到最近的一个URL,如果没有就是到最远的一个!

1 NSString *pantten = [NSString stringWithFormat:@"<ul class=\"cs_list\">(.*?)</ul>"];
2
3 NSRegularExpression *regx = [NSRegularExpression regularExpressionWithPattern:pantten options:NSRegularExpressionCaseInsensitive |NSRegularExpressionDotMatchesLineSeparators error:NULL];

其中有两个参数需要大家了解一下,很重要

1
2
3
4
5
NSRegularExpressionCaseinsensitive 不区分大小写
NSRegularExpressionDotMatcheLineSeparators 让“点”字符可以匹配换行符

抓数据,其实主要会写匹配字符串就行

  • (.*?)表示要抓到的内容
  • .*?表示要忽略的内容,爱是啥是啥
  • 字符串转义双引号用\转义括号用\\

在开发项目的过程,很多情况下我们需要利用互联网上的一些数据,在这种情况下,我们可能要写一个爬虫来爬我们所需要的数据。一般情况下都是利用正则表达式来匹配Html,获取我们所需要的数据。一般情况下分以下三步。

1、获取网页的html

  • 2、利用正则表达式,获取我们所需要的数据
  • 3、分析,使用获取到的数据,(例如,保存到数据库)

接下来我们分析代码:

1、获取网页的html

  对于一些网页,不需要提交Post提交数据时,我们可以简单的利用NSURL类来获取我们所需要的html,交将其转换中kCFStringEncodingGB_18030_2000格式,解决中文乱码问题。

  

 1 +(NSString*) urlstring:(NSString*)strurl{2     NSURL *url = [NSURL URLWithString:strurl];3     NSData *data = [NSData dataWithContentsOfURL:url];4 5     NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); 6     NSString *retStr = [[NSString alloc] initWithData:data encoding:enc];7 8     //NSLog(@" html = %@",retStr);9
10     return retStr;
11   }

  对于需要Post提交数据的网页,我们可以利用强大的ASIFormDataRequest类来实现,例如:

 1 +(void)getPostResult:(NSString*)startqi{2     ASIFormDataRequest *request = [[ASIFormDataRequest alloc] initWithURL:[NSURL URLWithString:URLPost]];3 4     [request setPostValue:startqi forKey:@"startqi"];5     [request setPostValue:@"20990101001" forKey:@"endqi"];6     [request setPostValue:@"qihao" forKey:@"searchType"];//网页的中的搜索方式7     [request startSynchronous];8 9     NSData* data = [request responseData];
10
11   if (data==nil) {
12     FCLOG(@"has not data");
13   }
14   else{
15     NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
16     NSString *retStr = [[NSString alloc] initWithData:data encoding:enc];
17     FCLOG(@"html = %@",retStr);
18   }
19 }

这样的话,我们就通过了两种方式获取了我们所需要的html

2、分析html

  关于利用正则表达式匹配问题,我又对NSString类扩展了一个方法-(NSMutableArray *)substringByRegular:(NSString *)regular。根据传入的正则表达式,返回所有匹配的数组。

  

 1 @implementation NSString(StringRegular)2 3 4 -(NSMutableArray *)substringByRegular:(NSString *)regular{5 6        NSString * reg=regular;7 8       NSRange r= [self rangeOfString:reg options:NSRegularExpressionSearch];9
10       NSMutableArray *arr=[NSMutableArray array];
11
12       if (r.length != NSNotFound &&r.length != 0) {
13
14       int i=0;
15
16       while (r.length != NSNotFound &&r.length != 0) {
17
18       FCLOG(@"index = %i regIndex = %d loc = %d",(++i),r.length,r.location);
19
20       NSString* substr = [self substringWithRange:r];
21
22       FCLOG(@"substr = %@",substr);
23
24       [arr addObject:substr];
25
26       NSRange startr=NSMakeRange(r.location+r.length, [self length]-r.location-r.length);
27
28       r=[self rangeOfString:reg options:NSRegularExpressionSearch range:startr];
29     }
30   }
31   return arr;
32 }
33 @end

在这种情况下,我们首先我得到我们要获取数据的正则表达式,关于正则表达式这种火星文我就不多说了,我也很纠结,我就不多说了,但是有一点就是,所写的正则表达式一定是我们所需要的数据,并且能够屏蔽无效信息的,有可能在一次匹配中无法获取,可以多次利用正则表达式来分段获取。下面是我的语句,在我的例子中,就是两次利用正则表达式。

NSString *regstr = @"<td class=\'z_bg_05\'>\\w{11}</td><td class=\'z_bg_13\'>(\\w{2}\\s{0,1})*</td>";
NSMutableArray *arr=[strhtml substringByRegular:regstr];

3、分析或利用数据,在这里,我只是利用上一篇博客上所述方法简单的把这些数据保存到了数据库(sqlite3)中。

其实在这个arr数组中一条就是对应我数据库表中的一条记录,但是像td class等这些信息我是不需要的,所以再次利用正则表达式来分析NSString

 1 if (arr!=nil&&[arr count]>0) {2 3       NSString *prereg=@"\\w{11}";4       NSString *backreg=@"(\\w{2}\\s{0,1}){8}";5 6       TicketResultService *service=[[TicketResultService alloc] init];7       [[Sqlite3Helper Instance] openDB];8     for (NSString *sub in arr) {9
10       TicketResult* r=[[[TicketResult alloc] init] autorelease];
11
12       NSMutableArray* prearr=[sub substringByRegular:prereg];
13
14       if (prearr!=nil&&[prearr count]>0) {
15         r.sectionID=(NSString*)[prearr objectAtIndex:0];
16       }
17       else{
18         continue;
19       }
20
21       NSMutableArray *backarr=[sub substringByRegular:backreg];
22       if (backarr!=nil&&[backarr count]>0) {
23       r.result=[backarr objectAtIndex:0];
24       }
25       else{
26         continue;
27       }
28
29       if([service isExist:r.sectionID]){
30         continue;
31       }
32
33     r.type=[NSNumber numberWithInt:1];
34
35     [service addModel:r];
36
37   }
38   [[Sqlite3Helper Instance] closeDB];
39
40   [service release];
41 }

以上爬虫才算正式完成,其实,在此之前还有一个第0步,即判断设备目前的网络状态,如果没有联网的就没有必要去爬虫了,因为你也爬不到任何的数据。判断网络状态我是利用Apple官方的一个例子Reachability,网上也有很多关于这个的例子,我就不再细说了,非常感谢网上的各位大牛们提供的很好的办法,让我能更快的写出这些。

转载于:https://www.cnblogs.com/LifeTechnologySupporter/p/5020055.html

iOS开发——网络使用技术OC篇网络爬虫-使用正则表达式抓取网络数据相关推荐

  1. 网络爬虫-神器fiddler抓取app数据

    才接触爬虫的时候,我们通常使用的是浏览器的开发者工具-F12里的NetWork对网页进行抓包,但是这有一个缺点,就是如果网页加载了很多乱七八糟的东西,比如广告啊,各种各样的js之类的时候,NewWor ...

  2. [Python从零到壹] 四.网络爬虫之入门基础及正则表达式抓取博客案例

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  3. c#使用正则表达式获取TR中的多个TD_[Python从零到壹] 四.网络爬虫之入门基础及正则表达式抓取博客案例...

    首先祝大家中秋节和国庆节快乐,欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都 ...

  4. iOS—网络实用技术OC篇网络爬虫-使用java语言抓取网络数据

    网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一 ...

  5. IOS开发基础之网易新闻环境搭建异步请求json,AFN网络封装第1天

    IOS开发基础之网易新闻环境搭建异步请求json,AFN网络封装第1天 视频资料是2015年的,但是AFN是导入框架的关键文件,我尝试使用cocoapods安装最新的AFN,虽然成功了,但是版本太高, ...

  6. 2020年最佳的5种社交媒体的数据抓取/网络爬虫工具

    2020年最佳的5种社交媒体的数据抓取/网络爬虫工具 查看原文章: 2020年最佳的5种社交媒体的网络爬虫工具 社交媒体数据抓取工具通常是指一种自动化网络爬虫工具,可从社交媒体渠道提取数据.它不仅包括 ...

  7. 抓取网络源码python_python中的复仇者网络抓取实体提取和网络图

    抓取网络源码python 2020 sent more bad news as Black Panther star Chadwick Boseman passed away aged 43. The ...

  8. Python网络爬虫实战:抓取和分析天猫胸罩销售数据

    本文实现一个非常有趣的项目,这个项目是关于胸罩销售数据分析的.Google曾给出了一幅世界女性胸部尺寸分布地图 ,从地图中可以明显看出中国大部分地区呈现绿色(表示平均胸部尺寸为A罩杯),少部分地区呈现 ...

  9. 基于Java的网络爬虫实现抓取网络小说(一)

    基于Java的网络爬虫实现抓取网络小说(一) 今天开始写点东西,一方面加深印象一方面再学习. 网络爬虫(Web crawler),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,它们被广泛用 ...

最新文章

  1. 谷歌无人车十年记:理想背后的骨感现实 | 厚势汽车
  2. 前端开发-4-HTML-tableform表单控制 标签
  3. mqtt协议详解_阿里云物联网平台使用心得(七)MQTT协议14个报文总览
  4. 剑指offer (04):二维数组中的查找 (C++ Python 实现)
  5. Apache发布NetBeans 10.0,增强对JDK 11的支持
  6. 【SLAM笔记】SLAM概述
  7. asp调用数据库汉字显示乱码解决方案
  8. win10下安装Mysql5.7
  9. Deeping_Learning 02
  10. c语言增量pi调节程序,增量式PI控制函数源代码(C语言)
  11. 外文文献找不到怎么办?
  12. python数字类型中包含了哪三种类型_Python数字类型中包含了________、________和_________三种类型。...
  13. 安装QT时遇到:canot start “d:\qt\vcredist\vcredist_x64.exe/norestart/q“:process failed to start :请求的操作需要提升
  14. 用声卡实现的存储示波器
  15. JSP编译指令-page
  16. Android蓝牙开发之一:打开、关闭蓝牙
  17. An internal error occurred during: Add Deployment.
  18. 12306nbsp;售票网站新版验证码识别对抗
  19. C#小游戏——贪吃蛇~详细过程+全部代码
  20. delmia机器人工具_DELMIA机器人仿真教程.ppt

热门文章

  1. 计算机创造奇迹英语作文,高中英语作文模板 第274期:Creating Miracle 创造奇迹
  2. Vue本地图片循环加载显示不出来,vue img标签 :src地址拼接
  3. 短网址缩短和还原综合源码
  4. 免費玩雲端運算,Amazon Web Service 雲端運算平台攻略 【1】
  5. linux VPS上装FTP
  6. Windows7部署WordPress傻瓜式教程-cnblogs
  7. 12种Javascript解决常见浏览器兼容问题的方法
  8. SEO之Google--PageRank优化剖析(二)
  9. Swift与Objective-C的对比
  10. 另外一款超棒的响应式布局jQuery插件 – Freetile.js