在开发项目的过程,很多情况下我们需要利用互联网上的一些数据,在这种情况下,我们可能要写一个爬虫来爬我们所需要的数据。一般情况下都是利用正则表达式来匹配Html,获取我们所需要的数据。一般情况下分以下三步:
1、获取网页的html
2、利用正则表达式,获取我们所需要的数据
3、分析,使用获取到的数据,(例如,保存到数据库)

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

+(NSString*) urlstring:(NSString*)strurl{
    NSURL *url = [NSURL URLWithString:strurl];
    NSData *data = [NSData dataWithContentsOfURL:url];

    NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); 
    NSString *retStr = [[NSString alloc] initWithData:data encoding:enc];

    //NSLog(@" html = %@",retStr);

    return retStr;
  }

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

+(void)getPostResult:(NSString*)startqi{
ASIFormDataRequest *request = [[ASIFormDataRequest alloc] initWithURL:[NSURL URLWithString:URLPost]];
  
[request setPostValue:startqi forKey:@"startqi"];
[request setPostValue:@"20990101001" forKey:@"endqi"];
[request setPostValue:@"qihao" forKey:@"searchType"];//网页的中的搜索方式
[request startSynchronous];

NSData* data = [request responseData];

if (data==nil) {
FCLOG(@"has not data");
}
else{
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); 
NSString *retStr = [[NSString alloc] initWithData:data encoding:enc];
FCLOG(@"html = %@",retStr); 
}
}

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

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

  @implementation NSString(StringRegular)

-(NSMutableArray *)substringByRegular:(NSString *)regular{

NSString * reg=regular;

NSRange r= [self rangeOfString:reg options:NSRegularExpressionSearch];

NSMutableArray *arr=[NSMutableArray array];

if (r.length != NSNotFound &&r.length != 0) {

int i=0;

while (r.length != NSNotFound &&r.length != 0) {

FCLOG(@"index = %i regIndex = %d loc = %d",(++i),r.length,r.location);

NSString* substr = [self substringWithRange:r];

FCLOG(@"substr = %@",substr);

[arr addObject:substr];

NSRange startr=NSMakeRange(r.location+r.length, [self length]-r.location-r.length);

r=[self rangeOfString:reg options:NSRegularExpressionSearch range:startr];
}
}
return arr;
}
@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

if (arr!=nil&&[arr count]>0) {

NSString *prereg=@"\\w{11}";
NSString *backreg=@"(\\w{2}\\s{0,1}){8}";

TicketResultService *service=[[TicketResultService alloc] init];
[[Sqlite3Helper Instance] openDB];
for (NSString *sub in arr) {

TicketResult* r=[[[TicketResult alloc] init] autorelease];

NSMutableArray* prearr=[sub substringByRegular:prereg];

if (prearr!=nil&&[prearr count]>0) {
r.sectionID=(NSString*)[prearr objectAtIndex:0];
}
else{
continue;
}

NSMutableArray *backarr=[sub substringByRegular:backreg];
if (backarr!=nil&&[backarr count]>0) {
r.result=[backarr objectAtIndex:0];
}
else{
continue;
}

if([service isExist:r.sectionID]){
continue;
}

r.type=[NSNumber numberWithInt:1];

[service addModel:r];

}
[[Sqlite3Helper Instance] closeDB];

[service release];
}

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

本博主有mac os用的正则表达式检测工具以及源码(即reginald正则检查工具以及源码),需要的可以给我留言/评论

OC利用正则表达式获取网络资源(网络爬虫)的更多相关文章

  1. Python 利用Python编写简单网络爬虫实例3

    利用Python编写简单网络爬虫实例3 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站“http://bbs.51testing. ...

  2. Python 利用Python编写简单网络爬虫实例2

    利用Python编写简单网络爬虫实例2 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站“http://www.51testing. ...

  3. JAVA基础学习之IP简述使用、反射、正则表达式操作、网络爬虫、可变参数、了解和入门注解的应用、使用Eclipse的Debug功能(7)

    1.IP简述使用//获取本地主机ip地址对象.InetAddress ip = InetAddress.getLocalHost();//获取其他主机的ip地址对象.ip = InetAddress. ...

  4. 【Python开发】【神经网络与深度学习】如何利用Python写简单网络爬虫

    平时没事喜欢看看freebuf的文章,今天在看文章的时候,无线网总是时断时续,于是自己心血来潮就动手写了这个网络爬虫,将页面保存下来方便查看   先分析网站内容,红色部分即是网站文章内容div,可以看 ...

  5. python 利用正则表达式获取IP地址

    例:import retest= '$MYNETACT: 0,1,"10.10.0.9"'pattern =re.compile(r'"(\d+\.\d+\.\d+\.\ ...

  6. Java 中 利用正则表达式 获取 网页图片

    import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.net.URL;i ...

  7. Java中利用正则表达式获取一个网页中的所有邮箱地址

    package cn.tms.ui; import java.io.BufferedReader; import java.io.File; import java.io.FileWriter; im ...

  8. java中利用正则表达式获取a标签

    // 设置新闻内容 notice.setContent(editorValue); Matcher m = Pattern.compile("<a[^>]*>([^< ...

  9. 网络爬虫与web之间的访问授权协议——Robots

    网站的管理者们通常会有这样一种心态:一方面期待百度.Google这样的搜索引擎来抓取网站的内容,另一方面又很厌恶其他来路不明的网络爬虫抓取自己的信息.正是因为这样,才有“好爬虫”.“坏爬虫”这样的说法 ...

随机推荐

  1. python是如何进行内存管理的?

    Python内存管理机制 Python内存管理机制主要包括以下三个方面: 引用计数机制 垃圾回收机制 内存池机制 引用计数 举个例子说明引用是什么: 1 如上为一个简单的赋值语句,1就是对象,a就是引 ...

  2. 如何优雅地使用vim编辑器

    如何优雅地使用vim编辑器大赞..原文链接:http://jackiekuo.com/code/2014/05/07/use-vim-the-pragmatic-way/ 接上篇如何优雅地使用Vim? ...

  3. 数学中的Sin和Cos是什么意思?(转)

    数学中的Sin和Cos是什么意思? 作者:admin 分类:生活随笔 发表于 2012年03月21日 16:48 问:数学中的Sin和Cos是什么意思? 答:sin, cos, tan 都是三角函数, ...

  4. pymongo的一些操作

    参考:http://www.yiibai.com/mongodb/mongodb_drop_collection.html http://www.cnblogs.com/zhouxuchen/p/55 ...

  5. java 获取路径的各种方法

    (1).request.getRealPath("/");//不推荐使用获取工程的根路径 (2).request.getRealPath(request.getRequestURI ...

  6. 【LOJ】 #2130. 「NOI2015」软件包管理器

    题解 连树剖我都写跪一次,我现在怎么那么老年啊= = 简直滚粗预定了啊.. 我们线段树维护树剖只需要资瓷区间覆盖和区间求和就好了 安装的时候看看自己到根有多少包装了,dep减去这个数量就好 卸载的时候 ...

  7. 常用的gnome shell扩展

    usertheme 启用后可自定义shell主题dash-to-dock dock设置unite 将左下角通知栏融入顶部栏(仿unity风格)topicons plus 将左下角通知栏融入顶部栏tas ...

  8. LoadRunner学习笔记log函数

    lr_log_message 只是记会写到本地vuser的log里面. lr_message和lr_output_message基本相同,它们会同时写到vuser的log和发送到controller里 ...

  9. C++后台研发面试总结

    前言: 从中秋到国庆这几天面试了几家公司,有大公司也有小公司,连续几天面试没有系统的整理整理,正好有时间系统的整理一下,好多考点牛客的大佬们都分享过了,虽然每个人的方向不相同,不过多看一些总能找到一些 ...

  10. python中if和elif的区别

    多个if语句是每次单独判断 比如: 例子一: a = 5 if a < 6: #条件1 print(1) if a < 7: #条件2 print(2) else: print(3) 条件 ...