Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Click avec Selenium - Web Scraping avec BeautifulSoup - Python

+2 votes

J'essaie de récupérer des données sur un site web, concernant différentes villes dans différents départements. Pour cela je dois cliquer sur 4 liens (formulaires php) différents avant d'arriver au tableau des données que je souhaite récupérer. Et ce, pour plus de 4500 tableaux.

J'utilise Webdriver.
Je fais un FOR pour parcourir chaque url correspondant à mes différents départements. J'utilise Selenium sous Python3 pour faire un click afin de traverser chacun des liens (choix de la lettre de début, choix de la ville, choix du budget, choix du tableau, choix de l'année).
Je n'arrive pas à conserver mes données dans un "tableau", et je n'arrive pas à faire "cliquer" le webdriver sur les différentes lettres, puis sur les différentes villes ainsi de suite.

Est-ce le beautiful soup qui me permettra de récupérer les données ?

Dernière précision : je débute en Python...

demandé 18-Nov-2016 par Mathilde

on pourrait voir quelques morceaux de code pour se faire une idée ?

Voici mon code... :
Désolée pour mon niveau de débutante... Car je sens que vous allez vous arracher les yeux...

from asyncio import wait_for
from webbrowser import browser

import click
import print

from selenium import webdriver
import selenium

list = ["009", "011", "012", "030", "031", "032", "034", "046", "048", "065", "066", "081", "082"]
debut = "http://alize2.finances.gouv.fr/communes/eneuro/RDep.php?type=BPS&dep="
driver = webdriver.Firefox()

class wait_for_page_load(object):
def init(self, browser):
self.browser = browser

def __enter__(self):
    self.old_page = self.browser.find_element_by_tag_name('html')

def page_has_loaded(self):
    new_page = self.browser.find_element_by_tag_name('html')
    return new_page.id != self.old_page.id

def __exit__(self, *_):
    wait_for(self.page_has_loaded)
for dpt in list:
url = debut + dpt
driver.get(url)

elems = driver.find_elements_by_tag_name("a")
print(elems)

for elem in elems:
    print(elem.getattribute("href"))
    with wait_for_page_load(driver):
        elem.click(elem)

        letters = driver.find_elements_by_tag_name("a")
        print(letters)
        for letter in letters:
            print(letter.getattribute("font"))
            with wait_for_page_load(driver):
                letter.click()

                cities = driver.find_element_by_tag_name("a")
                print(cities)
                for city in cities:
                    print(city.getattribute("font"))
                    with wait_for_page_load(driver):
                        city.click()

                        choices = driver.find_element_by_tag_name('a')
                        print(choices)
                        for choice in choices:
                            print(choice.getattribute('font'))
                            with wait_for_page_load(driver):
                                choice.click()

                                endets = driver.find_element_by_tag_name('a')
                                print(endets)
                                for endet in endets:
                                    print(endet.getattribute('href', 'endettement'))
                                    with wait_for_page_load(driver):
                                        endet.click()

Tu peux voir avec un csv, enfin si j'ai bien compris la question.
https://docs.python.org/3.6/library/csv.html

1 Réponse

+2 votes

Pour ça il te faut Scrapy . Je devais en faire un tuto sur Sam&Max pas eu le temps.

Tuto et son Github

répondu 20-Nov-2016 par max (892 points)
...