Python:Selenium:如何编写尝试-再次尝试迭代的代码除外

时间:2019-04-07 20:46:32

标签: python selenium

我有一个非常满意的网络抓取工具,但有时它会丢失迭代,因为它无法完全加载网页(这是我要抓取的网站的性质。在这些情况下,我希望代码以再次尝试迭代。目前,我的代码框架如下所示:

data = []
for i in range(len(links)):
    try:
        driver.get(link[i])
        a = driver.find_elements_by_xpath(#data in here)[0].text
        data.append(a)
        #this is then written to a csv
    except:
        print(i)

因此,此刻我的代码开始运行,然后为我列出失败的实例数量。然后,我返回并手动输入数据。 如果我不这样做,而是我的程序再次尝试失败的实例,那对我会更好,这样我就不会丢失数据。 有什么办法可以做到这一点? 谢谢

2 个答案:

答案 0 :(得分:0)

如果要多次重试同一link[i],则可能需要一个附加循环。究竟哪种循环取决于一些细节。如果您想一直尝试直到成功(假设可以肯定会最终发生),那么while True循环将是最有意义的。另一方面,如果要限制尝试次数,则在范围上进行for循环会更好。

这是一个尝试最多执行三次的实现的草图:

max_tries = 3

data = []
for i, link in enumerate(links):   # this is a slightly nicer way to do your main loop
    for t in range(max_tries):
        try:
            driver.get(link)
            a = driver.find_elements_by_xpath("#data in here")[0].text
            data.append(a)
            break                  # break out of the inner loop if we succeeded
        except:
            print("failed to load link", i, "retrying..." if t < max_tries-1 else "giving up.")

答案 1 :(得分:0)

您可以实现一个迭代计数器,并在第一次尝试后找出两个列表之间的差异:)

data = []
intData = []
counter = 0
maxIterations = 2

def Diff(li1, li2): 
    return (list(set(li1) - set(li2)))

while counter < maxIterations:
     for i in range(len(links)):
        try:
            if counter < 1:    
                driver.get(link[i])
                a = driver.find_elements_by_xpath(#xpathstring)[0].text
                data.append(a)
            else:
                driver.get(link[i])
                a = driver.find_elements_by_xpath(#xpathstring)[0].text
                intData.append(a)

            counter += 1
        except:
            print(i)
            counter += 1

# Find differences between first iterations and all consecutive ones
print(Diff(intData, data))