2015-09-23 80 views
2

我正在写一个网络爬虫,发现链接并处理页面信息。动态长度的Python进度条

因为这可能是一个没有结束的过程,所以我不知道构建进度条时有多少元素,比如完成了5个链接/谁知道我们什么时候完成。

但我知道我访问了多少个链接,以及我检测到了多少个链接。

因此访问的链接数/检测到的链接。

我想要做的就是使用api之类的点击或其他来制作进度条。

在酒吧的长度可以改变的地方,即我可以更新检测到的酒吧......认为加载酒吧和用户是90%,突然下降到10%。 Aw无声大声'

看着点击API看起来有两种方式来使用他们的进度条。

with click.progressbar(all_the_users_to_process) as bar: 
for user in bar: 
    modify_the_user(user) 

with click.progressbar(length=total_size, 
        label='Unzipping archive') as bar: 
for archive in zip_file: 
    archive.extract() 
    bar.update(archive.size) 

Progress Bar

我可以做什么我上面使用点击进度条描述?

如果我不能做什么,我需要做一个进度栏,其中完成的价值随着... 90% - > 10% - > 20%的变化而变化。

谢谢!

编辑:更多细节

我有对象,称为LinkElements的列表。这些元素具有访问布尔值。

我想我可能会更新迭代器:

with click.progressbar(like_elements_list) as link_elements: 
    for link in link_elements: 
     ... do stuff with link .... 
     link_elements.update(like_elements_list) 

的想法似乎并没有工作,虽然......或者说我不理解它

回答

1

它不支持,但你可以使用点击提供您正在查找的功能。

import click 

links_visited = 0 
links_detected = 100 

with click.progressbar(length=1000) as bar: 
    for link in link_elements_list: 

     # ... do stuff ... 

     links_visited += 1 
     links_detected += 0 # Increment how many more new links were found 

     progress = float(links_visited)/float(links_detected) 
     bar.pos = int(progress * 999) + 1 
     bar.update(0) 

您可以通过bar.pos手动移动的进度条,然后在update(0)调用。由于update()方法以增量方式工作,因此您只需传递0即可进行渲染。

现在,我必须要注意以下几点:

  • length=1000我硬编码的1000的值,所以我们可以提供0-1000之间的“百分比”。
  • bar.pos = int(progress * 999) + 1为什么+1?那么,当您拨打update()时,它会尝试计算平均时间,这意味着如果使用bar.pos0,则会得到一个零除错误。 +1是为了避免这种情况。