2012-11-27 63 views
6

我想要做的是刮请愿的数据 - 在petitions.whitehouse.govPython和/或scrapy刮AJAX网页

从一个或多个请愿 - 名称,城市,州,日期,签名数

我认为python是可行的 - 可能是scrapy库 - 以及一些处理网站ajax方面的功能。这个刮板的原因是,这个请愿数据不对公众开放。

我是一个自由职业者的高科技记者,我希望能够给每个申请的数据转储到一个CSV文件,以便分析的人从各个国家谁签的状态的请愿书的数量,并与多个请愿数据找出签署多份请愿书等的人数,然后就请愿程序和数据本身的政治可行性作出一些结论。

petitions.whitehouse.gov上的请愿函数作为Drupal模块运行,白宫开发者对我在github https://github.com/WhiteHouse/petition/issues/44上的问题请求做出了回应,他们正在开发API以允许从模块访问请求数据。但是该API没有发布日期;这并不能解决目前在petitions.whitehouse.gov上的请愿数据问题。

我通过电子邮件发送白宫和白宫开发商,指出我是一名自由记者并要求以某种方式访问​​数据。数字战略白宫办公室告诉我,“不幸的是,我们目前还没有办法提供数据导出,但我们正在努力通过API开放数据。” 白宫有一个“开放数据”计划,但显然请愿数据没有涵盖。

隐私和服务条款:在签署请愿书时很少隐私。并没有明确的TOS来解决网页抓取这些数据的问题。

已做过的事情: UNC的一些教师已经写了一个python脚本来抓取数据,但他们不想将脚本发布给我,说他们仍在编写脚本它。 http://www.unc.edu/~ncaren/secessionists/他们没有给我一个上访的CSV数据转储我特别感兴趣

我做了什么:我已经设置了这个项目的GitHub的,因为我想要的任何申请资料刮具对每个人都有用 - 请愿者自己,记者等 - 谁想要获得这些数据。 https://github.com/markratledge/whitehousescraper

我没有python的经验,也没有shell脚本的经验,而我正在尝试做的显然超出了我的经验。

我运行了一个GUI脚本,每隔5秒左右向Web浏览器发送一个“空格键”,通过将浏览器文本剪切并粘贴到文本编辑器中,以此方式擦掉〜10,000个签名。从那里,我可以用grep和awk将文本处理成CSV格式。这当然不会工作得很好; Chrome浏览器陷入了页面大小的困境,并且花了数小时才得到那么多的签名。

我到目前为止已经发现:从我可以从其他SO问题和答案收集,它看起来像Python和scrapy http://scrapy.org是去避免浏览器问题的方式。但是页面使用ajax函数来加载下一组签名。看起来这是一个“静态”ajax请求,因为URL不会改变。

在Firebug中,JSON请求标头显示为一个随机字符串,并在其之前添加一个页码。这是否说明了需要做什么?脚本是否需要模拟并将它们发送到Web服务器?

请求 网址:https://petitions.whitehouse.gov/signatures/more/50ab2aa8eab72abc4a000020/2/50b32771ee140f072e000001 请求 网址:https://petitions.whitehouse.gov/signatures/more/50ab2aa8eab72abc4a000020/ 3/50b1040f6ce61c837e000006 请求 网址:https://petitions.whitehouse.gov/signatures/more/50ab2aa8eab72abc4a000020/4/50afb3d7c988d47504000004

这是加载页面上的签名JS功能:

(function ($) { 
Drupal.behaviors.morePetitions = { 
    attach: function(context) { 
    $('.petition-list .show-more-petitions-bar').unbind(); 
    $(".petition-list .show-more-petitions-bar").bind('click', 
     function() { 
     $('.show-more-petitions-bar').addClass('display-none'); 
     $('.loading-more-petitions-bar').removeClass('display-none'); 

     var petition_sort = retrieveSort(); 
     var petition_cols = retrieveCols(); 
     var petition_issues = retrieveIssues(); 
     var petition_search = retrieveSearch(); 
     var petition_page = parseInt($('#page-num').html()); 

     var url = "/petitions/more/"+petition_sort+"/"+(petition_page + 1)+"/"+petition_cols+"/"+petition_issues+"/"+petition_search+"/"; 
     var params = {}; 
     $.getJSON(url, params, function(data) { 
      $('#petition-bars').remove(); 
      $('.loading-more-petitions-bar').addClass('display-none'); 
      $('.show-more-petitions-bar').removeClass('display-none'); 
      $(".petition-list .petitions").append(data.markup).show(); 

      if (typeof wh_petition_adjustHeight == 'function') { 
      wh_petition_adjustHeight(); 
      } 

      Drupal.attachBehaviors('.petition-list .show-more-petitions-bar'); 
      if (typeof wh_petition_page_update_links == 'function') { 
      wh_petition_page_update_links(); 
      } 
     }); 

     return false; 
     } 
    ); 
    } 
} 

和滚动浏览器窗口的底部时,当这个div显露被触发:

<a href="/petition/.../l76dWhwN?page=2&amp;last=50b3d98e7043012b24000011" class="load-next no-follow active" rel="509ec31cadfd958d58000005">Load Next 20 Signatures</a> 
<div id="last-signature-id" class="display-none">50b3d98e7043012b24000011</div> 

那么,什么是做到这一点的最好方法是什么?我在哪里可以去scrapy?还是有另一个更适合这个python库?

随意评论,指向我与代码剪辑的方向,其他SO问题/答案,贡献github。在这一点上,我想要做的显然超出了我的经验。

+0

,我认为这将是很难写刮板没有Python的经验。您可以在[ScraperWiki邮件列表](http://groups.google.com/group/scraperwiki)上寻求帮助。此外,有人已经开始[petititions scrapper](https://scraperwiki.com/scrapers/state_secession_petition_signatures/) – reclosedev

+0

@reclosedev,谢谢你的想法。我张贴在名单上,也看到了scraperwiki。 – markratledge

回答

1

的 '随机链接' 看起来像它的形式是:

https://petitions.whitehouse.gov/signatures/more/petitionid/页次/lastpetition 其中petitionid是静态的单个请求,pagenum每次递增和连续每次从请求返回。

我通常的做法是使用请求库来模拟cookies的会话,然后找出浏览器正在做什么请求。

import requests 
s=requests.session() 
url='http://httpbin.org/get' 
params = {'cat':'Persian', 
      'age':3, 
      'name':'Furball'}    
s.get(url, params=params) 

我会特别注意以下链接:

<a href="/petition/shut-down-tar-sands-project-utah-it-begins-and-reject-keystone-xl-pipeline/H1MQJGMW?page=2&amp;last=50b5a1f9ee140f227a00000b" class="load-next no-follow active" rel="50ae9207eab72aed25000003">Load Next 20 Signatures</a>