我想做的ojit_rstrong是在petitions.whitehouse.gov上刮取一份或多份请愿书中的请愿数据-名称,城市,州,日期,签名号-
我假设此时是python的发展之路-可能是scrapy库-以及一些处理网站ajax方面的功能。爬虫的原因是该请愿书数据不公开。
,我是自由职业技术记者,我希望能够将每个请愿书的数据转储到CSV文件中,以便分析每个州签署州请愿书的人数,并使用多个请愿书中的数据查找人数签署多个请愿书等的人,然后就请愿书程序和数据本身的政治可行性得出一些结论。
petitions.whitehouse.gov上的请愿功能作为Drupal模块运行,白宫开发人员在github https://github.com/WhiteHouse/petition/issues/44上回应了我的发布请求,他们正在开发一种API,以允许从该模块访问请愿数据。但是该API没有发布日期。但这不能解决petitions.whitehouse.gov上当前的请愿数据问题。
我已通过电子邮件发送给白宫和白宫开发人员,指出我是自由撰稿人,并要求提供某种访问数据的方法。白宫数字战略办公室告诉我:“很遗憾,目前我们还没有提供数据导出的方法,但我们正在努力通过API开放今后的数据。”
白宫有一项“开放数据”倡议,但显然不包括请愿数据。
隐私和服务条款:签署请愿书时几乎没有隐私。尚无明确的TOS可以解决此数据在Web上的爬取问题。
已完成的操作: UNC的一些教职员工已经编写了(我认为是)Python脚本来抓取数据,但他们不想将脚本发布给我,因为他们仍在研究该脚本。 http://www.unc.edu/~ncaren/secessionists/他们确实向我发送了我特别感兴趣的一份请愿书的CSV数据转储。
我所做的事情:我为此建立了一个github项目,因为我希望任何请愿数据抓取工具都对希望获取此数据的所有人(请愿者本人,记者等)有用。 https://github.com/markratledge/whitehousescraper
我没有python的经验,也没有shell脚本的经验,而我现在想做的事情显然超出了我的经验。
我运行了一个GUI脚本,每隔五秒钟左右向网络浏览器发送一个“空格键”,并通过将浏览器文本剪切并将其粘贴到文本编辑器中,从而刮掉了约10,000个签名。从那里,我可以使用grep和awk将文本处理为CSV格式。当然,这不能很好地工作。 Chrome陷入了页面大小的泥潭,花了几个小时才能获得这么多的签名。
到目前为止,我发现了什么:从我从其他SO问题和答案中可以收集到的信息来看,看起来像Python和草率的http://scrapy.org是避免浏览器出现问题的方法。但是页面使用ajax函数来加载下一组签名。看来这是一个“静态” ajax请求,因为URL不变。
在Firebug中,JSON请求 header 似乎在前面附加了一个随机字符串,并附有页码。这说明需要做什么吗?脚本是否需要模拟并将它们发送到Web服务器?
Request URL:https://petitions.whitehouse.gov/signatures/more/50ab2aa8eab72abc4a000020/2/50b32771ee140f072e000001 Request URL:https://petitions.whitehouse.gov/signatures/more/50ab2aa8eab72abc4a000020/3/50b1040f6ce61c837e000006 Request URL: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&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>
那么,最好的方法是什么? 我应该去哪里爬取?还是有另一个更适合此的python库?
随意发表评论,用代码剪裁向我指出其他SO问题/答案,对github有所贡献。目前,我想做的事情显然超出了我的经验。
最佳答案
“随机链接”看起来像是这样的形式:
https://petitions.whitehouse.gov/signatures/more/ petitionid/pagenum/lastpetition
对于单个请愿书,如果petitionid是静态的,则pagenum每次都会递增,并且每次从请求中返回lastpetition。
我通常的方法是使用请求库来模拟cookie session ,然后计算出浏览器发出的请求。
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&last=50b5a1f9ee140f227a00000b" class="load-next no-follow active" rel="50ae9207eab72aed25000003">Load Next 20 Signatures</a>
关于python - 用python和/或scrapy抓取ajax网页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13587855/