使用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,再做个程序依次地抓取内容页。