设为首页 收藏本站
查看: 870|回复: 0

[经验分享] 使用Perl进行网页数据抓取[初学者简明版]

[复制链接]

尚未签到

发表于 2015-12-27 03:32:19 | 显示全部楼层 |阅读模式
  在工作中,经常需要将网页上的大块大块的标准化的内容下载下来。这个时候,没有什么比编写个脚本更方便的了。
  为什么选择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,再做个程序依次地抓取内容页。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-156760-1-1.html 上篇帖子: Time::Piece 下篇帖子: Learning Perl 4ed Reading Notes
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表