用oc写爬虫之HTMLParser
最近刚好有一些小需求,就尝试用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的更多相关文章
- 手把手教你用.NET Core写爬虫
写在前面 自从上一个项目58HouseSearch从.NET迁移到.NET core之后,磕磕碰碰磨蹭了一个月才正式上线到新版本. 然后最近又开了个新坑,搞了个Dy2018Crawler用来爬dy20 ...
- 让你从零开始学会写爬虫的5个教程(Python)
写爬虫总是非常吸引IT学习者,毕竟光听起来就很酷炫极客,我也知道很多人学完基础知识之后,第一个项目开发就是自己写一个爬虫玩玩. 其实懂了之后,写个爬虫脚本是很简单的,但是对于新手来说却并不是那么容易. ...
- [Python]新手写爬虫全过程(已完成)
今天早上起来,第一件事情就是理一理今天该做的事情,瞬间get到任务,写一个只用python字符串内建函数的爬虫,定义为v1.0,开发中的版本号定义为v0.x.数据存放?这个是一个练手的玩具,就写在tx ...
- scrapy写爬虫是出现no module named win32api错误
windows下利用scrapy(python2.7)写爬虫,运行 scrapy crawl dmoz 命令时提示:exceptions.ImportError: No module named wi ...
- PHP, Python, Node.js 哪个比较适合写爬虫?
PHP, Python, Node.js 哪个比较适合写爬虫? 1.对页面的解析能力2.对数据库的操作能力(mysql)3.爬取效率4.代码量推荐语言时说明所需类库或者框架,谢谢.比如:python+ ...
- [Python]新手写爬虫全过程(转)
今天早上起来,第一件事情就是理一理今天该做的事情,瞬间get到任务,写一个只用python字符串内建函数的爬虫,定义为v1.0,开发中的版本号定义为v0.x.数据存放?这个是一个练手的玩具,就写在tx ...
- 怎么用Python写爬虫抓取网页数据
机器学习首先面临的一个问题就是准备数据,数据的来源大概有这么几种:公司积累数据,购买,交换,政府机构及企业公开的数据,通过爬虫从网上抓取.本篇介绍怎么写一个爬虫从网上抓取公开的数据. 很多语言都可以写 ...
- python写爬虫时的编码问题解决方案
在使用Python写爬虫的时候,常常会遇到各种令人抓狂的编码错误问题.下面给出一些简单的解决编码错误问题的思路,希望对大家有所帮助. 首先,打开你要爬取的网站,右击查看源码,查看它指定的编码是什么,如 ...
- 用c+libcurl+PCRE写爬虫2--好用的正则表达式
写爬虫最重要的就是正则表达式的处理(爬出来的数据的筛选,清洗,过滤等操作). 通过一篇文章 http://blog.csdn.net/quaful/article/details/6460880 来确 ...
随机推荐
- BOM下的属性和方法---下
继续BOM下的属性和方法---上 代码示例(亲测)2: <title>location对象的属性</title> <script> //服务器环境我再此次演示中 ...
- SqlServer索引碎片
1.产生碎片的操作 通过sys.dm_index_physical_stats来查看,索引上的页不在具有连续性时就会产生碎片,碎片是索引上页拆分的物理结果. (1).插入操作: INSERT操作在聚集 ...
- .Net开发工程师工具箱
Visual Studio Visual Studio Productivity Power tool:Visual Studio专业版(及以上)的扩展,具有丰富的功能,如快速查找,导航解决方案,可搜 ...
- springbank 开发日志 springbank是如何执行一个handler的requestMapping对应的方法的
占位 从dispatcher说起,方法doDispatch(Map request)的参数request是一个通过解析来报报文新城的map //获取HandlerExecutionChain,其中封装 ...
- Storm(三)Storm的原理机制
一.Storm的数据分发策略 1. Shuffle Grouping 随机分组,随机派发stream里面的tuple,保证每个bolt task接收到的tuple数目大致相同. 轮询,平均分配 2. ...
- A. 【UNR #1】争夺圣杯
题解: 一道比较水的题目 按照最一般的思路离散化后枚举最大值 然后考虑最大值的贡献 会发现需要分类讨论一下 发现对一段k的影响是等差数列 所以可以用线段树维护差分数组
- poj2391
链接:http://poj.org/problem?id=2391 题解: 二分答案,变成判定性问题,只需把能经过的边在当前图中联通 另外对牛和牛棚要拆点 代码: #include <cstdi ...
- POJ 2446 Chessboard【二分图最大匹配】
<题目链接> 题目大意: 给你一个n*m的棋盘,其中有k个洞,现在有1*2大小的纸片,纸片不能覆盖洞,并且每个格子最多只能被覆盖一次.问你除了洞口之外这个棋盘是否能被纸片填满. 解题分析: ...
- HDU 1503【LCS】(字符串合并输出)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1503 题目大意: 给两个字符串,组成一个长度尽可能小的字符串,它包含上述两个字符串,且原字符串中的字符 ...
- kali linux系统配置 避免踩坑
使用kali一个多月,重新安装kail也三次了,下面是安装完系统后,做如下系统配置,必须要做的配置,让自己以后不要踩坑. kail更新系统 1.添加更新源,前面已经介绍,不再多说 2获取更新数据,命令 ...