你是不是想写个爬虫来抓取点东西,但是你又不会Python
或者别的语言,那么你就得感谢你自己能来到这里。接下来就交给你如何用Objective-C
写一个爬虫。
什么?Objective-C
也能写爬虫?不都是Python
才可以的么?那么我告诉你基本上大部分语言都是可以写爬虫的,只是Python
用来写爬虫比较方便,他有海量的三方库可以让开发者调用而已。而别的语言基本上就是靠自己苦逼的撸了。
那么用Objective-C
写爬虫有什么用?靠iPhone来爬数据么?这里博主只是写个简单的爬虫而已,并不指望用此来专门抓取数据,你觉得让手机去爬数据能爬多少啊。本教程会兼容Mac软件开发,你可以用此技术开发mac爬虫工具。
废话少说,让我们来开始吧!
必备工具
- 链接网络的Mac,
- 浏览器,推荐用Google Chrome
- Xcode开发工具
必备技能
本篇目标
- 抓取回车桌面上的图片
- 附图:
分析网页
用浏览器打开回车桌面,并且按下 option
+ command
+ i
打开开发者工具。
如图:
确保右上方是选中的Elements
选项,下面HTML
就是网页的源代码。鼠标在HTML
上面移动的时候左侧页面会有相应的模块提示,我们以次点开标签,就能找到想要的图片地址:
如图:
粘一段代码:
1 | <img a_width="576" a_height="360" |
上段代码中src
就是网页中的图片地址,我们接下来就是把这个src
的值提取出来。
编码
上面我们分析了网页源码,接下来我们已经知道了大致流程:
- 获取网页源码
- 正则提取
url
好! 让我们来创建一个Objective-C
项目,这里我们主要是来介绍如何写爬虫,至于Objective-C
项目自己创建即可。
初始化
博主这里在主控制器上面添加一个UITextView
,
背景色为黑色;
Tint 颜色为绿色,(这样的颜色看起来比较高大上一点);
不可编辑;
打开超连接功能;
并且连接到所在的控制器。
如图:
创建工具类
创建Spider
类和SpiderOption
类。Spider
是爬虫工具类;SpiderOption
是参数类,在爬数据过程中所需要的参数都由SpiderOption
传递给Spider
SpiderOption.h
1 |
|
Spider.h
1 |
|
Spider.m
1 |
|
测试工具类
经过第二步之后,初步的爬虫工具就可以使用了,下面我们在ViewController.m
里面调用我们的爬虫工具。
ViewController.m
1 |
|
现在来运行一下我们的项目,虽然不会报错,但是并没有开始爬什么数据,接下让我们来完善我们的Spider
工具类。
完善工具类
在我们的Spider.m
里面添加一个方法,来获取网页的HTML
源码:
1 | - (void)loadUrl:(NSString*)urlString{ |
接下来在我们的start
方法调用上述方法:
1 | - (void)start{ |
让我们在运行一次项目,如果网络没有问题的话,我们就能看到控制器上面输出的HTML
源码,尽管我们的textView
还是黑黑的一片。如下图:
正则匹配
我们再次给Spider.m
添加一个方法,这个方法主要就是从HTML
里面提取出我们想要的内容,比如我们的图片,然后回调给控制器:
1 | - (void)matchesStringInHtml:(NSString*)html{ |
方法写好了,我们需要在loadUrl
的completionHandler
调用一下.
1 |
|
还需要给SpiderOption
的pattern
赋值,那我们在ViewController.m
里面添加以下正则即可:
1 |
|
最后,让我们运行以下看效果吧,是不是很简单呀!!!
备注
我们来解释一下正则(?<=(src=\"))https?://.+?.(jpg|png)
表达式的含义:
HTML
中的图片地址可能类似于http://aaa.jpg
、又或者是以https
开头的https://aaa.jpg
,那我们就用https?://aaa.jpg
即可匹配http
也可匹配https
。?
在这里表示前一个字符s
有0个或者1个。
或许网页中的图片不仅仅是.jpg
又或者是.png
、.gif
等等,我们用或|
提取我们想要的格式图片。比如.(jpg|png)
就是我们想取jpg
或者是png
的图片,如果你也想提取.gif
的图片,可以这样写.(jpg|png|gif)
即可。
我们再说说中间的.+?
,.
代表单个字符,比如正则表达式这样写http://..jpg
我们只能提取http://a.jpg
这中间只有单个字符的url
。那如果我们想提取中间个数不确定的呢?比如http://abc.jpg
?我们就在.
后面加个+
即可;+
表示大于等于1个,比如http://.+.jpg
我们既可以匹配到http://a.jpg
也可匹配到http://aaa.jpg
等中间多个字符的url
。
那么后面的?
呢,这里的?
多代表的是非贪婪匹配,举个例子:http://aa.jpg.jpg
像这种url
我们该怎么提取呢,如果按照刚才http://.+.jpg
的表达式匹配出来的是http://aa.jpg.jpg
整个串,但是我们只想提取到http://aa.jpg
怎么办,我们就在+
后面加个?
代表尽可能少的匹配,就是所谓的非贪婪匹配。
最后在说一下(?<=(src=\"))
这个意思就是我们要提取src="
后面的http:xx.jpg
的图片,但是不包含src="
。举个🌰:如果把这个表达式去掉,我们会发现提取到的url
有可能是这样https://www.enterdesk.com/bizhi/5488.html\"><img src=\"https://up.enterdesk.com/edpic_360_360/34/3f/f4/343ff4ada1548da0a81388f86dd9d1af.jpg
,很显然这不是我们想要的结果。所以说这个就是起到了相应的作用。
相关链接: