赞
踩
爬虫框架使用Nutch1.7+Solr4.3+Jsoup1.7.1。
其中,Nutch是一个开源Java 实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬虫。我们主要用它来爬取页面,检索我们用的Solr框架,它的功能比Nutch自带的搜索强大。
Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。
Jsoup是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于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. 用chrome或ie等工具,找到标题、正文、图片、来源和发布时间对应的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. 某些网站发布时间和来源信息可能混在一起,不可能一次拿到,比方“发布时间:2014年05月28日 14:57:38 | 责任编辑: 苏影 | 来源: 新华网 ",需要在regex属性中添加正则表达式分别拿到日期(2014年05月28日 14:57:38)和来源( 新华网)。有样例。
抓取视频的思路:也是依据抓取静态页面的思路,先配置:入口url、url过滤规则、解析规则,把网页源码爬下来,通过解析规则对源码进行解析:标题、内容、视频地址、来源、发布时间等元数据进行解析,并生成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标签的对比:
经过上图的对比发现:
1、object对象是使用js动态加载的,静态页面无法获取,导致无法解析到视频播放地址;
2、就算拿到object对象,其中引用的地址是swf文件,不是真实的视频地址;
经过在网上查找资料:一般的视频网站,object中的地址基本都是swf文件,比如优酷,加载真实的视频播放地址有专门的算法,定期会更新,应该防盗链用的。
参考网站:
http://blog.jobbole.com/77936/
经过一个多星期的研究、网上查阅资料,由于个人技术能力有限,可能无法完成视频抓取入库的功能。在研究的过程中,目前碰到两个不能解决的问题,对于我来讲,也是技术难点:
1、object对象获取问题,如果object对象是通过js动态加载,就无法获取到;
2、如何获取到真实的播放地址问题,大部分视频网站都会使用加密算法,隐藏视频的真实地址,如何解析出来是问题。
虽然研究的过程中碰到了很多以前没有碰到的问题,在一个个解决这些问题的过程中,让我学会了很多,接触到了爬虫技术的原理,以及Nutch、Solr等用法的掌握。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。