2016-07-28 4 views
1

Я хотел бы очистить PokemonVision, чтобы я мог отображать все координаты долготы и широты отображаемого Pokemon.Как очистить координаты ГИС от карты (например, Pokevision) с использованием python и селена?

URL-адрес веб-страницы содержит долготу и широту маркера. Например, следующий URL содержит 39.95142302373031, -75.17986178398132: https://pokevision.com/#/@39.95142302373031,-75.17986178398132

В source code флаг маркер имеет следующий DIV:

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

Я также заметил, что каждый покемон отображается имеет DIV вроде следующее:

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

Я принимаю позицию покемона и маркер флага можно найти в DIV, особенно сразу после текста «преобразования: перевод (».

Учитывая, что мы знаем как положение пикселя, так и долготу и широту флага, а также положение пикселя покемонов, я считаю, что я должен иметь возможность определять долготу и широту покемонов.

Например, маркер флага всегда находится на 324px, 135px, и мы знаем, что координаты gis маркера флага составляют 39.95142302373031, -75.17986178398132. Мы также знаем координаты покемонов (например, 215px, 113px). Однако я не могу понять, как получить долготу и широту покемонов.

ответ

2

Если вы щелкните по карте, URL-адрес обновится с координатами в этой точке. Вы можете найти все видимые покемоны на карте, щелкнуть их, а затем проанализировать координаты из обновленного URL. Пример кода:

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

Выход:

(.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'] 

Этот код является проблематичным по нескольким причинам, главным из которых является чрезмерно широким и неосторожное обращение с исключением. Однако вы должны адаптировать концепцию к более надежному решению.

+0

Это замечательно, но единственная проблема заключается в том, что я не могу определить имя покемона, связанного с координатами gis. – Chris

+0

Получение имен с помощью коордов немного сложно. Имена не сохраняются с тем же элементом, что и отображаемые изображения, и для их непосредственного использования потребуется зависание каждого изображения и очистка всплывающего окна. Вы можете объединить изображения с именами на основе номера изображения, но это потребует от вас пройти через каждое изображение, а затем добавить соответствующее имя в имя dict. Я сделал это для пары, но это до вас, чтобы закончить все остальное. –