2016-07-28 7 views
1

Ich möchte PokemonVision kratzen, damit ich alle Längen- und Breitenkoordinaten des angezeigten Pokemon erhalten kann.Wie scrappe ich GIS-Koordinaten aus einer Karte (z. B. Pokevision) mit Python und Selen?

Die URL der Webseite enthält den Längen- und Breitengrad der Markierungsfahne. Zum Beispiel enthält die folgende URL 39,95142302373031, -75,17986178398132: https://pokevision.com/#/@39.95142302373031,-75.17986178398132

Im source code, das Flag Marker folgendes div hat:

<div class="leaflet-marker-pane"><img class="leaflet-marker-icon leaflet-zoom-animated leaflet-clickable" src="/asset/image/leaflet//marker-icon.png" style="margin-left: -12px; margin-top: -41px; width: 25px; height: 41px; transform: translate(324px, 135px); z-index: 135;" tabindex="0"/> 

ich auch bemerkt habe, dass alle pokemon angezeigt wird, hat ein div wie die folgende:.

:

<div class="leaflet-marker-icon-wrapper leaflet-zoom-animated leaflet-clickable" style="margin-left: 0px; margin-top: 0px; transform: translate(215px, 113px); z-index: 113;" tabindex="0"><img class="leaflet-marker-icon " src="//ugc.pokevision.com/images/pokemon/116.png" style="margin-left: 0px; margin-top: 0px; width: 48px; height: 48px;"/><span class="leaflet-marker-iconlabel home-map-label" style="margin-left: 10px; margin-top: 26px;">08:15</span></div> 

mir die Position des pokemon und die Flagge Marker unter der Annahme, in der div, insbesondere direkt nach dem Text „übersetzen (transformieren“ zu finden

In Anbetracht der Tatsache, dass wir sowohl die Pixelposition und die Länge und Breite der Flagge, als auch die Pixelposition des Pokemon kennen, glaube ich, dass ich in der Lage sein sollte, die Länge und Breite des Pokemon zu erhalten.

Zum Beispiel ist der Flag-Marker immer bei 324px, 135px und wir wissen, dass die gis-Koordinaten des Flag-Markers 39.95142302373031, -75.17986178398132 ist. Wir kennen auch die Koordinaten eines Pokemon (z. B. 215px, 113px). Allerdings kann ich nicht herausfinden, wie man die Länge und Breite des Pokemon erreicht.

Antwort

2

Wenn Sie auf die Karte klicken, wird die URL an dieser Stelle mit den Koordinaten aktualisiert. Sie können alle sichtbaren Pokemon auf der Karte finden, klicken Sie auf sie, dann analysieren Sie die Koordinaten von der aktualisierten URL. Beispielcode:

from pprint import pprint as pp 

from selenium import webdriver 
from selenium.common.exceptions import WebDriverException 

poke_names = { 
    21: "Spearow", 
    23: "Ekans", 
    39: "Jigglypuff", 
    98: "Krabby", 
    129: "Pidgey", 

} 

driver = webdriver.Chrome() 
try: 
    driver.get("https://pokevision.com/#/@39.95142302373031,-75.17986178398132") 

    # Zoom out once 
    zoom_css = "a.leaflet-control-zoom-out" 
    driver.find_element_by_css_selector(zoom_css).click() 

    # Find all pokemon in the source 
    poke_css = "div.leaflet-marker-pane div.leaflet-marker-icon-wrapper" 
    pokemon = driver.find_elements_by_css_selector(poke_css) 
    print("Found {0} pokemon".format(len(pokemon))) 

    # Filter for only the ones that are displayed on screen 
    on_screen_pokemon = [p for p in pokemon if p.is_displayed()] 
    print("There are {0} pokemon on screen".format(len(on_screen_pokemon))) 

    # Click each pokemon, which moves the marker and thus updates the URL with 
    # the coords of that pokemon 
    coords = list() 
    for pokemon in on_screen_pokemon: 
     try: 
      pokemon.click() 
      # Example URL: https://ugc.pokevision.com/images/pokemon/21.png 
      img_url = pokemon.find_element_by_css_selector('img').get_attribute("src") 
      img_num = int(img_url.split('.png')[0].split('/')[-1]) 
     except WebDriverException: 
      # Some are hidden by other elements, move on 
      continue 
     else: 
      # Example 
      # https://pokevision.com/#/@39.95142302373031,-75.17986178398132 
      poke_coords = driver.current_url.split('#/@')[1].split(',') 
      poke_name = poke_names[img_num] if img_num in poke_names else "Unknown" 
      coords.append((poke_name, poke_coords)) 

    print("Found coordinates for {0} pokemon".format(len(coords))) 
    for poke_name, poke_coords in coords: 
     print("Found {0} pokemon at coordinates {1}".format(poke_name, poke_coords)) 

finally: 
    driver.quit() 

Ausgang:

(.venv35) ➜ stackoverflow python pokefinder.py 
Found 103 pokemon 
There are 85 pokemon on screen 
Found coordinates for 27 pokemon 
Found Unknown pokemon at coordinates ['39.95481970299595', '-75.18772602081299'] 
Found Spearow pokemon at coordinates ['39.952878764070974', '-75.18424987792967'] 
Found Spearow pokemon at coordinates ['39.95625069896077', '-75.18845558166504'] 
Found Unknown pokemon at coordinates ['39.95685927437669', '-75.18216848373413'] 
Found Unknown pokemon at coordinates ['39.95174378273782', '-75.17852067947388'] 
Found Unknown pokemon at coordinates ['39.9509706687274', '-75.17377853393555'] 
Found Unknown pokemon at coordinates ['39.95241819420643', '-75.17523765563965'] 
Found Unknown pokemon at coordinates ['39.95409596949794', '-75.17422914505005'] 
Found Unknown pokemon at coordinates ['39.95131610372689', '-75.17277002334595'] 
Found Unknown pokemon at coordinates ['39.95276362189558', '-75.17313480377197'] 
Found Unknown pokemon at coordinates ['39.95254978591276', '-75.17257690429688'] 
Found Unknown pokemon at coordinates ['39.95319129185564', '-75.17094612121582'] 
Found Unknown pokemon at coordinates ['39.95488549657055', '-75.17195463180542'] 
Found Unknown pokemon at coordinates ['39.95488549657055', '-75.17096757888794'] 
Found Unknown pokemon at coordinates ['39.9571224404468', '-75.17251253128052'] 
Found Unknown pokemon at coordinates ['39.95633293919831', '-75.17088174819946'] 
Found Spearow pokemon at coordinates ['39.94958891128449', '-75.1890778541565'] 
Found Pidgey pokemon at coordinates ['39.94958891128449', '-75.18671751022339'] 
Found Unknown pokemon at coordinates ['39.94769717428357', '-75.18306970596313'] 
Found Unknown pokemon at coordinates ['39.948174225938324', '-75.18070936203003'] 
Found Unknown pokemon at coordinates ['39.94458803200817', '-75.17658948898315'] 
Found Unknown pokemon at coordinates ['39.94689111392826', '-75.174400806427'] 
Found Unknown pokemon at coordinates ['39.948322275775425', '-75.1739501953125'] 
Found Ekans pokemon at coordinates ['39.94749977262573', '-75.17088174819946'] 
Found Unknown pokemon at coordinates ['39.94842097548884', '-75.17317771911621'] 
Found Unknown pokemon at coordinates ['39.94934216594682', '-75.17180442810059'] 
Found Unknown pokemon at coordinates ['39.948075525868894', '-75.17107486724852'] 

Dieser Code ist problematisch für ein paar Gründe, Leiter unter ihnen Handhabung der zu weit gefasst und unvorsichtig Ausnahme. Sie sollten jedoch in der Lage sein, das Konzept in eine robustere Lösung zu überführen.

+0

Das ist großartig, aber das einzige Problem ist, dass ich nicht in der Lage bin, den Namen des Pokemon zu identifizieren, der den Koordinaten gis zugeordnet ist – Chris

+0

Die Namen mit den Koordinaten zu bekommen ist ein bisschen schwierig. Die Namen werden nicht mit dem gleichen Element wie die angezeigten Bilder gespeichert. Wenn Sie sie direkt abrufen möchten, müssen Sie jedes Bild in der Schwebe halten und das Popup-Fenster auskratzen. Sie können die Bilder anhand der Bildnummer mit Namen verknüpfen, müssen aber jedes Bild durchlaufen und dann den Namen dict hinzufügen. Ich habe das für ein Paar getan, aber es liegt an dir, den Rest zu erledigen. –

Verwandte Themen