Nutch爬虫爬取视频研究文档


一、爬虫框架说明

爬虫框架使用Nutch1.7+Solr4.3+Jsoup1.7.1

其中,Nutch是一个开源Java 实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬虫。我们主要用它来爬取页面,检索我们用的Solr框架,它的功能比Nutch自带的搜索强大。

Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎

Jsoup是一款Java HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOMCSS以及类似于jQuery的操作方法来取出和操作数据。我们用它解析爬下来的页面。

二、代码说明

入口:org.apache.nutch.crawl.Crawl,策略为daily。即每天只抓取当天的新闻。

      是不是当天新闻,通过当条新闻的发布时间来判断。

html处理代码:JsoupPrase.java是所有html页面抓取的处理类,包括格式解、图片下载

xml生成…都在这个类中。crawlPage是入口方法。Html相关的修改可在此类中寻找入口。

三、新增网站抓取

新增网站需改三个文件:feed.txt regex-urlfilter.txt 和JsoupPraseConfig.xml

(1). feed.txt:增加新网站的入口url

(2). regex-urlfilter.txt:增加url过滤规则。需要查看新增网站多条具体新闻链接,然后写这些链接遵循的正则表达式。可以在网站找到正则表达式的教程;

(3). JsoupPraseConfig.xml : 配置html解析规则。

A. chromeie等工具,找到标题、正文、图片、来源和发布时间对应的html元素,添加到rootselector属性,如果网站某一项内容有多个标签格式,用>>>隔开。

如果有id:使用“元素#id”(如:span#title);

如果没有id:

1)从body开始定位(如:body>table>tbody>tr:eq(0)>td:eq(1)>table:eq(1)>tbody>tr>td>table>tbody>tr:eq(1)>td>div>table>tbody>tr:eq(0)>td>table>tbody>tr ) 。

2)也可从离它最近的有id的元素开始

参考jsoup教程;

B. 同一个网站可能会有多套模板,html元素间用>>>间隔

C. 某些网站发布时间和来源信息可能混在一起,不可能一次拿到,比方“发布时间:20140528日 14:57:38 | 责任编辑苏影 来源: 新华网   ",需要在regex属性中添加正则表达式分别拿到日期(20140528日 14:57:38)和来源( 新华网)。有样例。

四、视频抓取部分研究

抓取视频的思路:也是依据抓取静态页面的思路,先配置:入口urlurl过滤规则、解析规则,把网页源码爬下来,通过解析规则对源码进行解析:标题、内容、视频地址、来源、发布时间等元数据进行解析,并生成xml+附件(视频),通过DirWatch扫描入库,最终达到通过爬虫爬取视频入库的整个过程,这也是研究的目的。

按照上面的思路,以抓取新蓝网综艺页面为例,进行研究:

1、在入口配置文件feed.txt,新增:http://tv.cztv.com/zongyi/

2、在抓取规则配置文件regex-urlfilter.txt中,新增如下两行内容:

+^http://tv.cztv.com/zongyi/

+^http://tv.cztv.com/vplay/[\w]*.html

 

3、在解析规则配置文件JsoupPraseConfig.xml中,新增如下内容:

   <PraseConfig urlName="新蓝网" charset="utf-8" urlReg ="^http://tv.cztv.com/vplay/[\w]*.html">

     <Item>

         <rootselector>title</rootselector>

            <name>标题</name>

            <regex></regex>

            <baseurl></baseurl>

        </Item>

        <Item>

         <rootselector>title</rootselector>

            <name>正文</name>

            <regex></regex>

            <baseurl></baseurl>

        </Item>

         <Item>

         <rootselector>object</rootselector>

            <name>image</name>

            <regex></regex>

            <baseurl></baseurl>

        </Item>

        <Item>

         <rootselector>div#subname>a</rootselector>

            <name>来源</name>

            <regex></regex>

            <baseurl></baseurl>

        </Item>

        <Item>

         <rootselector>div.time</rootselector>

            <name>发布时间</name>

            <regex></regex>

            <baseurl></baseurl>

        </Item>

</PraseConfig>

附:配置解析规则需要根据不同的网页配置不同的模板

4、启动solr服务器

 

    在cmd命令中,跳转到D:\solr-4.10.4\example目录,执行如下命令:

java -jar start.jar

验证solr服务器是否启动成功,在浏览器输入http://localhost:8983/solr/#/,如果看到如下界面,说明solr服务器启动成功。

 

 

5、利用命令脚本启动抓取程序

    跳转到d:\eclipse_workspace\Nutch1.7目录,执行如下命令,即可启动抓取程序:

StartCrawler.bat

 

附:StartCrawler.bat脚本内容如下:

@echo off

setlocal EnableDelayedExpansion

echo "set classpath"

for /r %cd%/lib/ %%i in (*.jar) do (

set CLASSPATH=!CLASSPATH!;%%i

)

set java_home=%JAVA_HOME%

set CLASSPATH = .;%java_home%/lib;%java_home%/lib/tools.jar;

set path=%java_home%/bin;

set CLASSPATH=%cd%/conf;!CLASSPATH!;%cd%/plugins

 

java   -Dfile.encoding=UTF-8 -Xms1000m -Xmx1000m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heapdmp.dmp -XX:+PrintGCDetails -XX:+PrintGCDateStamps -verbose:gc -Xloggc:gc.log org.apache.nutch.crawl.Crawl urls -dir  crawl -solr http://localhost:8983/solr/  -depth 4 -topN 10  

经过一段时间的爬取之后,可通过在solr检索界面查看爬到的网页列表,如下图所示:

 

 

 

到这里,虽然网页列表已经抓取下来,但是解析视频下载地址的问题来了,网页中播放器的object对象获取不到(一般情况下,通过object才能拿到视频的播放地址)。

以下是使用Fierbug工具查看页面加载源码与网页静态源码视频Object标签的对比:

 

 

经过上图的对比发现:

1object对象是使用js动态加载的,静态页面无法获取,导致无法解析到视频播放地址;

     2、就算拿到object对象,其中引用的地址是swf文件,不是真实的视频地址;

经过在网上查找资料:一般的视频网站,object中的地址基本都是swf文件,比如优酷,加载真实的视频播放地址有专门的算法,定期会更新,应该防盗链用的。

参考网站:

http://blog.jobbole.com/77936/

五、视频抓取部分研究结论

经过一个多星期的研究、网上查阅资料,由于个人技术能力有限,可能无法完成视频抓取入库的功能。在研究的过程中,目前碰到两个不能解决的问题,对于我来讲,也是技术难点:

1、object对象获取问题,如果object对象是通过js动态加载,就无法获取到;

2、如何获取到真实的播放地址问题,大部分视频网站都会使用加密算法,隐藏视频的真实地址,如何解析出来是问题。

虽然研究的过程中碰到了很多以前没有碰到的问题,在一个个解决这些问题的过程中,让我学会了很多,接触到了爬虫技术的原理,以及NutchSolr等用法的掌握。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值