Selenium迭代paginator:optimization

时间:2016-09-27 22:55:35

标签: python selenium pagination

我的网站中有一个分页符。每个页面显示32个链接,我得到每个链接并将它们存储在文件夹中的单独文件中。我在Python中使用Selenium的Firefox驱动程序。

程序基本上是:

get the 32 elements
for element in elements:
    open new file and save element
repeat

我正在监控每个周期所花费的时间。我开始时间为4秒,然后是8秒(当我保存了10000个链接时),现在它花了10秒钟,我已经保存了13000个链接。

之前,我打开同一个文件并附加链接,这也减慢了周期,我想因为随着文件大小的增加,它必须加载它并在每个周期中追加。

但是现在我不知道什么可能减缓周期。转到下一页总是花费3-4秒,所以这不是问题的根源。什么可能减缓周期?

这是循环:

while True:
    propiedades = driver.find_elements_by_xpath("//*[@class='hlisting']")
    info_propiedades = [propiedad.find_element_by_xpath(".//*[@class='propertyInfo item']")
                        for propiedad in propiedades]

    for propiedad in info_propiedades:
        try:
            link = [l.get_attribute("href") for l in propiedad.find_elements_by_xpath(".//a")]
            thelink = link[0]
            id_ = thelink.split("id-")[-1]
            with open(os.path.join(linkspath, id_), "w") as f:
                f.write(link[0])
            numlinks += 1
        except:
            print("link not found")

    siguiente = driver.find_element_by_id("paginador_pagina_{0}".format(paginador))
    siguiente.click()  # goes to the next page
    while new_active_page == old_active_page:  # checks if page has loaded completely
        try:
            new_active_page = driver.find_element_by_class_name("pagina_activa").text
        except:
            new_active_page = old_active_page
        time.sleep(0.3)
    old_active_page = new_active_page
    paginador += 1

1 个答案:

答案 0 :(得分:1)

一些建议......

  1. 您在开始时有很多嵌套.find_elements_*。您应该能够制作一个获取您正在寻找的元素的查找。从网站和您的代码中,您可能会看到类似于" MC1595226"的代码。如果您抓取其中一个MC代码并在HTML中进行搜索,您将在该特定列表中找到该代码。它位于URL中,它是一堆元素的ID的一部分,依此类推。查找此代码的更快方法是使用CSS选择器"a[id^='btnContactResultados_'"。它会搜索包含以" btnContactResultados _"开头的ID的A标记。该id的其余部分是MC编号,例如

    <a id="btnContactResultados_MC1595226" ...>
    

    因此,使用该CSS选择器,我们找到所需的元素,然后获取ID并将其拆分为&#34; _&#34;抓住最后一部分。注意:这更多的是代码效率。我不认为这会让你的脚本变得非常快,但它应该加快搜索部分的速度。

  2. 我建议每页编写一个日志,每页只写一次。所以基本上你处理页面的代码并将结果附加到列表中。处理完页面的所有代码后,将该列表写入日志。写入磁盘很慢......你应该尽量少做。最后,您可以编写一个打开所有这些文件的小脚本,并附加它们以将最终产品全部放在一个文件中。您还可以在每页写入一次文件的中间位置,但在关闭该文件并使用另一个文件之前将100页写入文件。您必须使用这些设置来查看效果最佳的位置。

  3. 如果我们将这两者的逻辑结合起来,我们会得到类似的东西......

    while True:
        links = driver.find_elements_by_css_selector("a[id^='btnContactResultados_'")
    
        codes = []
        for link in links:
            codes.append(link.get_attribute("id").split("_")[-1])
    
        with open(os.path.join(linkspath, paginador), "w") as f:
            f.write(codes)
        driver.find_element_by_link_text("Siguiente »").click()  # this should work
    
        while new_active_page == old_active_page:  # checks if page has loaded completely
            try:
                new_active_page = driver.find_element_by_class_name("pagina_activa").text
            except:
                new_active_page = old_active_page
            time.sleep(0.3)
        old_active_page = new_active_page
        paginador += 1
    

    注意:python不是我的母语...我更多的是Java / C#家伙,所以你可能会发现错误,效率低下或非pythony代码。你已被警告...... :)