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();