我的小爬虫—cocoa 中的正则表达式
这两天老大出差,前一阶段的的模块也完成了,各种能改得bug也改了,改不了的,也差不多了 ,所以上班就偷了个小懒。正好我兄弟那傻逼要从网络上整理一份资料,以供158 个公司的资料,分了七个页面。要是用手动copy ,他也没那耐性。自己找了个爬虫,结果电脑中毒了。汗! 于是要我帮他吧那些数据扒下来,我说我试试。其实我心里真心没底。那网络爬虫,我根本就没试过啊。google 了一下,那么多第三方框架,唯独没找到OC 的。造孽啊! 没法子,那就硬着头皮用oc 来搞吧。
第一步,思路分析。这爬虫不就是分析html 源码字符串,提取需要的链接啥。那就把第一级页面源码变成字符串,然后通过正则表达式过滤,找出其中的第二级页面链接。至于翻页链接,就用另一个正则表达式来匹配。到了第二级页面,发现需要的数据,在一个 table 中,并且每个字段都有一个 公共的 ...buyfield = ... 。既然这样,那就在通过正则表达式过滤一次就好了,拿出那些字段,再做个处理,就完了。
第二步,行动受阻。按照之前的思路,我在网上找了一个超级链接的正则表达式,然后用一级页面的网页源码在正则表达测试中,试了一把, 125 个超链接。心里一乐呵,那就是可行了。(我用了一个RegexKitLite 第三方开源框架)当我正式开始编写的时候,遇到问题了-----根本就过滤不出来,通过RegexKitLite 的 componentMathByRegular 方法,匹配出来的从来都是0 个,即使我无限简化了字符串到 一个超链接。郁闷了很久,依然屡试不爽。那就想想另外的办法吧。
第三步,另觅良方。上面的方法行不通,那就换最原始的方法,通过componentSeperateByRegular子字符串分隔父字符串。一分下来,发现变成了78个元素,在通过字符串的 hasprefix 方法,过滤包含需要字段的 功能字符串,就讲下一个页面的文件名过滤出来,最后加上前面相同的url 前缀,整个子级页面的链接,就这样被拼凑起来了。
第四步,举一反三。同样地方法,我将子页面的里需要的字段也全部过滤出来了,这其中包含了很多的条件分支,当然这种条件分支,都是基于子级网页的一些特征的。
最后,反思中成长。这个小爬虫,我用了一个下午和晚上,已经基本成型了,总结下其中的问题,
1.正则表达式,我现在想来,我最开始的思路应该是可行的,至于错误的原因,可能是编码的问题(第二条来讲)。我暂时还没有验证,晚上回去试试,这也是刚刚想到这个可能的原因。
2.网页的编码。我通过cocoa 框架中的方法,通过url 直接拿到网页源码的流数据。然后用utf8 编码,变成字符串。这是个很大的错误。这个网站是国外的,他们用的不是utf8 编码方式,而是用的 iso-8859-1 的编码方式。这是最初的英文编码方式。怎样知道你拿到的网页的编码方式,直接查看网页源码,在http 的头部 会有 charset=iso-8859-1 类似的字段,表明编码方式。
3.我做的这个爬虫效率是很低的,为什么很低,因为都是用分隔成数组,然后遍历元素,在处理。但是,对于一般不用最求高效率,并且你对正则表达式也没那么熟练,使用字符串分割这样的方式,一般情况下,应该是够用的。(排除怕生深度很高的爬虫)。还有一点,我用的是单线程,以至于我请求完158个url 用了我好几分钟。也许这也是可以。
总的来说,这次经历很有意思,其中学到了不少东西,这是很珍贵的,对于一个刚开始从事IT 的瓜娃子来说。
(ps:写下来,给自己mark 一下,记录自己的进步,too much to learn !)