6

私がやりたいことは、petitions.whitehouse.gov にある 1 つまたは複数の請願から、名前、都市、州、日付、署名番号などの請願データを収集することです。

この時点で、サイトの ajax の側面を処理するためのいくつかの関数とともに、Python (おそらくスクレイピー ライブラリ) が進むべき道であると思います。このスクレーパーの理由は、この請願データが一般に公開されていないためです。

私はフリーランスの技術ジャーナリストであり、州の請願書に署名した各州の人数を分析し、複数の請願書のデータを使用して人数を特定するために、各請願書のデータを CSV ファイルにダンプできるようにしたいと考えています。複数の請願書などに署名し、請願プロセスとデータ自体の政治的実行可能性について何らかの結論を下す人。

petitions.whitehouse.gov の嘆願機能は Drupal モジュールとして実行され、ホワイト ハウスの開発者は github https://github.com/WhiteHouse/petition/issues/44での私のイシュー リクエストに応答し、API に取り組んでいます。モジュールから請願データへのアクセスを許可します。ただし、その API のリリース日はありません。そして、それは現在 petitions.whitehouse.gov にある請願データの問題を解決しません。

私はホワイト ハウスとホワイト ハウス開発者に電子メールを送り、私はフリーランスのジャーナリストであり、データにアクセスする方法を求めていることを伝えました。ホワイトハウスのデジタル戦略局は、「残念ながら、現時点ではデータのエクスポートを提供する手段はありませんが、API を介してデータを公開するために取り組んでいます」と語っています。 ホワイトハウスには「オープンデータ」イニシアチブがありますが、どうやら請願データはカバーされていません。

プライバシーと TOS:請願書に署名する際に期待されるプライバシーはほとんどありません。また、このデータの Web スクレイピングに対処する明確な TOS はありません。

何が行われたか: UNC の一部の教員は、データをスクレイピングするための python スクリプトを作成しましたが (私はそう思います)、スクリプトを私に公開したくありません。http://www.unc.edu/~ncaren/secessionists/彼らは、私が特に興味を持っている 1 つの嘆願書の CSV データ ダンプを送ってくれました。

私が行ったこと:このための github プロジェクトをセットアップしました。これは、このデータを取得できるようにしたいすべての人 (請願者自身、ジャーナリストなど) にとって、請願データ スクレーパーが役立つようにしたいからです。https://github.com/markratledge/whitehousescraper

私は Python の経験がなく、シェル スクリプトの経験もほとんどありません。私がやろうとしていることは、現時点では明らかに私の経験を超えています。

約 5 秒ごとに「スペースバー」を Web ブラウザーに送信する GUI スクリプトを実行し、ブラウザーのテキストをカット アンド ペーストしてテキスト エディターに貼り付けることで、約 10,000 の署名を収集しました。そこから、テキストを grep と awk で処理して CSV 形式にすることができました。もちろん、これはあまりうまくいきません。Chrome はページのサイズで動きが取れなくなり、多くの署名を得るのに何時間もかかりました。

私がこれまでに見つけたもの:他の SO の質問と回答から収集できるものから、Python とスクレイピーのように見えますhttp://scrapy.orgは、ブラウザーの問題を回避するための方法です。しかし、ページは ajax 関数を使用して、次の一連の署名を読み込みます。URL が変更されないため、これは「静的」な ajax リクエストのようです。

Firebug では、JSON リクエスト ヘッダーの直前にページ番号が付加されたランダムな文字列が含まれているように見えます。これは、何をする必要があるかについて何か言いますか? スクリプトはこれらをエミュレートして Web サーバーに送信する必要がありますか?

リクエストURL:https://petitions.whitehouse.gov/signatures/more/50ab2aa8eab72abc4a000020/2/50b32771ee140f072e000001 /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 に貢献してください。私がやろうとしていることは、明らかに現時点での私の経験を超えています。

4

2 に答える 2

1

「ランダムリンク」は次の形式のように見えます。

https://petitions.whitehouse.gov/signatures/more/ petitionid / pagenum / lastpetition ここで、petitionidは単一の請願に対して静的であり、pagenumは毎回増分し、lastpetitionはリクエストから毎回返されます。

私の通常のアプローチは、リクエストライブラリを使用してCookieのセッションをエミュレートし、ブラウザが行っているリクエストを計算することです。

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>

于 2012-11-28T10:27:41.627 に答える
0

Jquery/Javascript を Python で完全にエミュレートするのは困難です。 Spidermonkeyや、ブラウザのアクションを完全に自動化できる Selenium などの Web テスト自動化ツールを調べることができます。SO に関する前の質問: Python は JavaScript でどのように動作しますか?

于 2012-11-27T17:38:22.797 に答える