使用perl脚本抓取网页总结

使用perl实现网页抓取,对网络蜘蛛的初步尝试。

环境

windows xp,IIS,perl 5.88,CMD

使用到的模块

1
2
3
4
use LWP::Simple; #用来得到网页
use HTML::HeadParser; #对部分进行解析,得到标题、编码、关键词等
use HTML::FormatText::WithLinks; #将html变成文本可读样式
use Encode qw/encode decode/; #解决不同网页的编码问题

需求

在CMD中调试,最后IIS中调用,解析结果要保存到数据库中,数据库中采用utf8编码,解析的网页为gb2312编码,所以理清编码特别重要。

关于编码首先应该弄清楚的概念

  • Perl字符串是使用utf8编码的,也就是说读进perl的字符的编码格式都是utf8;
  • 读取输入时,perl会自动将其转换为urf8,输出时的编码依据运行环境已经上下游环境。

乱码问题

脚本使用ANSI编码,只是数据库的内容使用decode,结果内容有个别字符乱码,HTML::FormatText::WithLinks; 将html变成文本可读样式时出现问题。可以算是一个bug

解决方法

脚本实用utf8编码,得到的网页首先进行decode,再进行其他的处理,问题解决,但在cmd下调试的时候,会有“Wide character in print”警告信息,因为环境是gbk,输出urt8编码是会报警,使用 encode("euc-cn", $value) ,对输出进行转义,可以解决这个问题,而网上说的加 use encoding "utf-8"; 不能解决这个问题。

其他需要注意的问题

调用匹配的内容再去匹配其他内容时,注意对该内容的元字符进行转义;
入库的内容也要进行转义;

遗留问题:IIS对perl的支持,配置没有问题,增加了对.pl、.cgi的定义,测试时发现在IE下正常,在firefox下弹出保存文件的对话框,但是以前的.pl正常。估计于haed的输出有关系,还有待于进一步的测试。

encode、decode函数说明

encode函数 是用来编码Perl字符串的。它将Perl字符串中的字符用指定的编码格式编码,最终转化为字节流的形式,因此和Perl处理环境之外的事物打交道经常需要它。

其格式很简单:

$octets = encode(ENCODING, $string [, CHECK])
$string:  Perl字符串
encoding: 是给定的编码方式
$octets:  是编码之后的字节流
check:   表示转换时如何处理畸变字符(也就是Perl认不出来的字符)。一般不需使用

decode函数 则是用来解码字节流的。它按照你给出的编码格式解释给定的字节流,将其转化为使用utf8编码的Perl字符串,一般来说从终端或者文件取得的文本数据都应该用decode转换为Perl字符串的形式。它的格式为:

$string = decode(ENCODING, $octets [, CHECK])
$string、ENCODING、$octets和CHECK的含义同上。

明白如何使用该函数的例子:

1
2
3
4
5
6
7
use Encode;
$dat="测试文本";
$str=decode("gb2312",$dat);
@chars=split //,$str;
foreach $char (@chars) {
print encode("gb2312",$char),"\n";
}