国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > php框架 > 框架设计 > 社会化海量数据采集爬虫框架搭建

社会化海量数据采集爬虫框架搭建

来源:程序员人生   发布时间:2015-01-19 08:23:11 阅读次数:3895次

原文地址: http://www.lanceyan.com/tech/arch/snscrawler.html


随着BIG DATA大数据概念逐步升温,如何搭建1个能够收集海量数据的架构体系摆在大家眼前。如何能够做到所见即所得的无阻止式收集、如何快速把不规则页面结构化并存储、如何满足愈来愈多的数据收集还要在有限时间内收集。这篇文章结合我们本身项目经验谈1下。

我们来看1下作为人是怎样获得网页数据的呢?

1、打开阅读器,输入网址url访问页面内容。
2、复制页面内容的标题、作者、内容。
3、存储到文本文件或excel。

从技术角度来讲全部进程主要为 网络访问、扣取结构化数据、存储。我们看1下用java程序如何来实现这1进程。

import java.io.IOException;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.lang.StringUtils;

public class HttpCrawler {
       public static void main(String[] args) {

            String content = null ;
             try {
                  HttpClient httpClient = new HttpClient();
                   //1、网络要求
                  GetMethod method = new GetMethod("http://www.baidu.com" );
                   int statusCode = httpClient.executeMethod(method);
                   if (statusCode == HttpStatus. SC_OK) {
                        content = method.getResponseBodyAsString();
                         //结构化扣取
                        String title = StringUtils.substringBetween(content, "<title>" , "</title>" );
                         //存储
                        Systemout .println(title);
                  }

            } catch (HttpException e) {
                  e.printStackTrace();
            } catch (IOException e) {
                  e.printStackTrace();
            } finally {
            }
      }
}

通过这个例子,我们看到通过httpclient获得数据,通过字符串操作扣取标题内容,然后通过system.out输出内容。大家是否是感觉做1个爬虫也还是蛮简单呢。这是1个基本的入门例子,我们再详细介绍怎样1步1步构建1个散布式的适用于海量数据收集的爬虫框架。

全部框架应当包括以下部份,资源管理、反监控管理、抓取管理、监控管理。看1下全部框架的架构图:


  • 资源管理指网站分类体系、网站、网站访问url等基本资源的管理保护;
  • 反监控管理指被访问网站(特别是社会化媒体)会制止爬虫访问,怎样让他们不能监控到我们的访问时爬虫软件,这就是反监控机制了;

  • 1个好的收集框架,不管我们的目标数据在哪儿,只要用户能够看到都应当能收集到。所见即所得的无阻止式收集,不管是不是需要登录的数据都能够顺利收集。现在大部份社交网站都需要登录,为了应对登录的网站要有摹拟用户登录的爬虫系统,才能正常获得数据。不过社会化网站都希望自己构成1个闭环,不愿意把数据放到站外,这类系统也不会像新闻等内容那末开放的让人获得。这些社会化网站大部份会采取1些限制避免机器人爬虫系统爬取数据,1般1个账号爬取不了多久就会被检测出来被制止访问了。那是否是我们就不能爬取这些网站的数据呢?肯定不是这样的,只要社会化网站不关闭网页访问,正常人能够访问的数据,我们也能访问。说到底就是摹拟人的正常行动操作,专业1点叫“反监控”。

    那1般网站会有甚么限制呢?

    1定时间内单IP访问次数,没有哪一个人会在1段延续时间内过快访问,除非是随便的点着玩,延续时间也不会太长。可以采取大量不规则代理IP来摹拟。

    1定时间内单账号访问次数,这个同上,正常人不会这么操作。可以采取大量行动正常的账号,行动正常就是普通人怎样在社交网站上操作,如果1个人1天24小时都在访问1个数据接口那就有多是机器人了。

    如果能把账号和IP的访问策略控制好了,基本可以解决这个问题了。固然对方网站也会有运维会调剂策略,说到底这是1个战争,躲在电脑屏幕后的敌我双方,爬虫必须要能感知到对方的反监控策略进行了调剂,通知管理员及时处理。未来比较理想应当是通过机器学习算法自动完成策略调剂,保证抓取不中断。

  • 抓取管理指通过url,结合资源、反监控抓取数据并存储;我们现在大部份爬虫系统,很多都需要自己设定正则表达式,或使用htmlparser、jsoup等软件来硬编码解决结构化抓取的问题。不过大家在做爬虫也会发现,如果爬取1个网站就去开发1个类,在范围小的时候还可以接受,如果需要抓取的网站不计其数,那我们不是要开发成百上千的类。为此我们开发了1个通用的抓取类,可以通过参数驱动内部逻辑调度。比如我们在参数里指定抓取新浪微博,抓取机器就会调度新浪微博网页扣取规则抓取节点数据,调用存储规则存储数据,不管甚么类型最后都调用同1个类来处理。对我们用户只需要设置抓取规则,相应的后续处理就交给抓取平台了。

  • 全部抓取使用了 xpath、正则表达式、消息中间件、多线程调度框架(参考)。xpath 是1种结构化网页元素选择器,支持列表和单节点数据获得,他的好处可以支持规整网页数据抓取。我们使用的是google插件 XPath Helper,这个玩意可以支持在网页点击元素生成xpath,就省去了自己去查找xpath的工夫,也便于未来做到所点即所得的功能。正则表达式补充xpath抓取不到的数据,还可以过滤1些特殊字符。消息中间件,起到抓取任务中间转发的目的,避免抓取和各个需求方耦合。比如各个业务系统都可能抓取数据,只需要向消息中间件发送1个抓取指令,抓取平台抓完了会返回1条消息给消息中间件,业务系统在从消息中间件收到消息反馈,全部抓取完成。多线程调度框架之条件到过,我们的抓取平台不可能在同1时刻只抓1个消息的任务;也不可能无穷制抓取,这样资源会耗尽,致使恶性循环。这就需要使用多线程调度框架来调度多线程任务并行抓取,并且任务的数量,保证资源的消耗正常。

    不管怎样摹拟总还是会有异常的,这就需要有个异常处理模块,有些网站访问1段时间需要输入验证码,如果不处理后续永久返回不了正确数据。我们需要有机制能够处理像验证码这类异常,简单就是有验证码了人为去输入,高级1些可以破解验证码辨认算法实现自动输入验证码的目的。

    扩大1下 :所见即所得我们是否是真的做到?规则配置也是个重复的大任务?重复网页如何不抓取?

    1、有些网站利用js生成网页内容,直接查看源代码是1堆js。 可使用mozilla、webkit等可以解析阅读器的工具包解析js、ajax,不过速度会有点慢。
    2、网页里有1些css隐藏的文字。使用工具包把css隐藏文字去掉。
    3、图片flash信息。 如果是图片中文字辨认,这个比较好处理,能够使用ocr辨认文字就行,如果是flash目前只能存储全部url。
    4、1个网页有多个网页结构。如果只有1套抓取规则肯定不行的,需要多个规则配合抓取。
    5、html不完全,不完全就不能依照正常模式去扣取。这个时候用xpath肯定解析不了,我们可以先用htmlcleaner清洗网页后再解析。
    6、 如果网站多起来,规则配置这个工作量也会非常大。如何帮助系统快速生成规则呢?首先可以配置规则可以通过可视化配置,比如用户在看到的网页想对它抓取数据,只需要拉开插件点击需要的地方,规则就自动生成好了。另在量比较大的时候可视化还是不够的,可以先将类型相同的网站归类,再通过抓取的1些内容聚类,可以统计学、可视化抓取把内容扣取出几个版本给用户去纠正,最后确认的规则就是新网站的规则。这些算法后续再讲。这块再补充1下(多谢zicjin建议)

    背景:如果我们需要抓取的网站很多,那如果靠可视化配置需要耗费大量的人力,这是个本钱。并且这个交给不懂html的业务去配置准确性值得考量,所以最后还是需要技术做很多事情。那我们能否通过技术手段可以帮助生成规则减少人力本钱,或帮助不懂技术的业务准确的把数据扣取下来并大量复制。

    方案:先对网站分类,比如分为新闻、论坛、视频等,这1类网站的网页结构是类似的。在业务打开需要扣取的还没有录入我们规则库的网页时,他先设定这个页面的分类(固然这个也能够机器预先判断,他们来选择,这1步必须要人判断下),有了分类后,我们会通过“统计学、可视化判断”辨认这1分类的字段规则,但是这个是机器辨认的规则,可能不准确,机器辨认完后,还需要人在判断1下。判断完成后,最后构成规则才是新网站的规则

    7、对付重复的网页,如果重复抓取会浪费资源,如果不抓需要1个海量的去重判断缓存。判断抓不抓,抓了后存不存,并且这个缓存需要快速读写。常见的做法有bloomfilter、相似度聚合、分类海明距离判断。

  • 监控管理指不管甚么系统都可能出问题,如果对方服务器宕机、网页改版、更换地址等我们需要第1时间知道,这时候监控系统就起到出现了问题及时发现并通知联系人。

目前这样的框架搭建起来基本可以解决大量的抓取需求了。通过界面可以管理资源、反监控规则、网页扣取规则、消息中间件状态、数据监控图表,并且可以通过后台调剂资源分配并能动态更新保证抓取不断电。不过如果1个任务的处理特别大,可能需要抓取24个小时或几天。比如我们要抓取1条微博的转发,这个转发是30w,那如果每页线性去抓取耗时肯定是非常慢了,如果能把这30w拆分很多小任务,那我们的并行计算能力就会提高很多。不能不提的就是把大型的抓取任务hadoop化,空话不说直接上图:




生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生