Perl - 抓取文学网站文章

There's more than one way to do it!
https://metacpan.org http://perlmonks.org
回复
头像
523066680
Administrator
Administrator
帖子: 573
注册时间: 2016年07月19日 12:14
联系:

Perl - 抓取文学网站文章

帖子 523066680 »

分两步,第一步抓取HTML到本地,第二部提取HTML到明文
=info
523066680/vicyang
2018-10
=cut

use utf8;
use Encode;
use LWP::UserAgent;
use File::Path;
use File::Slurp;
use File::Basename qw/basename/;
use Mojo::DOM;
STDOUT->autoflush(1);

our $wdir = encode('gbk', "D:/temp/力成文学");
mkpath $wdir unless -e $wdir;
our $main = "http://www.ceasm.com";
our $ua = LWP::UserAgent->new( keep_alive => 1, timemout => 8 );
my $res = $ua->get($main);
my $html = $res->content();
my $dom = Mojo::DOM->new($html);

my ($url, $dir, $buff, $item );
my (@sUrl, @sItem, @list, $article);

# 一级栏目
for my $e ( $dom->at(".menu")->find("[target]")->each )
{
$url = $e->attr("href");
$item = $e->text;
printf "%s\n", $e->text;

# 二级栏目
get_subitem( $url, \@sUrl, \@sItem );
for my $id ( 0 .. $#sUrl )
{
printf " %s\n", $sItem[$id];
$dir = "${wdir}/${item}/${sItem[$id]}/";
mkpath $dir unless -e $dir;

# 所有文章链接
@list = list( $main . $sUrl[$id] );
for my $link ( @list )
{
printf " %s\n", $link;
$buff = article($main . $link);
write_file( $dir . basename($link), $buff );
}
}
}

# 二级栏目
sub get_subitem
{
my ( $url, $links, $names ) = @_;
my $res = $ua->get( $url );
$dom = Mojo::DOM->new( $res->content() );
@$links = map { $_->attr("href") } ( $dom->at(".keywords")->find("[target]")->each );
@$names = map { $_->text } ( $dom->at(".keywords")->find("[target]")->each );
}

# 文段列表
sub list
{
my $link = shift;
my $res = $ua->get( $link );
$dom = Mojo::DOM->new( $res->content() );
# 获取最大页面值
$dom->at(".pagelist")->find("a")->last =~ /(\d+)/;
my $max = $1;
my @list;

for my $id ( 1 .. $max )
{
$res = $ua->get( $link ."list${id}.html" );
$dom = Mojo::DOM->new( $res->content() );
push @list, map { $_->attr("href") } $dom->at(".dedelist")->find("h4 [target]")->each;
}

return @list;
}

sub article
{
my $link = shift;
my $res;
do { $res = $ua->get( $link ); } until ( length($res->content) > 2000 );

return $res->content;
}
文章提取以及导出
=info
523066680/vicyang
2018-10
=cut

use utf8;
use Encode;
use File::Slurp;
use LWP::UserAgent;
use Mojo::DOM;
STDOUT->autoflush(1);

our $main = "http://www.ceasm.com";
our $ua = LWP::UserAgent->new( keep_alive => 1, timemout => 8 );
our $wdir = encode('gbk', "D:/Temp/力成文学");
chdir $wdir or warn "$!";

my $buff;
my @files;
my @dirs = `dir "$wdir" /ad /s /b`;
grep { s/\r?\n//; } @dirs;

for my $dir ( @dirs )
{
printf "%s\n", $dir;
chdir $dir or die "$!";
@files = glob "*.html";
next unless $#files >= 0;
$buff = "";
grep { $buff .= article( $_ ) } sort { substr($b, 0, -5) <=> substr($a, 0, -5) } @files;
write_file( "${dir}.txt", $buff );
}

sub article
{
my $file = shift;
my $html = decode('gbk', scalar(read_file( $file )) );
$html =~s/&nbsp;/#CRLF/g;
$html =~s/\n/#CRLF/g; # ------> 1

$dom = Mojo::DOM->new( $html );
my $title = $dom->at("h2")->all_text;
my $text = $dom->at(".text")->all_text;

$text =~s/\s//g; # ------> 2 去掉所有空白符号包括 space tab \r \n 全角空白符
$text =~s/(\d+、)/\n$1/g;
$text =~s/\Q$title\E//;
$text =~s/#CRLF/\n/g;
$text =~s/[\r\n]+/\n/g;
$text =~s/^\n//;

my $str;
#标题
$str = sprintf "%s\n", encode('gbk', $title );
$str .= sprintf "%s\n", $file;
$str .= sprintf "%s\n\n", encode('gbk', $text);
return $str;
}

sub xcode
{
$_[1]='x' if (not defined $_[1]);

for my $v ( split(//,$_[0]) )
{
print sprintf ("%02$_[1] ",ord($v));
}
print "\n\n";
}
zzz19760225
一代宗师
一代宗师
帖子: 930
注册时间: 2017年12月25日 11:12
联系:

Re: Perl - 抓取文学网站文章

帖子 zzz19760225 »

ε=(´ο`*)))唉,只能默默的摸摸代码的头,然后继续该睡觉睡觉。
头像
523066680
Administrator
Administrator
帖子: 573
注册时间: 2016年07月19日 12:14
联系:

Re: Perl - 抓取文学网站文章

帖子 523066680 »

zzz19760225 写了:ε=(´ο`*)))唉,只能默默的摸摸代码的头,然后继续该睡觉睡觉。
哇,论坛挂了两个月,想不到还有人过来光顾,真不容易。

也不知道是不是服务商要搞我,说访问流量超过了,把网站给关了,还建议升级VPS。 明明没多少人访问来着。
zzz19760225
一代宗师
一代宗师
帖子: 930
注册时间: 2017年12月25日 11:12
联系:

Re: Perl - 抓取文学网站文章

帖子 zzz19760225 »

523066680 写了:
哇,论坛挂了两个月,想不到还有人过来光顾,真不容易。

也不知道是不是服务商要搞我,说访问流量超过了,把网站给关了,还建议升级VPS。 明明没多少人访问来着。

专业方向,加上个体兴趣加成,内涵蛮多的。
只是看看,没办法入手,浪费时间,急啊(心里还要不住的说,稳住稳住)!
----------------------------------------------------------
也许那位云流量账号的测试造成的吧,
要不就是杀熟,该宰几只了,放些血,解解渴。
跟百度搞到后面所谓的商业化一样。
头像
523066680
Administrator
Administrator
帖子: 573
注册时间: 2016年07月19日 12:14
联系:

Re: Perl - 抓取文学网站文章

帖子 523066680 »

zzz19760225 写了: 专业方向,加上个体兴趣加成,内涵蛮多的。
只是看看,没办法入手,浪费时间,急啊(心里还要不住的说,稳住稳住)!
----------------------------------------------------------
也许那位云流量账号的测试造成的吧,
要不就是杀熟,该宰几只了,放些血,解解渴。
跟百度搞到后面所谓的商业化一样。
话说你关注/从事哪个方向?
zzz19760225
一代宗师
一代宗师
帖子: 930
注册时间: 2017年12月25日 11:12
联系:

Re: Perl - 抓取文学网站文章

帖子 zzz19760225 »

523066680 写了:
话说你关注/从事哪个方向?
[/quote]

关注:
最好是直接从GB18030汉字标准为计算机指令集的机器硬件制作, (国产开关逻辑门或其他实现可能,保持长期稳定生长)
其次是一个硬件中间过渡的GB18030类汉字标准实现,
最后是底层硬件软件接口部分的实现。
(不知道行业外门外汉的理解表达,这样算表达好了没有)

用这些内容做的小玩具,类似过去的小霸王学习机,做成计算器和手掌机玩,最好能简单联网的增加乐趣。
回复

在线用户

正浏览此版面之用户: 没有注册用户 和 3 访客