热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

网络爬虫-使用正则表达式抓取网络数据关于网络数据抓取不仅仅在iOS开发中有,其他开发中也有,也叫网络爬虫,大致分为两种方式实现1:正则表达2:利用其他语言的工具包:ja

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

 

 

关于网络数据抓取不仅仅在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:@"
    (.*?)
"]; 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 = @"\\w{11}(\\w{2}\\s{0,1})*";
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,网上也有很多关于这个的例子,我就不再细说了,非常感谢网上的各位大牛们提供的很好的办法,让我能更快的写出这些。


推荐阅读
  • Postgresql备份和恢复的方法及命令行操作步骤
    本文介绍了使用Postgresql进行备份和恢复的方法及命令行操作步骤。通过使用pg_dump命令进行备份,pg_restore命令进行恢复,并设置-h localhost选项,可以完成数据的备份和恢复操作。此外,本文还提供了参考链接以获取更多详细信息。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 我们有(据我所知)星型模式SQL数据库中的数据文件。该数据库有5个不同的文件,扩展名为 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
  • 本文介绍了一种解析GRE报文长度的方法,通过分析GRE报文头中的标志位来计算报文长度。具体实现步骤包括获取GRE报文头指针、提取标志位、计算报文长度等。该方法可以帮助用户准确地获取GRE报文的长度信息。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 这篇文章主要介绍了Python拼接字符串的七种方式,包括使用%、format()、join()、f-string等方法。每种方法都有其特点和限制,通过本文的介绍可以帮助读者更好地理解和运用字符串拼接的技巧。 ... [详细]
author-avatar
来杯冰柠檬水
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有