perl+HTML::TreeBuilder::XPath+firefox+fire xpath可以快速准确地爬取自己需要的网页数据。

前段时间从一个网站上收集一些信息。上网找了很多方法,不是步骤复杂,就是抓取的内容不够准确。

最后选择了perl+HTML::TreeBuilder::XPath+firefox+fire xpath的方法:

这些工具在linux下安装和使用最是方便。

perl大家都知道是非常好用的脚本语言。
HTML::TreeBuilder是perl的一个模块,主要用来解析HTML或XML的。HTML::TreeBuilder::XPath是里面用来
解析XPath的模块。非常好用。

firefox安装fire bug后是最好的网页调试工具。然后再安装个fire xpath的插件,来方便的生成xpath。

下面一段代码用来抓取本blog上的某篇文章的标题。

#!/bin/perl

use DBI;   #连接数据库
use LWP::UserAgent;   #取网页
use HTML::TreeBuilder::XPath;  #XPath
use Encode;   #处理字符编码
my $agent = new LWP::UserAgent();

my $dbh = DBI->connect("DBI:mysql:database=dbname;host=localhost", "username", "password", {"RaiseError"=>1});

my $request, $response, $document;
$url ="http://blog.notsobad.cn";
$request = new HTTP::Request('GET'=>$url);
$response = $agent->request($request);
$document = encode('utf-8', decode('gb2312', $response->content));
$document = $response->content;
$document =~ s/(  
)|(  
)/\\r\\n/g;
$document =~ s/ / /g;
my $tree = new HTML::TreeBuilder::XPath;
$tree->parse($document);
$tree->eof;
my $prefix = './/*[@id='post-303']/h2/a';  #这里的xpath使用firefox的插件fire xpath生成, fire xpath的使用就很简单了。
my $item = $tree->findnodes($prefix)->get_node(1);
        if ($item) {
            $aff = $dbh->quote($item->as_text());   #防止抓取的内容中有sql特殊符号
        } else {
            $aff = $dbh->quote('');
        }
        my $sql = 'update table set title='.$aff;
        print $sql."\n";
        $dbh->do($sql);
    }
}
$dbh->disconnect();