2012-11-27 27 views
6

Những gì tôi muốn làm là trích xuất dữ liệu kiến ​​nghị - Tên, thành phố, tiểu bang, ngày, số chữ ký - từ một hoặc nhiều kiến ​​nghị tại petitions.whitehouse.govCạo trang ajax web với trăn và/hoặc scrapy

Tôi giả định tại điểm này python là con đường để đi - có lẽ là thư viện phế liệu - cùng với một số chức năng để đối phó với các khía cạnh ajax của trang web. Lý do cho scraper này là dữ liệu kiến ​​nghị này không có sẵn cho công chúng.

Tôi là nhà báo công nghệ tự do và tôi muốn có thể phân loại dữ liệu của mỗi kiến ​​nghị thành tệp CSV để phân tích số người từ mỗi tiểu bang ký đơn kiến ​​nghị của tiểu bang và dữ liệu từ nhiều kiến ​​nghị , tìm số người ký nhiều kiến ​​nghị, vv, và sau đó đưa ra một số kết luận về tính khả thi chính trị của quy trình kiến ​​nghị và bản thân dữ liệu.

Các chức năng thỉnh cầu tại các bản kiến ​​nghị.whitehouse.gov chạy như mô-đun Drupal và các nhà phát triển Nhà Trắng đã phản hồi yêu cầu của tôi về github https://github.com/WhiteHouse/petition/issues/44 rằng họ đang làm việc trên API để cho phép truy cập vào dữ liệu kiến ​​nghị từ mô-đun. Nhưng không có ngày phát hành cho API đó; và điều đó không giải quyết được vấn đề của dữ liệu kiến ​​nghị hiện tại trên petitions.whitehouse.gov.

Tôi đã gửi email tới Nhà trắng và Nhà phát triển Nhà trắng, nói rằng tôi là nhà báo tự do và yêu cầu một số cách truy cập dữ liệu. Văn phòng chiến lược kỹ thuật số của Nhà Trắng nói với tôi rằng "Thật không may, chúng tôi không có phương tiện để cung cấp dữ liệu xuất tại thời điểm này, nhưng chúng tôi đang nỗ lực để mở dữ liệu về sau thông qua API". Có một sáng kiến ​​"Dữ liệu mở" tại Nhà Trắng, nhưng dữ liệu kiến ​​nghị rõ ràng không được đề cập đến.

Quyền riêng tư và TOS: Có rất ít sự riêng tư được mong đợi khi ký một bản kiến ​​nghị. Và không có TOS rõ ràng nào đề cập đến việc cào web dữ liệu này.

Điều gì đã được thực hiện: Một số giảng viên tại UNC đã viết (giả sử là) một tập lệnh python để xóa dữ liệu, nhưng họ không muốn phát hành tập lệnh cho tôi, nói rằng họ vẫn đang làm việc nó. http://www.unc.edu/~ncaren/secessionists/ Họ đã gửi cho tôi một bãi chứa dữ liệu CSV của một đơn thỉnh cầu tôi đặc biệt quan tâm đến việc

Những gì tôi đã làm:. tôi đã thiết lập một dự án github cho điều này, bởi vì tôi muốn có bất kỳ dữ liệu scraper kiến ​​nghị được hữu ích cho tất cả mọi người - nguyên đơn, nhà báo, v.v. - những người muốn có thể nhận được dữ liệu này. https://github.com/markratledge/whitehousescraper

Tôi không có kinh nghiệm với python và ít kinh nghiệm với kịch bản shell và những gì tôi đang cố gắng làm rõ ràng là ngoài kinh nghiệm của tôi vào thời điểm này.

Tôi chạy tập lệnh GUI để gửi "phím cách" tới trình duyệt web sau mỗi năm giây, và theo cách đó đã cắt ~ 10.000 chữ ký bằng cách cắt và dán văn bản trình duyệt vào trình soạn thảo văn bản. Từ đó, tôi có thể xử lý văn bản bằng grep và lúng túng thành định dạng CSV. Điều này, tất nhiên, không hoạt động tốt; Chrome bogged xuống với kích thước của trang, và phải mất nhiều giờ để có được nhiều chữ ký.

Những gì tôi đã tìm thấy cho đến nay: từ những gì tôi có thể thu thập từ SO câu hỏi và câu trả lời khác, nó trông giống như Python và scrapy http://scrapy.org là con đường để đi để tránh vấn đề với các trình duyệt.Nhưng trang này sử dụng hàm ajax để tải tập hợp chữ ký tiếp theo. Có vẻ như đây là yêu cầu ajax "tĩnh", vì URL không thay đổi.

Trong Firebug, các tiêu đề yêu cầu JSON dường như có một chuỗi ngẫu nhiên được thêm vào chúng với số trang ngay trước đây. Điều này có nói gì về những gì cần phải làm không? Có một kịch bản cần phải thi đua và gửi chúng đến máy chủ web?

Yêu cầu URL: https: //petitions.whitehouse.gov/signatures/more/50ab2aa8eab72abc4a000020/2/50b32771ee140f072e000001 Yêu cầu URL: https: //petitions.whitehouse.gov/signatures/more/50ab2aa8eab72abc4a000020/ 3/50b1040f6ce61c837e000006 Yêu cầu URL: https: //petitions.whitehouse.gov/signatures/more/50ab2aa8eab72abc4a000020/4/50afb3d7c988d47504000004

Đây là chức năng JS mà tải các chữ ký trên trang:

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

và được kích hoạt khi div này được tiết lộ khi di chuyển đến dưới cùng của cửa sổ trình duyệt:

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

Vì vậy, cách tốt nhất để làm điều này là những gì? Tôi nên đi đâu bằng cặn bã? Hoặc là có một thư viện python phù hợp hơn cho điều này?

Hãy thoải mái nhận xét, hướng tôi theo hướng với các đoạn mã, đến các câu hỏi/câu trả lời khác của SO, đóng góp cho github. Những gì tôi đang cố gắng làm rõ ràng là ngoài kinh nghiệm của tôi vào thời điểm này.

+0

Tôi nghĩ rằng Nó sẽ được khó khăn để viết scrapper mà không Python kinh nghiệm. Bạn có thể yêu cầu trợ giúp tại [Danh sách thư ScraperWiki] (http://groups.google.com/group/scraperwiki). Ngoài ra, ai đó đã bắt đầu làm việc trên [scrapper pettitions] (https://scraperwiki.com/scrapers/state_secession_petition_signatures/) – reclosedev

+0

@reclosedev, cảm ơn những ý tưởng. Tôi đăng trên danh sách đó và nhìn vào scraperwiki, quá. – markratledge

Trả lời

0

Thật khó để mô phỏng đầy đủ Jquery/Javascript bằng Python. You could have a look on spidermonkey hoặc trên các công cụ tự động kiểm tra web như Selenium, có thể tự động hoàn toàn bất kỳ tác vụ trình duyệt nào. câu hỏi trước đây về SO: How can Python work with javascript

+0

Tôi không muốn sử dụng Selenium vì đó là những gì tôi đã thử, tự động hoá một trình duyệt web, bởi vì cửa sổ trình duyệt phát triển đến hàng nghìn trang và treo. – markratledge

1

Các 'liên kết ngẫu nhiên' có vẻ như nó có dạng:

https://petitions.whitehouse.gov/signatures/more/petitionid/pagenum/lastpetition nơi petitionid là tĩnh cho một đơn thỉnh cầu, số tiền pagenum mỗi lần và lần cuối cùng được trả lại mỗi lần từ yêu cầu.

Cách tiếp cận thông thường của tôi là sử dụng thư viện yêu cầu để mô phỏng phiên cho cookie và sau đó tìm hiểu xem yêu cầu trình duyệt đang thực hiện.

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

Tôi muốn đặc biệt chú ý đến đường dẫn sau:

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

Các vấn đề liên quan