使用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,再做個程序依次地抓取內容頁。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM