• 使用Perl进行网页数据抓取[初学者简明版]


    在工作中,经常需要将网页上的大块大块的标准化的内容下载下来。这个时候,没有什么比编写个脚本更方便的了。

    为什么选择Perl来做,主要还是Perl在文本处理方面有着天然的优势。

    以最近同事让我做的下载加油站网站作为例子,加油站的网址是:http://www.cheduoshao.com/gas/1/,同事想把加油站的名称和地址,下载下来,要一个一个粘贴太没效率了。

    做这个事情的大概顺序是:

    1,Perl

    既然是初学,首先要会用Perl,如果会的话,可以跳过这部分。如果不会也没关系,先安装一下,在网上搜ActivePerl的win32安装包,一路下一步就好了。怎么运行呢,拿记事本写个Perl程序,保存到D盘根目录下,名字是1.pl,内容是:

    #!perl -w
    use strict;
    print "Hello,World!\n";

    然后进CMD,在D:\下,输入1.pl回车,如果不行,就输入perl 1.pl,就能看到我们的HelloWorld了。
    Perl其实挺简单的,下个《Perl语言入门》,作者是Randal L.Scbwartz,把2,3,4,5,8,9章看完就OK了,正则表达式一定要会。

    2,分析网页结构

    在网页中找到最后一页:http://www.cheduoshao.com/gas/1/62.html,这样可以观察到,北京的加油站就是http://www.cheduoshao.com/gas/1/××页.html。所以只要做一次从1-62的遍历,就可以从第一页抓取到第62页了;

    在网页中,选择查看源文件,会发现,其实每一页的加油站的列表,每个加油站对应的源代码都是一样的(废话~),比如这段:

                </script>
                               <ul>
                       <li class="width310">
                        <h1><a href="/gas/details_51812.html" target="_blank">中石化石泉加油站</a></h1>
                        <p>地址:北京市海淀北京市海淀区万柳路南,巴沟路北,圣化寺路口向北</p>
                    </li>
                    <li class="width400"><p></p></li>
                    <li class="width140">

    那正则表达式,提取就好了,表达式是:s#class="width310">.+?href=".+?>(.+?)<.+?p>(.+?)<##xs

    3,编码:

    然后就是源代码了:

    #!perl -w
    use strict;
    use LWP::UserAgent;
    open OUTPUT,'>','weblist.txt' or die 'weblist.txt error!';
    my $get_page = LWP::UserAgent -> new;
    $get_page -> timeout(10);
    my $page_addr = '';
    my $response = '';
    my $content = '';
    my $pro_name = '';
    my $pro_addr = '';
    my $web_list = '';
    &print_list();
    sub print_list{
        foreach (1 .. 10 ){    #
            $page_addr = 'http://www.cheduoshao.com/gas/1_0_null_p'.$_.'.html';#此处是每页的网址
            $response = $get_page -> get( $page_addr );
            $content = $response -> content;
            print $_."done\n";
            $content =~ s#<!DOCTYPE.+?class="jy_6">##xs;
            while ( $content =~ s#class="width310">.+?href=".+?>(.+?)<.+?p>(.+?)<##xs){
                $pro_name = $1;
                $pro_addr = $2;
                print OUTPUT "$pro_name\t$pro_addr\n";
            }
    
        }
    }

    输出的weblist.txt,复制到excel里面,因为每行有\t隔开,所以直接就是表格形式的。

    也有复杂的网页,其实一个道理,我一般是用txt作为中转,先在列表页抓取所有内容页的网址写入txt,再做个程序依次地抓取内容页。

  • 相关阅读:
    PHP MySQL 插入多条数据
    PHP MySQL 插入数据
    PHP MySQL 创建数据表
    PHP MySQL 创建数据库
    PHP 连接 MySQL
    PHP MySQL 简介
    PHP JSON
    12_短信发送器_发送短信实现
    11_短信发送器_快速回复页面实现
    10_短信发送器_获取电话号码
  • 原文地址:https://www.cnblogs.com/zhaofei2013/p/2863494.html
Copyright © 2020-2023  润新知