说明:同事Jamp写的,挺不错的,顶一下。
原文地址:http://www.site-digger.com/html/articles/20110709/15.html
最近有客户咨询能否抓取爱帮网(http://www.aibang.com/)上的数据,主要是因为爱帮网的电话号码是经过加密处理的,常规的方法获取不到真实的电话号码。
打开客户所说的网页,启动Firebug工具,很快就看到了爱帮网数据信息中电话号码的组成,原来是将正常的电话号码拆分成了若干组,每组包含电话号码中的两位数值。只需用Xpath将所有的组合提取出来,然后按顺序组合不就行了嘛。
然而,很快,问题就出现了。我发现提取出来的电话号码跟网页上显示出来的真实电话号码相去甚远,原本加上长途区号一共是12位的电话号码,抓取的结果却变成了20几位,比如这样了: 02-0-0200-0-20-8120710-2817308113。看来并非如开始时想像的那么简单。
借助于Firebug工具,忽然发现在电话号码的组成部分中,有的分组显示正常,有的分组显示却显示为灰色的,而正是那些显示正常的分组,组合起来才是真正的电话号码。我恍然大悟,原来诀窍在这里呀,电话号码的分组中加入了起干扰作用的分组,难怪取出来的号码里会多出来很多数值呢。那么,去除这些干扰分组,不就能获取到真正的电话号码了吗?!
然而,在数据采集的程序中怎样才能区分出哪些分组是正常分组,哪些又是干扰分组呢?这又成一个困惑我的问题。本人功力尚浅,百思不得其解之余,不得不求助于同事(redice)了。同事果然是火眼金睛,很快就发现了端倪,原来所有的分组,正常的和干扰的分组tag名称,都在样式表里记录着呢,就相当于有一个类别选择器,在网页显示内容时就会根据这个选择器自动过滤掉干扰的分组了,所以我们在网页上看到的电话号码就是正常的,但用Xpath提取出来的分组,因为没有过滤,所以就包含了诸多的干扰分组的数据了。
明白了这个原理,再找到样式表中的类别选择记录,在提取到电话号码的分组时加以过滤,去除了干扰分组,很快,真实的电话号码就完全呈现在我的面前了。
下面是部分示例代码:
m = re.compile(r'').search(html) if m: confusion_link = m.groups()[0] #confusion_html = D.get(confusion_link, dl=download.Download.REMOTE) confusion_html = D.get(confusion_link) n = re.compile(r'\{display:inline;\}([^{}]+)\{display:none;\}').search(confusion_html) if not n: n = re.compile(r'/\* - Confusion.css - \*/\s*([^{}]+)\{display:none;\}')\ .search(confusion_html) if n: display_none_str = n.groups()[0] display_none = display_none_str.replace('.', '').split(',') phone = '' phone_span = xpath.get(html, '//span[@class="call_me f_arial"]') span_classes = xpath.search(phone_span, '//span/@class') span_nums = xpath.search(phone_span, '//span') for i in range(0, len(span_classes)): if span_classes[i] not in display_none: phone = phone + span_nums[i] print ‘phone number is: %s ’% phone
呵呵,谢谢
VaTG790i.最好的<a href=http://www.kyfei.com>网站推广软件</a>,
非常好
....................
;ui;普i;uighur;ui;ui;个
在unix网络编程中看到了关于TCP/IP的一些内容,我感觉还是写的不够。正在下载中,一定
下载地址呢