+1 Daumen
869 Aufrufe

Ich habe eine Webseite mit einer Karte, die die Bezirke enthält. Ich kann auf dieser Karte auf die verschiedenen Bezirke klicken und es führt mich zu den Bezirken des Bezirks. Von dieser Karte der Bezirke eines bestimmten Bezirks kann ich das csv herunterladen.

ezgif.com-optimize (1).gif

Ich möchte sie alle haben: Wie kann ich mit einem Skript durch alle Kartenbezirke navigieren?

Ich habe versucht zu sehen, was die Karte getan hat, um die Koordinaten der Polygone zu erhalten, die den Bezirk repräsentieren, aber es scheint ein Bindestrich zu sein, wenn man die Quellseite betrachtet:

    ...
      <script type="text/javascript">
  //<![CDATA[
  window.gon={};gon.is_mobile=false;gon.is_bot=false;gon.is_ie=false;gon.no_data_text="No Data";gon.no_data_color="#CCCCCC";gon.tile_url="https://tile.openstreetmap.org/${z}/${x}/${y}.png";gon.openlayers_img_path="/assets/img/";gon.datatable_i18n_url="";gon.is_voters_list=false;gon.shape_path="/en/json/shape/53148/shape_type/1";gon.children_shapes_path="/en/json/custom_children_shapes/53148/shape_type/3";gon.data_path="/en/json/summary_custom_children_data/53148/shape_type/3/event/2/indicator_type/2?custom_view=true&data_set_id=2&data_type=official";gon.indicator_menu_data_path_summary="/en/json/summary_custom_children_data/53148/shape_type/3/event/2/indicator_type/xxx?custom_view=true&data_set_id=2&data_type=official";gon.indicator_menu_data_path="/en/json/custom_children_data/53148/shape_type/3/event/2/indicator/xxx?custom_view=true&data_set_id=2&data_type=official";gon.summary_view_type_name="summary";gon.indicator_description="District Winners";gon.event_id="2";gon.event_name="2008 Presidential";gon.map_title="Country: Georgia - Districts";gon.parent_shape_id="53148";gon.data_type="official";gon.data_type_live="live";gon.data_set_id="2";gon.data_set_id_most_recent=2;gon.history_url="https://data.electionsportal.ge/en/event_type/1/event/2/shape_type/1/shape/53148/indicator_type/2/view_type/summary/custom_view/true";gon.history_id=2;gon.data_table_path="/en/data_table/event_type/1/event/2/shape/53148/shape_type/1/child_shape_type/3/indicator/null/view_type/summary/summary_view_type/summary/custom_view/true?data_set_id=2&data_type=official&ind_order_explanation=Country%3A+Georgia&indicator_type_id=2";gon.dt_highlight_shape=false;gon.indicator_menu_scale=true;gon.openlayers=true;
  //]]>
  </script>
  ...


So kann ich die Map-Box-Koordinaten beim Eingeben und die Pixelgröße des Fensters nicht erhalten, um eine Transformation der Map-Koordinaten in Pixel auf dem Bildschirm vorzunehmen, um auf die richtigen Stellen auf dem Bildschirm zu klicken.


Wenn Sie in einen der Distrikte gehen und das csv herunterladen, sehen Sie eine E-Mail-Anfrage an https://data.electionsportal.ge/en/download-data.csv mit vielen Formulardaten. Die 3 wichtigsten (dynamischen) sind authenticity_token, shape_id und map_title. Nachdem Sie die Haupt-URL nach jedem Moment der Information durchsucht haben, die diese enthält. Ich stieß auf die URL: https://data.electionsportal.ge/en/json/summary_custom_children_data/53148/shape_type/3/event/2/indicator_type/2?custom_view=true&data_set_id=2&data_type=official, die json-Daten mit der Identifizierung des Formulars und den Namen aller Distrikte hat. Das Authentizitätstoken befindet sich in der Haupt-URL. Während ich durch jeden Bezirk gehe, versuche ich, die Anfrage in der csv-Download-URL zu veröffentlichen und die Daten in einer csv-Datei zu speichern:

import requests
from bs4 import BeautifulSoup

shape_id_json = requests.get(
  'https://data.electionsportal.ge/en/json/summary_custom_children_data/53148/shape_type/3/event/2/indicator_type/2?custom_view=true&data_set_id=2&data_type=official').json()

shape_ids = [district[0]['shape_values']['shape_id'] for district in shape_id_json['shape_data']]
district_names = [district[0]['shape_values']['shape_name'] for district in shape_id_json['shape_data'] if district[0]['shape_values']['shape_name']]

download_link = 'https://data.electionsportal.ge/en/download-data.csv'
with requests.Session() as s:
  s.headers = {'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36', 'cookie': '_Election-Map_session=BAh7B0kiD3Nlc3Npb25faWQGOgZFVEkiJWNhNGIxOGIzYzdlYjNjMzBmNzRmZmRiMzFhNDI5MmRkBjsAVEkiEF9jc3JmX3Rva2VuBjsARkkiMUE3Z3dqS1hWSzJoNmNveTJqbDVsdDJWSk5TUUFqNzh2by93SEpROU1TNEk9BjsARg%3D%3D--9f05799d877f981db5b55af9aae2925344a96323; _ga=GA1.2.1712428967.1570048706; _gid=GA1.2.498996606.1570048706; _gat_gtag_UA_108114441_2=1'}
  main_page = s.get(
      'https://data.electionsportal.ge/en/event_type/1/event/2/shape/53148/shape_type/1?data_type=official')
  soup = BeautifulSoup(main_page.text, 'html.parser')
  token = soup.find('meta', attrs={'name': 'csrf-token'})['content']
  for district_name, shape_id in zip(district_names, shape_ids):
      print(district_name)
      r = s.post(download_link,
                data={'map_title': f'District: {district_name} - Precincts', 'event_name': '2008 Presidential', 'event_id': 2, 'child_shape_type_id': 4, 'shape_type_id': 3, 'authenticity_token': token, 'shape_id': shape_id, 'data_set_id': 2})
      with open(f'csv\\{district_name}.csv', 'wb') as f:
          f.write(r.content)


Aber ich bekomme eine Quellcodedatei anstelle der herunterladbaren Datei:

<!DOCTYPE html>
<html lang="en">
<head itemscope itemtype="http://schema.org/NGO">
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Georgia Election Data</title>



      <!-- for social sites -->
      <meta itemprop="name" content="Tqdjik Receipe Data">
      <meta itemprop="description" content="Tqdjik Receipe Data brings to you the results of each receipe in Georgia since 2008. You can explore each election in detail using a variety of indicators such as turnout, overall results, individual party results, and much more. Visualizing the data using maps as well as in tabular format allows you to explore and analyze how election results are distributed geographically by district and precinct. In this way, you have the tools to explore data for different applications, such as identifying areas of low turnout to target voter mobilization efforts at the street level, where they are most effective.
...
Avatar von

2 Antworten

0 Daumen
 
Beste Antwort

Interessante Situation. Hier eine Analyse, die wahrscheinlich weiterhelfen wird:

HTML:

<form accept-charset="UTF-8" action="https://data.electionsportal.ge/en/download-data" data-action="https://data.electionsportal.ge/en/download-data" id="hidden_form_data" method="post">
<input name="utf8" type="hidden" value="✓" />
<input name="authenticity_token" type="hidden" value="orJuChHgAG0YSGOHOcb87V2xbmxoDxOuo9Xotoo8bd8=" />
<input id="type" name="type" type="hidden" />
<input id="map_title" name="map_title" type="hidden" value="District: Akhmeta - Precincts" />
<input id="event_name" name="event_name" type="hidden" value="2008 Presidential" />
<input id="event_id" name="event_id" type="hidden" value="2" />
<input id="child_shape_type_id" name="child_shape_type_id" type="hidden" value="4" />
<input id="shape_type_id" name="shape_type_id" type="hidden" value="3" />
<input id="shape_id" name="shape_id" type="hidden" value="53177" />
<input id="data_type" name="data_type" type="hidden" value="official" />
<input id="data_set_id" name="data_set_id" type="hidden" value="2" />
</form>

<a href="/en/download/csv/event/2/shape_type/4/shape/53177/event_name/placeholder/map_title/placeholder?data_set_id=2&data_type=official" class="download-link" data-type="csv" id="export-data-csv" title="Download CSV Data File">CSV</a>


Jquery (Form submit):

$(document).ready(function(){

$(".download-link").on("click",function(e){
  e.preventDefault(),
    $("#hidden_form_data #type").val($(this).data("type")),
    $("#hidden_form_data").attr("action",$("#hidden_form_data").data("action")+"."+$(this).data("type")),
    $("#hidden_form_data").submit()
})

});

JSFiddle:

https://jsfiddle.net/kai_noack/3onxzbLw/2/


Der sich ergebende Dateiname:

District_Akhmeta_-_Precincts-2008_Presidential-2019_10_07_085429.csv

Bestandteile:

[map_title]-[event_name]-[Rest ist Datum und ID, die wahrscheinlich serverseitig erzeugt wird]

Vorgehen:

Du kannst das form oben per Copy und Paste vervielfältigen und gibst dann die korrekten Bezirke ein bei name="map_title". Danach lädst du dir alle CSV herunter.

Ggf. hilft ein Browser-Plugin, mit dem du POSTs generieren kannst: https://stackoverflow.com/q/4797534


Hast du einen lokalen Server, kannst du auch PHP mit CURL verwenden, um POSTs zu senden. Zum Beispiel:

<?php

// according to the CSV map you want to download
$fields = array(
  'map_title' => urlencode('District: Akhmeta - Precincts'),
  'event_name' => urlencode('2008 Presidential'),
  'authenticity_token' => urlencode('orJuChHgAG0YSGOHOcb87V2xbmxoDxOuo9Xotoo8bd8='),
);

// url-ify the data for the POST
$fields_string = '';
foreach($fields as $key => $value)
{
  $fields_string .= $key.'='.$value.'&';
}
rtrim($fields_string, '&');

// open connection
$ch = curl_init();

// set the url, number of POST vars, POST data
$url = 'https://data.electionsportal.ge/en/download-data';
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, count($fields));
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);

//execute post
$result = curl_exec($ch);

//close connection
curl_close($ch);

?>

Avatar von
0 Daumen

Ich empfehle für solche Probleme das Tool "HTTrack" https://www.httrack.com/

Dieses Tool lädt den gesamten Inhalt einer Webseite auf den lokalen PC. Die Verzeichnisse des Servers werden dabei 1:1 abgebildet. Das Tool kann natürlich nur auf Daten zugreifen, die auf dem Server als "public" gekennzeichnet sind, aber die csv-Daten müssen public sein, sonst könnte man sie auch manuell nicht herunterladen.

Je nach Datenmenge auf dem Server dauert der Download sehr lange. Ist der Download fertig, kann man die Seite offline auf dem PC ablaufen lassen bzw. in den lokalen Verzeichnissen nach csv-Dateien suchen.

Das Tool verlangt einen Projektnamen (beliebig), ein lokales Stammverzeichnis, in welches die Webseite kopiert wird, und die URL (hier "https://data.electionsportal.ge/en" ). Hab es mal ausprobiert, funktioniert alles ohne Probleme. Die csv-Daten liegen dann lokal in "../data.electionsportal.ge/en/data_archives/1" usw., wobei manche einen arabischen Font, andere einen Latin-Font aufweisen.

Avatar von

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community