取势 明道 优术

作者为 扶 凯 发表

我们在做各种自动化处理时,常常会希望能更加智能的得到网页中自己想要的元素,最好是象 css 和 div 中的信息来取得,就会更加方便,这个 Web::Scraper 是我用过的几个模块中最方便的,这也是大侠 miyagawa 所写.根据 ChangeLog 最早是 2007 年开发,好象 Web::Scraper 的灵感是来自己 Ruby 的 Scrapi ,它是一个使用 DSL 风格来写的 Scrapper .

在使用 Web::Scraper 的时候,我们需要先有 Xpath 的路程,这个是网页结构解析出来的结构的路径.
如果对 XPath 不了解,看我以前的文章 : XPath 的简单语法介绍. 这个中有 XPath 的简单语法介绍.

怎么样取得 XPath


建议使用Firefox 的 firebug 和这个软件配合是极品.直接使用 firebug 选择要取出的文件的相关的部分点右键,选择"查看元素",在深色选中的部分在次点右键,选择 "复制 XPath". 选择内容->查看元素-> 复制 XPath .

如下,直接在要处理的元素上点右键,选择查看元素.

接着,要 Firebug 出现的界面的元素中选择 复制 XPath.

会得到 XPath 的地址 ,'/html/body/div/div/div[2]/div[3]/div[4]/ul/li[6]/a' 象这种.这样不用我们自己来写网页的 Xpath 的地方了 ,相当的方便.不过有个小细节,好象 scraper 不支持多个 tbody .所以记的要删除.

 

使用 Web::Scraper 的方法

使用 Web::Scraper 前,我们可以直接使用 scraper 的命令行模式,这个超级方便我们来调试,直到我们取出所有我们要的文件内容.

(1. 使用 scraper 进入命令行模式
#scraper Filename or Url‘

下面我直接打开一个在线的网页

#scraper http://icp.valu.cn/piliang/chaxun?domains=php-oa.com
scraper>

(2. 显示当前正在处理的 HTML 本身.
进入后,有几个常用的命令可以使用,比如下面的命令,它会显示下载 or 打开的整个网页的内容,显示 HTML 本身

scraper> s

.....

 

(3. 显示一个 XPath 中的详细内容
在这个命行中,有个 WARN 的方法可以调用.用来显示当前 XPath 中的内容

scraper> process '/html/body/div/div[8]/table/tr[2]/td',WARN;
<td >1</td>
<td >扶凯</td>
<td >个人</td>
<td >渝ICP备10001691号-1</a></td>
<td >扶凯</td>
<td><div><a href="/go/?domain=www.php-oa.com" target="_blank">www.php-oa.com</a></div></td>
<td >2010-01-07</td>
<td ><a href="/details/%d3%e5ICP%b1%b810001691%ba%c5-1" target="_blank">详情</a></td> 

 

(4. 给标签中的内容存到一个变量 key 中
下面的显示,是给内容直接转成 Yaml 的格式显示出来.另外还可以存成一个数组,
主要语法是
process <CSS式 or XPath式>, '保存的变量的名字' => '保存方式';
接着看下面吧

scraper> process '/html/body/div/div[8]/table/tr[2]/td[6]','key' => 'TEXT'
scraper> y
---
key: www.php-oa.com

 

(5. 给标签中的内容存到一个数组中
以数组的方法来取得多个文件直接在变量名后加 [] 就行了,这是这的 td 一定要是在这个下面有多个.本来值是 td[1],td[2] 这种,数组的话,给 XPath 替换成 td.

scraper> process '/html/body/div/div[8]/table/tr[2]/td','key[]' => 'TEXT'
scraper> y
---
key:
- 1
- 扶凯
- 个人
- 渝ICP备10001691号-1
- 扶凯
- www.php-oa.com
- 2010-01-07
- 详情

 

(6. 输出刚才测试的内容成 Perl 文件
这个命令执行最后一个输入成 Perl 文件的形式,c all 会输出所有测试过的内容成一个 Perl 文件

scraper> c
#!/usr/bin/perl
use strict;
use Web::Scraper;
use URI;

my $uri = URI->new("http://icp.valu.cn/piliang/chaxun?domains=php-oa.com");
my $scraper = scraper {
process '/html/body/div/div[8]/table/tr[2]/td[6]','key' => 'TEXT';
};
my $result = $scraper->scrape($uri);

 

 

Web::Scraper 备注

上面的例子中,都有个 TEXT 是指的保存方式' .
process <CSS式 or XPath式>, '保存的变量的名字' => '保存方式';
保存方式的详细方法有如下几种:

TEXT
只有普通的文字,才会放进来,如下所示

'<a href="/go/?domain=www.php-oa.com" target="_blank">www.php-oa.com</a>'

 HTML
整个 html 的内容都会包含进来,象下面这样的输出,会包含有 html 本身的标签. 如下所示

www.php-oa.com

 @ 列表
给内容的部分,以列表的方法来存.

 

来了就留个评论吧! 7个评论



    zhangll 2010年11月30日 的 11:47

    不错,学习,之前练习过一段perl也试着用这个模块抓取数据

    lwp 2012年02月15日 的 15:09

    问下: “scraper 不支持多个 tbody”, 从哪看的,你再自己测下。

    qq 2013年04月11日 的 02:43

    要是需要post的网站怎么办?
    3x

      扶 凯 2013年04月11日 的 03:45

      使用 Mojo::UserAgent 这个模块,我现在不使用这个了。 Mojo 的这个比这个强大太多。

    Rock 2014年01月10日 的 03:12

    “使用 scraper 的命令行模式” 这个是什么程序?