python - 用python和/或scrapy抓取ajax网页

标签 python ajax web-scraping scrapy

我想做的o​​jit_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&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>

那么,最好的方法是什么? 我应该去哪里爬取?还是有另一个更适合此的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&amp;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/

相关文章:

python - 离散傅立叶变换的傅立叶级数

ajax - 如果函数已经存在,则防止重新加载 javascript。否则确保同步加载

javascript - 在 laravel 中使用 ajax 自动完成和多功能

html - 从 tiktok 个人资料中抓取所有视频

java - 无法在 Python 3.5 中从 PyQt5 导入 QWebPage

c# - 如何让 C# 中的应用程序从网站收集数据?

python - 从 python 中的另一个文件导入类 - 我知道修复方法,但为什么原始文件不起作用?

python - 如何在交互式 python 环境中导入 Odoo/OpenERP Addon 模块?

Python:具有多个 setup.py 文件的多个包

javascript - 导航时不在导航栏和无框架中显示页面名称