Hello,
J'ai pas mal lurké ici pour de l'inspiration, du coup je me dis qu'il est temps de contribuer un peu.
J'avais rien d'intéressant à faire aujourd'hui, du coup j'ai sorti une petite classe Python 2 pour récupérer des positions d'indices de chasse sur DofuSama.
J'ai pondu ça en quelques heures en ayant jamais fait de scraping avant, et je suis au taf, donc j'ai pas pu vraiment le tester, donc y'aura certainement une paire de bugs. Mais en forçant pas trop dessus, ça devrait marcher assez bien.
Vous aurez besoin de la lib Selenium (python -m pip install selenium) et de chromedriver.exe (en le mettant soit dans le PATH, soit direct dans le même répertoire que le code)
Si jamais ça intéresse du monde, je pourrais passer un peu plus de temps dessus, histoire de rendre ça bien stable.
La bise,
Ugdha
J'ai pas mal lurké ici pour de l'inspiration, du coup je me dis qu'il est temps de contribuer un peu.
J'avais rien d'intéressant à faire aujourd'hui, du coup j'ai sorti une petite classe Python 2 pour récupérer des positions d'indices de chasse sur DofuSama.
J'ai pondu ça en quelques heures en ayant jamais fait de scraping avant, et je suis au taf, donc j'ai pas pu vraiment le tester, donc y'aura certainement une paire de bugs. Mais en forçant pas trop dessus, ça devrait marcher assez bien.
Vous aurez besoin de la lib Selenium (python -m pip install selenium) et de chromedriver.exe (en le mettant soit dans le PATH, soit direct dans le même répertoire que le code)
Python:
# -*- coding: UTF-8 -*-
from selenium import webdriver
import time
class Sama:
"""
Une API discount pour DofuSama
"""
def __init__(self, headless=True):
"""
Constructeur, fait le lien avec le site par une instance de driver Selenium.
Nécessite d'avoir chromedriver.exe dans le PATH ou dans le même fichier que ce script.
Ça devrait pouvoir marcher avec des drivers FF ou IE, pas testé.
:param headless: si False, vous aurez la fenêtre de navigateur ouverte. Pas utile, à moins de vouloir regarder comment c'est branlé dedans
"""
print 'Initialisation...'
start = time.time()
options = webdriver.ChromeOptions()
if headless:
options.add_argument('headless')
self.driver = webdriver.Chrome(chrome_options=options)
self.driver.get("http://www.dofusama.fr/treasurehunt/rechercher-un-indice.html")
self.driver.find_element_by_xpath('//*[@id="jBox-overlay"]/div').click()
print 'Scraper initialisé en ' + str(round(time.time() - start, 1)) + ' secondes\n'
def get_directions(self, coords, clue, direction):
"""
La fonction que ça te dis où est l'indice.
:param coords: Coordonnées actuelles du joueur
:param clue: L'indice. Doit être EXACTEMENT le même que ceux de la liste DofuSama. Eventuellement je rendrai ça plus souple
:param direction: Direction de l'indice doit être 'N', 'S', 'E', 'O', idem, y'a moyen de rendre ça plus sympa à utiliser
:return: La position de l'indice ; une petite description de comment y aller ; le temps que ça a pris pour l'avoir
"""
start = time.time()
self.driver.find_element_by_id('map_pos_x').clear()
self.driver.find_element_by_id('map_pos_x').send_keys(coords[0])
self.driver.find_element_by_id('map_pos_y').clear()
self.driver.find_element_by_id('map_pos_y').send_keys(coords[1])
self.driver.find_element_by_xpath(
'//*[@id="clue-finder-form"]/div[1]/div/div[2]/div/span/span[1]/span/ul/li/input').clear()
self.driver.find_element_by_xpath(
'//*[@id="clue-finder-form"]/div[1]/div/div[2]/div/span/span[1]/span/ul/li/input').send_keys(clue)
opt_list = self.driver.find_elements_by_class_name('select2-results__option')
for opt in opt_list:
if opt.get_attribute('innerHTML') == clue:
opt.click()
break # Déso pas déso
direction = ['O', 'N', 'S', 'E'].index(direction) + 1
self.driver.find_element_by_xpath(
'//*[@id="clue-finder-form"]/div[1]/div/div[3]/div/button[{}]/i'.format(str(direction))).click()
time.sleep(1)
description = self.driver.find_element_by_xpath('//*[@id="clue-finder-form"]/div[2]/div[1]/strong[3]').strip().encode('utf-8')
next_pos = self.driver.find_element_by_xpath('//*[@id="clue-finder-form"]/div[2]/div[1]/strong[2]').strip().encode('utf-8')
return next_pos, description, round(time.time() - start, 1)
def get_directions_pretty(self, coords, clue, direction):
"""
En gros pareil que get_directions(), mais avec des prints à la pelle. Procédure.
:param coords: Coordonnées actuelles du joueur
:param clue: L'indice. Doit être EXACTEMENT le même que ceux de la liste DofuSama. Eventuellement je rendrai ça plus souple
:param direction: Direction de l'indice doit être 'N', 'S', 'E', 'O', idem, y'a moyen de rendre ça plus sympa à utiliser
:return: La position de l'indice ; une petite description de comment y aller ; le temps que ça a pris pour l'avoir
"""
print '-----------------------------'
print 'Coordonnées actuelles : ' + str([coords[0], coords[1]])
print 'Direction : ' + ['Ouest', 'Nord', 'Sud', 'Est'][['O', 'N', 'S', 'E'].index(direction)]
print 'Indice Recherché : ' + clue + '\n'
next_pos, description, duration = self.get_directions(coords, clue, direction)
print 'L\'indice se trouve en ' + next_pos + ', ' + description
print 'Trouvé en ' + str(time) + ' secondes\n'
def destroy(self):
"""
Termine le processus chromedriver.exe. Vachement important de l'appeller en fin de programme
:return:
"""
self.driver.quit()
sm = Sama()
sm.get_directions((6, 10), 'Souche qui ne repousse pas', 'N')
sm.get_directions((6, 9), 'Souche qui ne repousse pas', 'O')
sm.destroy()
__author__ = 'Ugdha'
Si jamais ça intéresse du monde, je pourrais passer un peu plus de temps dessus, histoire de rendre ça bien stable.
La bise,
Ugdha