我有一个非常满意的网络抓取工具,但有时它会丢失迭代,因为它无法完全加载网页(这是我要抓取的网站的性质。在这些情况下,我希望代码以再次尝试迭代。目前,我的代码框架如下所示:
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)
因此,此刻我的代码开始运行,然后为我列出失败的实例数量。然后,我返回并手动输入数据。 如果我不这样做,而是我的程序再次尝试失败的实例,那对我会更好,这样我就不会丢失数据。 有什么办法可以做到这一点? 谢谢
答案 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))