免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 10112 | 回复: 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", ""]
复制代码

论坛徽章:
3
未羊
日期:2013-11-18 15:17:06酉鸡
日期:2013-12-06 17:07:16天蝎座
日期:2014-06-11 12:37:07
2 [报告]
发表于 2013-04-10 22:23 |只看该作者
翻了下,貌似论坛没有相关的资料。。。我继续gg。。。

论坛徽章:
3
未羊
日期:2013-11-18 15:17:06酉鸡
日期:2013-12-06 17:07:16天蝎座
日期:2014-06-11 12:37:07
3 [报告]
发表于 2013-04-10 22:27 |只看该作者
该地址上,iamlimeng 说,需要分析ajax,然后顺腾模瓜。。可以试试看。。。
http://bbs.chinaunix.net/thread-1819833-1-1.html

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

回复 1# 墨迹哥

  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'
复制代码
因为实现过于简单,所以大家很少讲到这个。。。来测试一下。
   

论坛徽章:
3
未羊
日期:2013-11-18 15:17:06酉鸡
日期:2013-12-06 17:07:16天蝎座
日期:2014-06-11 12:37:07
5 [报告]
发表于 2013-04-10 23:01 |只看该作者
目前找到JS了。。还得研究研究。。。
  1. function reverseIpDomainCheck(remoteAddress) {
  2.         document.getElementById('results').innerHTML = "<p><img src=\"/img/loader.gif\" alt=\"Please wait...\" title=\"Please wait...\" style=\"width: 2.6875em; height: 0.6875em;\" /> Checking "+remoteAddress+". This may take a up to three minutes...</p>"        ;
  3.         ajaxRequest.transport.abort(); // Cancel the previous request
  4.         var url = "/tools/web-sites-on-web-server/php/get-web-sites-on-web-server-json-data.php";
  5.         new Ajax.Request(url, {
  6.                 method: 'post',
  7.                 parameters: {'remoteAddress': remoteAddress, 'key': key},
  8.                 onFailure: function(transport) {
  9.                         document.getElementById('results').innerHTML = "<p><img src=\"/img/flag_red.gif\" alt=\"\" style=\"height: 1em; width: 1em;\" />&nbsp;<span style=\"color: #DF454B;\">Service currently unavailable.</span></p>";
  10.                 },
  11.                 onException: function(transport) {
  12.                         document.getElementById('results').innerHTML = "<p><img src=\"/img/flag_red.gif\" alt=\"\" style=\"height: 1em; width: 1em;\" />&nbsp;<span style=\"color: #DF454B;\">Service currently unavailable.</span></p>";
  13.                 },               
  14.                 onSuccess: function(transport) {
  15.                         reverseIpDomainJsonData = transport.responseText.evalJSON(); // Place the results into JSON
  16.                         if(reverseIpDomainJsonData.status != "Fail" && reverseIpDomainJsonData.domainCount != 0) { // The request was successful
  17.                                 if(reverseIpDomainJsonData.domainCount > 999) {
  18.                                         domainCountText = "over ";
  19.                                 }
  20.                                 else {
  21.                                         domainCountText = "";                                       
  22.                                 }
  23.                                 if(reverseIpDomainJsonData.domainCount == 1) {
  24.                                         domainPluralityText = "domain";
  25.                                 }
  26.                                 else {
  27.                                         domainPluralityText = "domains";                                       
  28.                                 }
  29.                                 if(reverseIpDomainJsonData.remoteAddress != reverseIpDomainJsonData.remoteIpAddress) {
  30.                                         resultsSummaryHTML = "<p style=\"margin-bottom: .5em;\"><img src=\"/img/flag_green.gif\" alt=\"\" style=\"height: 1em; width: 1em;\" />&nbsp;Found "+domainCountText+"<b>"+reverseIpDomainJsonData.domainCount+"</b> "+domainPluralityText+" hosted on the same web server as <a href=\"http://"+remoteAddress+"\" target=\"_blank\">"+reverseIpDomainJsonData.remoteAddress+"</a> ("+reverseIpDomainJsonData.remoteIpAddress+").</p>";
  31.                                 }
  32.                                 else {
  33.                                         resultsSummaryHTML = "<p style=\"margin-bottom: .5em;\"><img src=\"/img/flag_green.gif\" alt=\"\" style=\"height: 1em; width: 1em;\" />&nbsp;Found "+domainCountText+"<b>"+reverseIpDomainJsonData.domainCount+"</b> "+domainPluralityText+" hosted on the same web server as <a href=\"http://"+remoteAddress+"\" target=\"_blank\">"+reverseIpDomainJsonData.remoteAddress+"</a>.</p>";                                       
  34.                                 }
  35.                                 // List all of the domains
  36.                                 profaneDomainExists = false;
  37.                                 resultsHTML = "";
  38.                                 for(i = 0; i < reverseIpDomainJsonData.domainArray.length; i++) {
  39.                                         if(reverseIpDomainJsonData.domainArray[i][1] == 1) { // Check to see if it is a profane domain
  40.                                                 //resultsHTML += "<p style=\"font-size: .8em; float: left; width: 360px;\"><a href=\"http://"+reverseIpDomainJsonData.domainArray[i][0]+"\" target=\"_blank\" style=\"color: #DF454B;\">"+reverseIpDomainJsonData.domainArray[i][0]+"</a> (<a href=\"/tools/web-sites-on-web-server/?remoteAddress="+reverseIpDomainJsonData.domainArray[i][0]+"\">linkback</a>)</p>\n";                                               
  41.                                                 resultsHTML += "<p style=\"font-size: .8em; float: left; width: 360px;\"><a href=\"http://"+reverseIpDomainJsonData.domainArray[i][0]+"\" target=\"_blank\" style=\"color: #DF454B;\">"+reverseIpDomainJsonData.domainArray[i][0]+"</a></p>\n";                                               
  42.                                                 profaneDomainExists = true;
  43.                                         }
  44.                                         else {
  45.                                                 //resultsHTML += "<p style=\"font-size: .8em; float: left; width: 360px;\"><a href=\"http://"+reverseIpDomainJsonData.domainArray[i][0]+"\" target=\"_blank\">"+reverseIpDomainJsonData.domainArray[i][0]+"</a> (<a href=\"/tools/web-sites-on-web-server/?remoteAddress="+reverseIpDomainJsonData.domainArray[i][0]+"\">linkback</a>)</p>\n";
  46.                                                 resultsHTML += "<p style=\"font-size: .8em; float: left; width: 360px;\"><a href=\"http://"+reverseIpDomainJsonData.domainArray[i][0]+"\" target=\"_blank\">"+reverseIpDomainJsonData.domainArray[i][0]+"</a></p>\n";
  47.                                         }
  48.                                 }
  49.                                 if(profaneDomainExists == true) {
  50.                                         resultsSummaryHTML = resultsSummaryHTML + "<p style=\"font-size: .8em; margin-bottom: 1em; border: 1px solid #DF454B; padding: .5em;\">It appears that the web server located at "+reverseIpDomainJsonData.remoteIpAddress+" may be hosting one or more web sites with explicit content. The web sites in question are highlighted in red below. There is a possibility that all of the web sites on this web server may be blocked by web filtering software. Search engine rankings for these web sites may be affected as well.</p>";
  51.                                 }
  52.                                 document.getElementById('results').innerHTML = resultsSummaryHTML + resultsHTML;
  53.                         }
  54.                         else { // There was a problem
  55.                                 document.getElementById('results').innerHTML = "<p><img src=\"/img/flag_red.gif\" alt=\"\" style=\"height: 1em; width: 1em;\" />&nbsp;<span style=\"color: #DF454B;\">" + reverseIpDomainJsonData.message + "</span></p>";
  56.                         }
  57.                 }
  58.         });
  59. }
复制代码

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

貌似有问题。。。。
  1. root@smart:/var/module# 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 => sohu.com })->json'
  2. ojo::f is DEPRECATED in favor of ojo::p at -e line 1
  3. Mojo::UserAgent::build_form_tx is DEPRECATED in favor of Mojo::UserAgent::build_tx at /usr/local/share/perl/5.14.2/ojo.pm line 46
  4. Mojo::UserAgent::Transactor::form is DEPRECATED in favor of Mojo::UserAgent::Transactor::tx at /usr/local/share/perl/5.14.2/Mojo/UserAgent.pm line 66

  5. root@smart:/var/module# perl -Mojo -E 'say n("http://www.yougetsignal.com/tools/web-sites-on-web-server/php/get-web-sites-on-web-server-json-data.php" => { remoteAddress => sohu.com })->json'
  6. ojo::n is DEPRECATED in favor of ojo::p at -e line 1
  7. Mojo::UserAgent::build_json_tx is DEPRECATED in favor of Mojo::UserAgent::build_tx at /usr/local/share/perl/5.14.2/ojo.pm line 50
  8. Mojo::UserAgent::Transactor::json is DEPRECATED in favor of Mojo::UserAgent::Transactor::tx at /usr/local/share/perl/5.14.2/Mojo/UserAgent.pm line 73
复制代码

论坛徽章:
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 .

论坛徽章:
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
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
10 [报告]
发表于 2013-04-10 23:46 |只看该作者
回复 9# iakuf


    明白了,我知道怎么弄了。。哈哈!谢谢哈!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP