免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: yhyhh
打印 上一主题 下一主题

奔溃中,请教一个关于perl脚本模式匹配的问题 [复制链接]

论坛徽章:
0
101 [报告]
发表于 2011-08-08 11:15 |只看该作者
逛街时发现的一根骨头!呵呵!
[转帖] 用Perl抓取ip138获取手机归属地的几个问题
[code]
光头研 ...
tempo8 发表于 2011-08-07 20:28


光头研究生?不解~
topsage论坛连这个都转?既然转的话也要注明出处嘛~

论坛徽章:
0
102 [报告]
发表于 2011-08-08 11:21 |只看该作者
  这个是x9x9 大侠的作品吧,大侠的ID被曝光了。


真正的大侠都去忙着把妹去了,只有小虾在这里做练习。{:3_205:}


查看了hao123这个网页的源代码,其中包含如下这么一段,也就是说,查询实际调用的是网址:, 由该 ...
yhyhh 发表于 2011-08-06 22:21


楼主好像没仔细看我85楼的内容了~

用json的返回数据写了一个,楼主可以试下是否有查询数量限制。
因为返回的json数据很短,用正则也是可以获取,这里还是用了JSON::XS模块进行解析。
  1. use strict;
  2. use warnings;
  3. use LWP::UserAgent;
  4. use Encode;
  5. use JSON::XS;

  6. my $url='http://vip.showji.com/locating/?outfmt=json&m=';

  7. while (<DATA>) {
  8. chomp;
  9. my $link=$url.$_;
  10. my $cont=get_html("$link", "Accept-language" => "zh-cn", 'Accept-Charset' => 'utf-8', );
  11. my $pref=decode_json $cont;
  12. print $pref->{'QueryResult'} eq 'True'?"$_\t@{[T($pref->{'Province'})]} @{[T($pref->{'City'})]}\n":"$_\t无此数据!\n";
  13. }

  14. sub get_html {
  15.   my $browser = LWP::UserAgent->new(  );
  16.   $browser->agent('Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)');
  17.   my $resp = $browser->get(@_);
  18.   return ($resp->content, $resp->status_line, $resp->is_success,$resp) if wantarray;
  19.   return unless $resp->is_success;
  20.   return $resp->content;
  21. }

  22. sub T {
  23. my $text=shift;
  24. return encode('gb2312',$text);
  25. }


  26. __DATA__
  27. 18810340688
  28. 18810040188
  29. 15932344334
  30. 18703883394
  31. 15901055555
  32. 13245875555
复制代码

论坛徽章:
0
103 [报告]
发表于 2011-08-08 12:55 |只看该作者
真正的大侠都去忙着把妹去了,只有小虾在这里做练习。




楼主好像没仔细看我85楼的内 ...
x9x9 发表于 2011-08-08 11:21



    小女子测试过了,测试结果如下:
test_ipcheck_v6.pl:
case01: 给了6个手机号码数据,返回结果正常,手机号码+归属地
case02: 给了另外6个数据,返回结果中第6个数据显示只有归属地,没有号码。
case03: 随意替换这第6个数据,返回结果中始终只显示归属地而不显示号码,像是这个问题一旦出现,不能恢复,哪怕你替换成了别的号码
case04: 不删除第6个数据,增加同一个号码作为第7个数据进行测试,返回结果第6个数据仅仅显示归属地,而第7个数据完整显示:号码+归属地。 需要指出:第6个数据和第7个数据号码完全相同。
case05:删除第6个数据,返回结果正常,手机号码+归属地。
case06:在DATA中加入两个空行,返回结果报错,错误如下:
malformed JSON string, neither array, object, number, string or atom, at character offset 0 ["\x{feff}<!DOCTYPE ht..."]
at C:\Practice\Perl\test_ipcheck_v6.pl line 13, <DATA> line 7.
需要指出:这个应该是我可以避免的,没必要给空数据进行查询的,或者也许我不太清楚DATA应该有的格式,本身它就不允许这样子给空数据。这个姑且不算问题吧。

test_ipcheck_v7.pl:
case01: 给了25个数据,返回结果只包含归属地,只有最后一个查询结果有手机号码。
case02: 给了50个数据,返回结果只包含归属地,只有最后一个查询结果有手机号码。
case03: 给了100个数据,返回结果只包含归属地,只有最后一个查询结果有手机号码。
case04: 给了300个数据,返回结果只包含归属地,只有最后一个查询结果有手机号码。
case05: 给了500个数据,返回结果只包含归属地,只有最后一个查询结果有手机号码。


总结: 一是:会发生无法显示号码,只显示归属地的问题,这个问题较严重了。
          二是:看起来500以内的号码查询,都不会被服务器封杀掉。从原理上深入思考了一下,关于由“http://www.showji.com/”提供的手机号码归属地在线查询系统,互联网茫茫人海中将有多少人在“同一时刻"内进行该项操作,从server那一端是无法预估的,而它作为其他网站可以去调用的通用接口,更需要支持越多客户端连接性能越好,也即同一时刻大基数群查询的即时响应;而ip138网站一样,只是给连接到该网站的用户查询使用,设置了防刷机制。由此看来,两个网站虽然提供的是同一种服务,殊途同归,但从用户体验角度分析,却千差万别,根源是两者在web service这个美丽的外衣之下的底层架构不一样,所应用之技术也不同罢,仅仅猜测,若是不正确,望指正,小女子也学习一下。
           三是: 非常非常之感谢 ”x9x9“ 仁兄,给以耐心,细致,周到的解答,帮助小女子解了燃眉之急,受益匪浅。感谢perl论坛,众坛友积极的捧场,让此贴子未能作”泰坦尼克号”状沉没下去,感谢版主老人家把小女子所回复之内容从屏蔽状态撤出使之又得以重现天光,推进问题解决。如若众位捧场之人来SH,愿请吃饭以致谢意。




C:\Practice\Perl>test_ipcheck_v6.pl
18810340688     北京 北京
18810040188     北京 北京
15932344334     河北 张家口
18703883394     河南 郑州
15901055555     北京 北京
13245875555     江苏 南京

C:\Practice\Perl>test_ipcheck_v6.pl
18810340688     北京 北京
18810040188     北京 北京
15932344334     河北 张家口
18703883394     河南 郑州
15901055555     北京 北京
        黑龙江 伊春
13845875555     黑龙江 伊春


C:\Practice\Perl>test_ipcheck_v6.pl
18810340688     北京 北京
18810040188     北京 北京
15932344334     河北 张家口
18703883394     河南 郑州
15901055555     北京 北京
        黑龙江 伊春
malformed JSON string, neither array, object, number, string or atom, at character offset 0 ["\x{feff}<!DOCTYPE ht..."]
at C:\Practice\Perl\test_ipcheck_v6.pl line 13, <DATA> line 7.

C:\Practice\Perl>

C:\Practice\Perl>test_ipcheck_v7.pl
        江苏 无锡
        江苏 无锡
        江苏 无锡
        江苏 无锡
        江苏 南京
        江苏 南京
        江苏 南京
        江苏 镇江
        江苏 镇江
        河北 邯郸
        河北 石家庄
        河北 保定
        河北 张家口
        河北 邢台
        河北 邢台
        河北 保定
        河北 沧州
        河北 邢台
        河北 邢台
        河北 邯郸
        河北 石家庄
        河北 保定
        河北 保定
        河北 保定
1340025 河北 保定

论坛徽章:
0
104 [报告]
发表于 2011-08-08 13:21 |只看该作者
本帖最后由 x9x9 于 2011-08-08 13:29 编辑
小女子测试过了,测试结果如下:
test_ipcheck_v6.pl:
case01: 给了6个手机号码数据,返回结果 ...
yhyhh 发表于 2011-08-08 12:55


不显示号码可能因为是用$_变量显示号码的,而不是从结果里获取的,想少提取一个变量多少提高点效率。这回改成从返回结果提取了。
至于空行加个判断就可以了。或者如果不是数字也跳到下一行。这个你完全可以自己补充。
既然楼主好人品,还是把改写的贴一下 :)
  1. use strict;
  2. use warnings;
  3. use LWP::UserAgent;
  4. use Encode;
  5. use JSON::XS;

  6. my $url='http://vip.showji.com/locating/?outfmt=json&m=';

  7. while (<DATA>) {

  8. #先对数据进行点预处理

  9. s/\s+//g;  #去除不必要的空格
  10. next if /^$/;  #如果是空行,跳到下一行
  11. next if /[^\d]/; #如果包含非数字,跳到下一行

  12. chomp;
  13. my $link=$url.$_;
  14. my $cont=get_html("$link", "Accept-language" => "zh-cn", 'Accept-Charset' => 'utf-8', );
  15. my $pref=decode_json $cont;
  16. print $pref->{'QueryResult'} eq 'True'?"$pref->{'Mobile'}\t@{[T($pref->{'Province'})]} @{[T($pref->{'City'})]}\n":"$pref->{'Mobile'}\t无此数据!\n";
  17. }

  18. sub get_html {
  19.   my $browser = LWP::UserAgent->new(  );
  20.   $browser->agent('Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)');
  21.   my $resp = $browser->get(@_);
  22.   return ($resp->content, $resp->status_line, $resp->is_success,$resp) if wantarray;
  23.   return unless $resp->is_success;
  24.   return $resp->content;
  25. }

  26. sub T {
  27. my $text=shift;
  28. return encode('gb2312',$text);
  29. }


  30. __DATA__
  31. 18810340688
  32. 18810040188
  33. 15932344334


  34. 18703883394
  35. 15901055555


  36. 13245875555
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
105 [报告]
发表于 2011-08-08 14:19 |只看该作者
能随意变换照片,说明确实乃本人也,没有做狸猫换太子之事,由此也可显示小女子以诚心示人之决心 ...
yhyhh 发表于 2011-08-04 10:02

那得看是随谁的意,如果是自说自话,那找一个套图挨着贴不就完了?

得我说什么,你就帖什么,这样才有难度。

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
106 [报告]
发表于 2011-08-08 21:15 |只看该作者
从请教一个问题到整个作业都写好了

Perl版真是越来越有活力了

论坛徽章:
0
107 [报告]
发表于 2011-08-08 23:39 |只看该作者
本帖最后由 yhyhh 于 2011-08-08 23:57 编辑
不显示号码可能因为是用$_变量显示号码的,而不是从结果里获取的,想少提取一个变量多少提高点效率。这 ...
x9x9 发表于 2011-08-08 13:21


     “x9x9” 兄台鼎立相助他人于困难之际,帮人帮到底,一以贯之,宅心仁厚,德艺双馨,实乃为人之一楷模也,请隔空受小女子鞠躬之礼。

论坛徽章:
0
108 [报告]
发表于 2011-08-08 23:49 |只看该作者
本帖最后由 yhyhh 于 2011-08-08 23:56 编辑
那得看是随谁的意,如果是自说自话,那找一个套图挨着贴不就完了?

得我说什么,你就帖什么,这样才有 ...
flw 发表于 2011-08-08 14:19



    君子坦荡荡,小人常戚戚,若是举着挂羊头之名而行卖狗肉之实,岂非玩弄众坛友于鼓掌之中了?一经查证,一人啐一口水定当可在顷刻之间将小女子淹灭于此,此等鲁莽之事是万般不敢有那个胆子去做的了。二则,版主的地盘小女子可真做不了主啊,否则又要累受被删帖之罪了。小女子来此板块是虚心求教问题,并与诸位共同探讨学习之的,绝无欺世惑众之心,呵呵,不知是否有坛友愿意跳出来,借用时下最流行的一句话为小女子证明一下照片属实:“不管你信不信,我反正是信了。”

论坛徽章:
0
109 [报告]
发表于 2011-08-09 00:14 |只看该作者
从请教一个问题到整个作业都写好了

Perl版真是越来越有活力了
ttcn_cu 发表于 2011-08-08 21:15



    兄台,读书和学习是在别人的思想和知识的帮助下,建立起自己的思想和知识,流水不腐,户枢不蠹,若能嗅到越来越有活力的气息,那亦传递出徘徊此板块之坛友心境愈显年轻的气息,尚且不论生理年龄如何,肉体永远比思想老的快呀。师傅领进门,修行看个人,小女子曾言语在先,希望与perl之缘分,能如细水长流,慢慢学习,慢慢摸索,慢慢总结,慢慢提高,慢慢步入正轨,诸君共勉。

论坛徽章:
0
110 [报告]
发表于 2011-08-09 05:52 |只看该作者
本帖最后由 tempo8 于 2011-08-09 05:59 编辑

一江南才女忽悠一批仙子来啦!
伶牙俐齿,古灵精怪!
还有些许的咄咄逼人!伤不起?
真想不揭,追问不止!

真给我们PERL社区长脸!
“不管你信不信,反正我是信了。”


保持队形!!
[技巧] 使用Perl hash来分析大量数据!
对每周、月对日志进行汇总,统计出按天、接时段(每天24小时)、按地区(省或直辖市)统计出wap和client用户的访问量和用户数(即使多次访问按统计要求算做一次。

还行?还用得上!
若然!放狗搜!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP