在控制台中计算URL而不是进度条

时间:2017-07-26 05:29:53

标签: python command-line-interface

我目前正在运行一个进度条作为网络抓取器的一部分,但它似乎都是

(A)不准确 (B)过程缓慢。

import requests
import csv
from lxml import html
URL_LIST = [
"https://www.realestate.com.au/property/1-1-goldsmith-st-elwood-vic-3184",
"https://www.realestate.com.au/property/1-10-albion-rd-glen-iris-vic-3146",
"https://www.realestate.com.au/property/1-109-sydney-rd-manly-nsw-2095",
"https://www.realestate.com.au/property/1-1110-glen-huntly-rd-glen-huntly-vic-3163",]

with open('test.csv', 'wb') as csv_file:
    writer = csv.writer(csv_file)

    for index, url in enumerate(URL_LIST):
        page = requests.get(url)
        print 'scanning url....'

        if text2search in page.text:
            tree = html.fromstring(page.content)

            (title,) = (x.text_content() for x in tree.xpath('//title'))
            (price,) = (x.text_content() for x in tree.xpath('//div[@class="property-value__price"]'))
            (sold,) = (x.text_content().strip() for x in tree.xpath('//p[@class="property-value__agent"]'))
            writer.writerow([title, price, sold])

我是否可以阅读文章/培训以更好地了解打印进度到控制台?

我实际上希望程序扫描列表中的URL,然后在列表中迭代时打印进度,这是

的内容。
  • 扫描网址1 of 30

  • 扫描网址2 of 30

  • 扫描网址3 of 30

如果可能的话,请保持同一条线但不是必需的。

代码低于 - 如果有人可以协助培训或阅读,我们将不胜感激。

ScrollView

2 个答案:

答案 0 :(得分:1)

如果您想打印指示其他而不是进度条以显示您的距离,最简单的可能是定期打印。

由于问题中的代码是针对Python 2的,所以我最初使用Python 2代码进行了回答,但是对于Python 3用户来说这个问题很容易实现,所以我也为它们添加了一个部分。

Python 2的版本

以下内容基于并应补充问题中的代码:

for index, url in enumerate(URL_LIST):
    print 'Scanning url #' + str(index+1) + ' of ' + str(len(URL_LIST))

您还可以选择使用url循环生成的for变量添加您正在扫描的网址。

此外,如果您希望每个打印替换最后一个,您可以在print语句的末尾添加逗号,,并将\r字符添加到开头:

for index, url in enumerate(URL_LIST):
    print '\rScanning url #' + str(index+1) + ' of ' + str(len(URL_LIST)),

逗号阻止print在结尾处添加换行符(\n),并且开头的\r(“回车”)会删除行中的内容在打印其余部分之前。

Python 2&之间print的差异Python 3

重要的是要注意{2}在Python 2和Python 3中的功能完全不同。上面的“Python 2”解决方案在Python 3中不起作用。

首先,Python 3中的print是一个函数,而不是关键字,因此必须将其作为函数调用(即print),其次,将逗号添加到结尾不会阻止新行字符的输出。 通常包括末尾的逗号将没有可见效果,但是解释器 正在评估它(作为包含单个{{1}的元组使用Python REPL时可以看到。相反,必须向print('Print me!')函数提供一个命名参数(名为None)以覆盖它的默认值。

Python 3的版本

这是一个Python 3,相当于我在这个答案顶部提供的代码:

end

如果您希望每个打印都重复使用相同的行,如上面的第二个示例所示:

print

如果您没有阅读上述所有内容,请注意for index, url in enumerate(URL_LIST): print('Scanning url #' + str(index+1) + ' of ' + str(len(URL_LIST))) 覆盖for index, url in enumerate(URL_LIST): print('\rScanning url #' + str(index+1) + ' of ' + str(len(URL_LIST)), end='') 函数的默认操作,即在每行的末尾添加end=''(换行符)字符因此它会添加一个空字符串,并且字符串开头的print(回车)字符会使Python返回到行的开头以打印字符串的其余部分。

答案 1 :(得分:0)

tqdm是一个功能强大的进度条库。它让你做这样的事情。

import tqdm
t = tqdm.tqdm(list('abcdefg'))
for i in t:
    import time
    time.sleep(1)
    t.set_postfix(url=i)

进度条输出为:

 86%|██████████████████████████▏    | 6/7 [00:06<00:01,  1.00s/it, url=f]