免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 10118 | 回复: 14
打印 上一主题 下一主题

新玩具《JSON》Perl如何抓取数据? [复制链接]

论坛徽章:
3
未羊
日期:2013-11-18 15:17:06酉鸡
日期:2013-12-06 17:07:16天蝎座
日期:2014-06-11 12:37:07
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-10 22:13 |只看该作者 |正序浏览
之前发过一个抓取页面的代码.可是我发现能抓取页面不能抓取json数据,
现在还在研究当中...发出原始的过程.找大伙一块研究研究...之前没玩过这东西..
我还在搜论坛,看有没有前人做过或问过的.在这里mark一下..

请问:如何抓取返回的json数据???。。。。

数据包:
  1. POST /tools/web-sites-on-web-server/php/get-web-sites-on-web-server-json-data.php HTTP/1.1
  2. Host: www.yougetsignal.com
  3. User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:19.0) Gecko/20100101 Firefox/19.0 Iceweasel/19.0.2
  4. Accept: text/javascript, text/html, application/xml, text/xml, */*
  5. Accept-Language: en-US,en;q=0.5
  6. Accept-Encoding: gzip, deflate
  7. X-Requested-With: XMLHttpRequest
  8. X-Prototype-Version: 1.6.0
  9. Content-Type: application/x-www-form-urlencoded; charset=UTF-8
  10. Referer: http://www.yougetsignal.com/tools/web-sites-on-web-server/
  11. Content-Length: 22
  12. Cookie:
  13. Connection: keep-alive
  14. Pragma: no-cache
  15. Cache-Control: no-cache

  16. remoteAddress=sohu.com
复制代码
返回的数据:
  1. HTTP/1.1 200 OK
  2. Date: Wed, 10 Apr 2013 13:48:43 GMT
  3. Server: Apache
  4. Vary: Accept-Encoding
  5. Content-Length: 16773
  6. Keep-Alive: timeout=2, max=100
  7. Connection: Keep-Alive
  8. Content-Type: text/html

  9. {"status":"Success", "resultsMethod":"scrape", "lastScrape":"2013-04-10 06:48:47", "domainCount":"516", "remoteAddress":"sohu.com", "remoteIpAddress":"61.135.181.175", "domainArray":[["029love.sohu.com.cn", ""], ["0755qq.com", ""], ["17173.com", ""], ["17173.net", ""], ["17173.net.cn", ""], ["2004.sohu.com", ""], ["2006.sports.sohu.com", ""], ["2008.sohu.com.cn", ""], ["2008.sohu.comwww.sohu.com.cn", ""], ["2010.s.sohu.com", ""], ["286818458.blog.sohu.com.cn", ""], ["394003276.sohu.com.cn", ""], ["512.sohu.com", ""], ["51center.com", ""], ["55039106.blog.sohu.com.cn", ""], ["60.sohu.com", ""], ["60269.show.sohu.com.cn", ""], ["656979.com", ""], ["8888love-me.blog.sohu.com.cn", ""], ["91hdw.com", ""], ["abcddfe.blog.sohu.com.cn", ""], ["ablum.chinaren.com.cn", ""], ["add.sohu.com", ""], ["ai-weiyang.blog.sohu.com.cn", ""], ["air.sohu.com", ""], ["aiyits.sohu.com.cn", ""], ["akitsuki.blog.sohu.com.cn", ""], ["alooflau.blog.sohu.com.cn", ""], ["alumni.chinaren.com.cn", ""], ["angel.2010.sohu.com", ""], ["apple.sohu.com.cn", ""], ["apple86.blog.sohu.com.cn", ""], ["arcticsnowfanily.blog.sohu.com.cn", ""], ["art.2008.sohu.com", ""], ["art.sohu.com", ""]
复制代码

论坛徽章:
0
15 [报告]
发表于 2014-12-30 22:51 |只看该作者
明天研究下。。。。。。

论坛徽章:
0
14 [报告]
发表于 2013-04-12 22:21 |只看该作者
试了下 LWP 也是可以

  1. #!/usr/bin/env perl
  2. use warnings;
  3. use strict;
  4. use LWP::UserAgent;

  5. my $ua=LWP::UserAgent->new;
  6. $ua->agent('Mozilla/5.0');
  7. $ua->default_header(Referer=>'http://www.yougetsignal.com/tools/web-sites-on-web-server/');
  8. my $res=$ua->post('http://www.yougetsignal.com/tools/web-sites-on-web-server/php/get-web-sites-on-web-server-json-data.php',{remoteAddress => "sina.com",key =>""});
  9. print $res->decoded_content;
复制代码
sinian126 该用户已被删除
13 [报告]
发表于 2013-04-11 09:41 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
3
未羊
日期:2013-11-18 15:17:06酉鸡
日期:2013-12-06 17:07:16天蝎座
日期:2014-06-11 12:37:07
12 [报告]
发表于 2013-04-11 01:10 |只看该作者
回复 11# iakuf


    好的。不过我已经跟踪出源的地址了。。
   
    嘿嘿!不过还是要感谢你。之前也有看过你的blog,以后多交流。。谢谢哈!

论坛徽章:
1
辰龙
日期:2014-05-15 19:37:15
11 [报告]
发表于 2013-04-10 23:47 |只看该作者
回复 8# 墨迹哥
  1. perl -Mojo -E 'say r f("http://www.yougetsignal.com/tools/web-sites-on-web-server/php/get-web-sites-on-web-server-json-data.php" =>  { remoteAddress => "sina.com",key => "" } => {Referer => "http://www.yougetsignal.com/tools/web-sites-on-web-server/"})->json'
复制代码
这个新的单行的中加入了 r 参数会给数据结构 Dump 出来。另外最后面是调用的 json 的解析器。这就是 Mojo 的好处,都自己使用面象对象实现了方法之间相互调用。想看更多例子,可以看我以前发的帐子 http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4074599 和我的网站 http://mojo.php-oa.com/perldoc/ojo
   

论坛徽章:
3
未羊
日期:2013-11-18 15:17:06酉鸡
日期:2013-12-06 17:07:16天蝎座
日期:2014-06-11 12:37:07
10 [报告]
发表于 2013-04-10 23:46 |只看该作者
回复 9# iakuf


    明白了,我知道怎么弄了。。哈哈!谢谢哈!

论坛徽章:
1
辰龙
日期:2014-05-15 19:37:15
9 [报告]
发表于 2013-04-10 23:45 |只看该作者
回复 8# 墨迹哥


  1. perl -Mojo -E 'say f("http://www.yougetsignal.com/tools/web-sites-on-web-server/php/get-web-sites-on-web-server-json-data.php" =>  { remoteAddress => "sina.com",key => "" } => {Referer => "http://www.yougetsignal.com/tools/web-sites-on-web-server/"})->body'
复制代码
使用 ojo 模块和使用 Mojo::UserAgent 模块,都可以很方便的加参数和 Http 的 Header 。

f("http://www.yougetsignal.com/tools/web-sites-on-web-server/php/get-web-sites-on-web-server-json-data.php" =>  { remoteAddress => "sina.com",key => "" } => {Referer => "http://www.yougetsignal.com/tools/web-sites-on-web-server/"})->body

相当于
  1. my $ua = Mojo::UserAgent->new;
  2. say $ua->post_form(
  3.         "http://www.yougetsignal.com/tools/web-sites-on-web-server/php/get-web-sites-on-web-server-json-data.php"  
  4.         =>  {   
  5.             remoteAddress => "sina.com",
  6.             key => ""  
  7.         }   
  8.         => {
  9.             Referer => "http://www.yougetsignal.com/tools/web-sites-on-web-server/"
  10.         })->res->body
复制代码
可以见到,在 Mojo 的函数 new 完后,当调用 POST 时,需要传三个参数,第二个第三个都可以不传,如果传的话,都需要是 hash 的引用。
第一个参数是 URL ,第二个参数是 POST 的键值对,第三个参数是 HTTP 的 header 的键值对。

论坛徽章:
3
未羊
日期:2013-11-18 15:17:06酉鸡
日期:2013-12-06 17:07:16天蝎座
日期:2014-06-11 12:37:07
8 [报告]
发表于 2013-04-10 23:40 |只看该作者
回复 7# iakuf

    这个是ref的地址。。
  1. http://www.yougetsignal.com/tools/web-sites-on-web-server/
复制代码
你说的header抓到的话该怎么操作呢?
   

论坛徽章:
1
辰龙
日期:2014-05-15 19:37:15
7 [报告]
发表于 2013-04-10 23:37 |只看该作者
本帖最后由 iakuf 于 2013-04-10 23:37 编辑

回复 6# 墨迹哥


在测试一下上面那个,之所以得不到结果是因为源站对 referer 做了控制。对于 Perl 来讲,抓这种东西太小意思了。
另外,和 JS 没关系,你直接抓 HTTP 的 header ,不要信别人看 js. 整个互联网的交互都可以通过 HTTP 来搞定。推荐你使用  HttpFox  这个 Firefox 中的插件来看 Header .
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP