По всем ссылкам рекурсивно с селеном - PullRequest
0 голосов
/ 16 июня 2019

Я пытаюсь сканировать веб-сайт, который выглядит как каталог файлов. Я хотел бы перейти по всем ссылкам (неизвестное количество вложенных папок), пока не доберусь до файлов .xml и .pdf, чтобы затем загрузить.

Selenium кажется лучшим вариантом, потому что для этих сайтов требуется войти в систему, а затем отправить код в телефонное приложение для входа. Я смог войти с помощью веб-драйвера.

В данный момент мой код перемещается только к первому «конечному узлу» дерева файлов. Я не уверен, как вернуться и пройти по всем ссылкам. Есть идеи? Вот мой код пока ...

browser.get(start_url)
def crawler():
    links = browser.find_elements_by_xpath('//pre/a')
    for link in links:
        if '.xml' in link.text or '.pdf' in link.text:
            print(f'download {link.text}')  # This is a placeholder for now
        else:
            print('click')
            browser.get(browser.current_url + link.text)
            return crawler()

1 Ответ

0 голосов
/ 16 июня 2019
browser.get(start_url)
def crawler():
    links = browser.find_elements_by_xpath('//pre/a')
    for link in links:
        if '.xml' in link.text or '.pdf' in link.text:
            print(f'download {link.text}')  # This is a placeholder for now
        else:
            print('click')
            browser.get(browser.current_url + link.text)
            crawler()

В комментариях приведен код, который я использую для ожидания обновления в Selenium.Обратите внимание, что он написан как часть класса, поэтому он использует self.driver и т. Д. BTW self.get_tags - это просто функция, которая делает find_elements_by_tag_name для предоставленного тега (используя 'html', который есть на большинстве страниц).

from contextlib import contextmanager
from selenium.webdriver.support.expected_conditions import staleness_of

    @contextmanager
    def wait_for_page_load(self, timeout=MAX_WAIT, entity='wait_for_page_load'):
        """ Wait for a new page that isn't the old page 
        """
        old_page = self.get_tags(self.driver, 'html', entity)
        yield
        webdriver.support.ui.WebDriverWait(self.driver, timeout).until(
                staleness_of(old_page[0]))

пример вызова:

    with self.wait_for_page_load():
        logout.click()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...