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&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.
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
@reclosedev, dzięki za pomysły. Umieściłem na tej liście i spojrzałem również na scraperwiki. – markratledge