2012-11-27 15 views
6

Co chcę zrobić jest zeskrobać danych petycji - nazwa, miasto, województwo, data, numer podpis - z jednego lub większej liczby petycji w petitions.whitehouse.govZeskrobać strona internetowa z ajax pytona i/lub scrapy

Zakładam, że w tym miejscu pythona jest droga - prawdopodobnie biblioteka do scrapowania - wraz z niektórymi funkcjami, które radzą sobie z aspektami ajax strony. Powodem tego skrobaka jest to, że dane petycji nie są dostępne publicznie.

Jestem niezależnym tech dziennikarka i chcę, aby być w stanie zrzucić dane każdego petycji do pliku CSV w celu analizy liczby osób z każdego kraju, którzy podpiszą petycję państwem, a także z danych z wielu petycjach , znajdź liczbę osób podpisujących wiele petycji itp., a następnie wyciągnij wnioski na temat politycznej opłacalności procesu składania petycji i samych danych.

Petycja funkcjonuje pod adresem petitions.whitehouse.gov jako moduł Drupala, a deweloperzy z Białego Domu odpowiedzieli na moje pytanie dotyczące github https://github.com/WhiteHouse/petition/issues/44, że pracują nad API umożliwiającym dostęp do danych petycji z modułu. Ale nie ma daty premiery dla tego API; i to nie rozwiązuje problemu z danymi petycji obecnie na petitions.whitehouse.gov.

Wysłałem e-mail do Białego Domu i deweloperów Białego Domu, stwierdzając, że jestem niezależnym dziennikarzem i proszę o jakiś sposób na dostęp do danych. Biuro Cyfrowej Strategii Białego Domu powiedziało mi, że "Niestety, nie mamy obecnie środków do eksportu danych, ale pracujemy nad udostępnieniem danych w przyszłości za pośrednictwem interfejsu API." W Białym Domu istnieje inicjatywa "Otwarte dane", ale dane dotyczące petycji nie są uwzględnione.

Prywatność i TOS: Oczekuje się niewielkiej prywatności przy podpisywaniu petycji. I nie ma wyraźnego TOS, który dotyczy skrobania tych danych przez internet.

Co zostało zrobione: Niektóre Wydziału UNC napisałem (co zakładam jest) skrypt Pythona skrobać dane, ale nie chcą, aby zwolnić skrypt do mnie, mówiąc, że nadal pracują na to. http://www.unc.edu/~ncaren/secessionists/ Oni nie wysłać mi zrzut danych CSV jednej petycji Jestem szczególnie zainteresowany

Co robiłem. mam założyć projekt GitHub na to, bo chcę żadnej skrobak danych petycja być przydatne dla wszystkich - składających petycje, dziennikarzy itp. - którzy chcą mieć możliwość uzyskania tych danych. https://github.com/markratledge/whitehousescraper

Nie mam doświadczenia z pythonem i małym doświadczeniem w pisaniu skryptów powłoki, a to, co próbuję zrobić, jest oczywiście poza moim doświadczeniem w tym momencie.

Uruchomiłem skrypt GUI, aby wysłać "spację" do przeglądarki internetowej co pięć sekund, i w ten sposób zeskrobałem ~ 10 000 podpisów, wycinając i wklejając tekst przeglądarki do edytora tekstowego. Stamtąd mogłem przetworzyć tekst z grep i awk w formacie CSV. To oczywiście nie działa zbyt dobrze; Chrome ugrzęzł wraz z rozmiarem strony, a tworzenie wielu sygnatur zajęło wiele godzin.

Co znalazłem do tej pory: z tego co mogę zebrać od innych SO pytań i odpowiedzi, wygląda na to, Python i scrapy http://scrapy.org jest do zrobienia, aby uniknąć problemów z przeglądarkami.Ale strona używa funkcji ajax do załadowania następnego zestawu sygnatur. Wygląda na to, że jest to "statyczne" żądanie ajaxowe, ponieważ adres URL się nie zmienia.

w Firebug, nagłówki żądania JSON wydają się mieć losowy ciąg dołączone do nich z numerem strony, tuż przed. Czy to coś mówi o tym, co należy zrobić? Czy skrypt musi emulować i wysyłać je na serwer WWW?

Zapytanie URL: https: //petitions.whitehouse.gov/signatures/more/50ab2aa8eab72abc4a000020/2/50b32771ee140f072e000001 Zapytanie URL: https: //petitions.whitehouse.gov/signatures/more/50ab2aa8eab72abc4a000020/ 3/50b1040f6ce61c837e000006 Żądanie URL: https: //petitions.whitehouse.gov/signatures/more/50ab2aa8eab72abc4a000020/4/50afb3d7c988d47504000004

jest to funkcja JS, który ładuje podpisy na stronie:

(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; 
     } 
    ); 
    } 
} 

i że jest zwolniony, gdy ten div objawia się podczas przewijania na dole okna przeglądarki:

<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> 

Więc, co jest najlepszym sposobem, aby to zrobić? Gdzie mam zamiar zrobić scrapy? Czy istnieje inna biblioteka Pythona lepiej nadaje się do tego?

Zapraszam do komentowania, wskaż mnie w kierunku, z kodem nożyce do innych SO pytania/odpowiedzi, przyczyniają się do github. To, co próbuję zrobić, jest oczywiście poza moim doświadczeniem w tym momencie.

+0

myślę Trudno będzie pisać Scrapper bez doświadczenia Pythona. Możesz poprosić o pomoc na [liście mailingowej ScraperWiki] (http://groups.google.com/group/scraperwiki). Również ktoś już rozpoczął pracę nad [pettitions scrapper] (https://scraperwiki.com/scrapers/state_secession_petition_signatures/) – reclosedev

+0

@reclosedev, dzięki za pomysły. Umieściłem na tej liście i spojrzałem również na scraperwiki. – markratledge

Odpowiedz

0

Trudno w pełni emulować Jquery/Javascript z Pythonem. You could have a look on spidermonkey lub na narzędziach do automatyzacji testów internetowych, takich jak Selenium, które mogą w pełni zautomatyzować wszelkie działania przeglądarki. Poprzednie pytanie na SO: How can Python work with javascript

+0

Nie chcę używać Selenium, ponieważ właśnie to próbowałem, automatyzując przeglądarkę internetową, ponieważ okno przeglądarki powiększa się do tysięcy stron i awarii. – markratledge

1

do 'przypadkowy związek' wygląda to ma postać:

https://petitions.whitehouse.gov/signatures/more/petitionid/pagenum/lastpetition gdzie petitionid jest statyczny dla jednego petycja, pagenum przyrostów za każdym razem i lastpetycja jest zwracana za każdym razem od żądania.

My zwykle podejście byłoby użyć biblioteki wnioski o dopuszczenie do emulowania sesji dla plików cookie, a następnie wypracować co żąda przeglądarka robi.

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

Chciałbym zwrócić szczególną uwagę na poniższy link:

<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>

Powiązane problemy