最近刚好有一些小需求,就尝试用OC来写一些简单的爬虫抓取网页上的数据;

发现了一个非常好用的HTMLParser工具 ;

语法是OC的,通过分析网页结构:可以很轻松的抓取需要的数据;

但是提前需要了解html标记语言,了解网页结构,需要分析网页源码,标签结构。

这里只是抛砖引玉,提供一个思路,有心的人会有意不到的收获!

使用的类库是:https://github.com/volodg/HTMLParser

1. 如下示例,解析一个列表里面的所有 a 连接

//解析一个列表的页面URL
+ (NSArray *)parseOneListUrl:(NSString *)listUrl
{
NSURL *aurl = [NSURL URLWithString:listUrl]; NSError *per;
HTMLParser *ps = [[HTMLParser alloc]initWithContentsOfURL:aurl error:&per];
if (per) {
NSLog(@"%@",per);
return nil;
} HTMLNode *bodyNode = [ps body];
HTMLNode *fnode = [bodyNode findChildWithAttribute:@"class" matchingName:@"movieList" allowPartial:YES];
NSMutableArray *pgArr = [NSMutableArray arrayWithCapacity:];
NSArray *pgliArr = [fnode findChildTags:@"li"];
for (HTMLNode *linode in pgliArr) {
NSString *pgurl = [[linode findChildTag:@"a"] getAttributeNamed:@"href"];
[pgArr addObject:[NSString stringWithFormat:@"%@%@",SITE_DOMAIN,pgurl]];
} return [NSArray arrayWithArray:pgArr]; }

首先是加载网页数据;

然后分析网页中有个class="movieList" 的div,这里面就是我们要的 a 连接数据

然后 解析这里面的所有 li 标签;

然后解析里面所有的 a 标签;

最后获取 a 标签里面 herf 中的url,这里就是我们要的数据;

2. 再来一个示例,下载一个页面里面指定的所有图片

//解析一个页面的所有图片URL
+ (NSArray *)parseOnePageIMGUrl:(NSString *)pageUrl
{
NSURL *aurl = [NSURL URLWithString:pageUrl]; NSError *per;
HTMLParser *ps = [[HTMLParser alloc]initWithContentsOfURL:aurl error:&per];
if (per) {
NSLog(@"%@",per);
return nil;
} HTMLNode *bodyNode = [ps body];
HTMLNode *fnode = [bodyNode findChildWithAttribute:@"class" matchingName:@"picContent" allowPartial:YES]; NSMutableArray *imgUrlArr = [NSMutableArray arrayWithCapacity:];
NSArray *imgNDArr = [fnode findChildTags:@"img"];
for (HTMLNode *imgNode in imgNDArr) {
[imgUrlArr addObject:[imgNode getAttributeNamed:@"src"]];
} return [NSArray arrayWithArray:imgUrlArr];
}

如上先加载网页数据

然后通过分析网页,发现 class="picContent" 的div 里面是我们需要的所有照片区域;

然后解析div 里面所有的 img标签;

然后解析 img 标签里面的 src 就是图片的下载连接;

最后我们把下载连接放到迅雷,就可以批量下载了;

3. HTMLParser https://github.com/volodg/HTMLParser

用oc写爬虫之HTMLParser的更多相关文章

  1. 手把手教你用.NET Core写爬虫

    写在前面 自从上一个项目58HouseSearch从.NET迁移到.NET core之后,磕磕碰碰磨蹭了一个月才正式上线到新版本. 然后最近又开了个新坑,搞了个Dy2018Crawler用来爬dy20 ...

  2. 让你从零开始学会写爬虫的5个教程(Python)

    写爬虫总是非常吸引IT学习者,毕竟光听起来就很酷炫极客,我也知道很多人学完基础知识之后,第一个项目开发就是自己写一个爬虫玩玩. 其实懂了之后,写个爬虫脚本是很简单的,但是对于新手来说却并不是那么容易. ...

  3. [Python]新手写爬虫全过程(已完成)

    今天早上起来,第一件事情就是理一理今天该做的事情,瞬间get到任务,写一个只用python字符串内建函数的爬虫,定义为v1.0,开发中的版本号定义为v0.x.数据存放?这个是一个练手的玩具,就写在tx ...

  4. scrapy写爬虫是出现no module named win32api错误

    windows下利用scrapy(python2.7)写爬虫,运行 scrapy crawl dmoz 命令时提示:exceptions.ImportError: No module named wi ...

  5. PHP, Python, Node.js 哪个比较适合写爬虫?

    PHP, Python, Node.js 哪个比较适合写爬虫? 1.对页面的解析能力2.对数据库的操作能力(mysql)3.爬取效率4.代码量推荐语言时说明所需类库或者框架,谢谢.比如:python+ ...

  6. [Python]新手写爬虫全过程(转)

    今天早上起来,第一件事情就是理一理今天该做的事情,瞬间get到任务,写一个只用python字符串内建函数的爬虫,定义为v1.0,开发中的版本号定义为v0.x.数据存放?这个是一个练手的玩具,就写在tx ...

  7. 怎么用Python写爬虫抓取网页数据

    机器学习首先面临的一个问题就是准备数据,数据的来源大概有这么几种:公司积累数据,购买,交换,政府机构及企业公开的数据,通过爬虫从网上抓取.本篇介绍怎么写一个爬虫从网上抓取公开的数据. 很多语言都可以写 ...

  8. python写爬虫时的编码问题解决方案

    在使用Python写爬虫的时候,常常会遇到各种令人抓狂的编码错误问题.下面给出一些简单的解决编码错误问题的思路,希望对大家有所帮助. 首先,打开你要爬取的网站,右击查看源码,查看它指定的编码是什么,如 ...

  9. 用c+libcurl+PCRE写爬虫2--好用的正则表达式

    写爬虫最重要的就是正则表达式的处理(爬出来的数据的筛选,清洗,过滤等操作). 通过一篇文章 http://blog.csdn.net/quaful/article/details/6460880 来确 ...

随机推荐

  1. hdu3015树状数组 poj1990的离散化版本

    都是一类题目,推导调试比较烦,想出来还是不难的 /* 给定n个点对,按一维升序排序一次,每个点的序号为Di,按二维升序排序一次,每个点的序号为Hi 求sum{w(i,j)} w(i,j)=abs(Di ...

  2. python 全栈开发,Day131(向app推送消息,玩具端消息推送)

    先下载github代码,下面的操作,都是基于这个版本来的! https://github.com/987334176/Intelligent_toy/archive/v1.4.zip 注意:由于涉及到 ...

  3. HDU 1029 某个数出现的次数大于等于(N+1)/2的是哪个 map水题

    题意:输入n个数 n为奇数 问某个数出现的次数大于等于(N+1)/2的是 哪个 输出来Sample Input51 3 2 3 3111 1 1 1 1 5 5 5 5 5 571 1 1 1 1 1 ...

  4. CS224d 单隐层全连接网络处理英文命名实体识别tensorflow

    什么是NER? 命名实体识别(NER)是指识别文本中具有特定意义的实体,主要包括人名.地名.机构名.专有名词等.命名实体识别是信息提取.问答系统.句法分析.机器翻译等应用领域的重要基础工具,作为结构化 ...

  5. 使用ssh命令进行远程登录

    1.查看SSH客户端版本 有的时候需要确认一下SSH客户端及其相应的版本号.使用ssh -V命令可以得到版本号.需要注意的是,Linux一般自带的是OpenSSH: 下面的例子即表明该系统正在使用Op ...

  6. 1.HTTP协议|web框架

    1.web应用 Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件.应用程序有两种模式C/S.B/S.C/S是客户端 ...

  7. C#介绍

    1.c#与.net框架 c#属于.net框架的一个子集. 2..net框架 3.BCL 基类库 4.编译过程 5.运行过程 6.总结 7.CLR

  8. 007 关于Spark下的第二种模式——standalone搭建

    一:介绍 1.介绍standalone Standalone模式是Spark自身管理资源的一个模式,类似Yarn Yarn的结构: ResourceManager: 负责集群资源的管理 NodeMan ...

  9. Nginx禁止直接通过IP地址访问网站以及限制IP登陆某目录(关闭默认站点或空主机头)

    这篇文章主要介绍了Nginx中禁止使用IP访问网站的配置实例,一般在备案时可能需要这种设置,需要的朋友可以参考下   国内因为备案的原因,所有服务器都要禁止使用IP访问网站.否则,如果允许使用IP访问 ...

  10. CI入门

    CI入门 一.[查]按条件获取一条记录 获取数据有返回数组形式或对象形式,row_array().result_array()是以数组形式返回:row().result()是以对象形式返回.同样的,更 ...