用硒递归地跟踪所有链接

时间:2019-06-16 15:39:28

标签: python selenium web-scraping

我正在尝试抓取一个像文件目录这样的网站。我想跟踪所有链接(嵌套文件夹的数量未知),直到到达.xml和.pdf文件,然后下载。

硒似乎是最好的选择,因为此站点需要登录,然后再将代码发送到电话应用程序以进行登录。我已经能够使用Web驱动程序登录。

此刻,我的代码仅导航到文件树的第一个“结束节点”。我不确定如何返回并浏览所有链接。有任何想法吗?到目前为止,这是我的代码...

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 :(得分:0)

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