更多>>关于我们

西安鲲之鹏网络信息技术有限公司从2010年开始专注于Web(网站)数据抓取领域。致力于为广大中国客户提供准确、快捷的数据采集相关服务。我们采用分布式系统架构,日采集网页数千万。我们拥有海量稳定高匿HTTP代理IP地址池,可以有效绕过各种反采集策略。

您只需告诉我们您想抓取的网站是什么,您感兴趣的字段有哪些,你需要的数据是哪种格式,我们将为您做所有的工作,最后把数据(或程序)交付给你。

数据的格式可以是CSV、JSON、XML、ACCESS、SQLITE、MSSQL、MYSQL等等。

更多>>官方微博

当前位置: 首页 > 技术文章 >
如何抓取爱帮网加密的电话号码
发布时间:2011-07-09 来源:原创 浏览:

最近有客户咨询能否抓取爱帮网(http://www.aibang.com/)上的数据,主要是因为爱帮网的电话号码是经过加密处理的,常规的方法获取不到真实的电话号码。

打开客户所说的网页,启动Firebug工具,很快就看到了爱帮网数据信息中电话号码的组成,原来是将正常的电话号码拆分成了若干组,每组包含电话号码中的两位数值。只需用Xpath将所有的组合提取出来,然后按顺序组合不就行了嘛。

      然而,很快,问题就出现了。我发现提取出来的电话号码跟网页上显示出来的真实电话号码相去甚远,原本加上长途区号一共是12位的电话号码,抓取的结果却变成了20几位,比如这样了: 02-0-0200-0-20-8120710-2817308113。看来并非如开始时想像的那么简单。
     
      借助于Firebug工具,忽然发现在电话号码的组成部分中,有的分组显示正常,有的分组显示却显示为灰色的,而正是那些显示正常的分组,组合起来才是真正的电话号码。我恍然大悟,原来诀窍在这里呀,电话号码的分组中加入了起干扰作用的分组,难怪取出来的号码里会多出来很多数值呢。那么,去除这些干扰分组,不就能获取到真正的电话号码了吗?!
 
 
      然而,在数据采集的程序中怎样才能区分出哪些分组是正常分组,哪些又是干扰分组呢?这又成一个困惑我的问题。本人功力尚浅,百思不得其解之余,不得不求助于同事了。同事果然是火眼金睛,很快就发现了端倪,原来所有的分组,正常的和干扰的分组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
特别说明:该文章为鲲鹏数据原创文章 ,您除了可以发表评论外,还可以转载到别的网站,但是请保留源地址,谢谢!!(尊重他人劳动,我们共同努力)
☹ Disqus被Qiang了,之前的评论内容都没了。现在改用国产的友言。如果您有爬虫相关技术方面的问题,欢迎发到我们的问答平台:http://spider.site-digger.com/
QQ在线客服
欢迎咨询,点击这里给我发送消息。
欢迎咨询,点击这里给我发送消息。