用perl写的一个网络爬虫

#!/usr/bin/perl
use warnings;
use strict;
no warnings "recursion";
use XML::Writer;
use LWP::Simple;
use Encode;
local *FILE;
select FILE;
my($xml,@urls,$html,$filename);
foreach('A'..'Z'){
    my @visited;
    $filename="medicine/".$_."-chinese-medicine";
    open(FILE,">$filename") or die "Can't create file :$!/n";
    $xml=new XML::Writer(OUTPUT =>/*FILE,DATA_MODE=>1,DATA_INDENT =>2);
    $xml->xmlDecl('UTF-8','yes');
    $xml->startTag('prescriptions');
    my($next,$nextPage,@items,$item,$category);
    $next=1;
    $nextPage="http://www.zhong-yao.net/zyfj/"."$_/";
    $category=$_;
    while($next){
        $html=get($nextPage);
        $html=encode("UTF-8",$html);
        while($html=~m{"/zyfj/[A-Z]//d+//d+/.html}g){
            $item=$&;
            $item=~s//"//g;
            push @items,$item if not $item~~@items;
        }
        foreach(@items){
            #已访问
            if($_~~@visited){
                ;
            }
            else{
                push @visited,$_;
                my($html,$name,$fun,$source,$items,@items);
                $html=get("http://www.zhong-yao.net/"."$_");
                $html=encode("UTF-8",$html);
                #方名
                $html=~m{<h3><span>.*?</span></p>}s;
                $name=$&;
                $name=~m{<p><span>.*?</span></p>}s;
                $name=$&;
                $name=~s/<//?p>|<//?span>//g;
                #出处
                $html=~m{<h3><span>处方来源.*?</span></p>}s;
                $source=$&;
                $source=~m{<p><span>.*</span></p>}s;
                $source=$&;
                $source=~s/<//?p>|<//?span>|。//g;
                #功能
                $html=~m{(主治|功效)</span>.*?</span></p>}s;
                $fun=$&;
                $fun=~m{<p><span>.*</span></p>}s;
                $fun=$&;
                $fun=~s/<//?p>|<//?span>|。//g;
                #组成成分
                $html=~m{组成</span>.*?</span></p>}s;
                $items=$&;
                $items=~m{<p><span>.*?</span></p>}s;
                $items=$&;
                $items=~s/<.*?>|。|(.*?)//g;
                @items=split(/,|、/,$items);
                $xml->startTag('prescription','name' =>$name,
                            'source' =>$source);
                    $xml->emptyTag('function','value' =>$fun);
                    foreach(@items){
                        my($name,$quantity);
                        $name=$_;
                        $name=~s//d+.*|半.*//g;
                        $quantity=$_;
                        #$quantity=~s/(/D|~半升|~半两)+//;
                        if($_=~m{/d.*}){
                            $quantity=$&;
                        }
                        elsif($_=m{钱半|半钱|半升|半两|半勺}){
                            $quantity=$&;
                        }
                        else{
                            $quantity="";
                        }
                        $xml->emptyTag('item',
                            'name' =>$name,
                            'quantyty' =>$quantity);
                    }
                $xml->endTag('prescription');
            }
        }
        $next=0;
        if($html=~/href.*?下一页</){
            $nextPage=$&;
            $nextPage=~s/.*?/'//;
            $nextPage=~s//'.*//;
            $nextPage="http://www.zhong-yao.net/zyfj/"."$category/"."$nextPage";
            $next=1;
        }
    }
    $xml->endTag('prescriptions');
    $xml->end;
    close(FILE);
}
exit(0);


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值