我目前正在运行一个进度条作为网络抓取器的一部分,但它似乎都是
(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
答案 0 :(得分:1)
如果您想打印指示其他而不是进度条以显示您的距离,最简单的可能是定期打印。
由于问题中的代码是针对Python 2的,所以我最初使用Python 2代码进行了回答,但是对于Python 3用户来说这个问题很容易实现,所以我也为它们添加了一个部分。
以下内容基于并应补充问题中的代码:
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
(“回车”)会删除行中的内容在打印其余部分之前。
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,相当于我在这个答案顶部提供的代码:
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]