@I2etr0
Jun DevOps

Как синхронизировать tqdm с функцией в python?

Есть скрипт парсера. Надо к этому скрипту присобачить прогресс бар. Пользуюсь библиотекой tqdm.

Перешерстил интернет. Есть примеры на английском, но не нашел интеграции с функцией.

Код функции:
def hh_parse(base_url, headers):
    session = requests.session()
    request = session.get(base_url, headers=headers)
    if request.status_code == 200:
        soup = bs(request.content, 'html.parser')
        divs = soup.find_all('div', attrs={'data-qa': 'vacancy-serp__vacancy'})
        output_file = open(out, 'w')
        for div in divs:
            title = div.find('a', attrs={'data-qa': 'vacancy-serp__vacancy-title'}).text
            compensation = div.find('div', attrs={'data-qa': 'vacancy-serp__vacancy-compensation'})
            if compensation == None:
                compensation = 'Не указанно'
            else:
                compensation = div.find('div', attrs={'data-qa': 'vacancy-serp__vacancy-compensation'}).text
            href = div.find('a', attrs={'data-qa': 'vacancy-serp__vacancy-title'})['href']
            company = div.find('a', attrs={'data-qa': 'vacancy-serp__vacancy-employer'}).text
            text1 = div.find('div', attrs={'data-qa': 'vacancy-serp__vacancy_snippet_responsibility'}).text
            text2 = div.find('div', attrs={'data-qa': 'vacancy-serp__vacancy_snippet_requirement'}).text
            content = 'Условия:\n' + text1 + '\nТребования к кандидату:\n' + text2
            all = title + '\n' + compensation + '\n' + href + '\n' + company + '\n' + content + '\n\n\n\n\n'
            output_file.write(all)
            print(all)
        output_file.close()
    else:
        print('ERROR')


Заранее огромное спасибо за помощь!

P.S.: нашел код прогресс бара, но не уверен в его правильности:
def update_progress(progress):
    barLength = 10  # Modify this to change the length of the progress bar
    status = ""
    if isinstance(progress, int):
        progress = float(progress)
    if not isinstance(progress, float):
        progress = 0
        status = "error: progress var must be float\r\n"
    if progress < 0:
        progress = 0
        status = "Halt...\r\n"
    if progress >= 1:
        progress = 1
        status = "Done...\r\n"
    block = int(round(barLength * progress))
    text = "\rPercent: [{0}] {1}% {2}".format("#" * block + "-" * (barLength - block), progress * 100, status)
    sys.stdout.write(text)
    sys.stdout.flush()
  • Вопрос задан
  • 3233 просмотра
Решения вопроса 1
@Taus
Загляните в документацию и wiki библиотеки tqdm. Описание приведено очень подробное. Если вам требуется выводить прогресс для одного вызова функции:
from tqdm import tqdm
...
for div in tqdm(divs):
    # обработка

Если для разных base_url в hh_parse, то аналогично передавать в tqdm список base_url и в цикле обрабатывать их.
from tqdm import tqdm
base_urls = [...]
for base_url in tqdm(base_urls):
    hh_parse(base_url, headers)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
netpastor
@netpastor
Python developer
from contextlib import closing
from tqdm import tqdm

total = len(divs)
with closing(tqdm(total=total)) as pbar:
    for div in divs:
        # process div
        pbar.update(1)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы