Задать вопрос
@kiddle

Асинхронное программирование. Почему не парсит все ссылки?

Здравствуйте!
Задача: Спарсить 78 файлов, в каждом из которых по 50000 ссылок.
Проблема: Переменная total выводит 700-1500, от сюда следует, что выполняются запросы не по всем ссылкам , хотя прокси раздается для каждой. И как заморозить программу при ошибке 429 и 503? Использовал time.sleep() и asyncio.sleep(). Но не то, не другое не сработало.
fields = {
    'B1': 'Полное наименование Заявителя',
    'C1': 'Адрес',
    'D1': 'ОГРН',
    'E1': 'Должность руководителя',
    'F1': 'ФИО',
    'G1': 'Телефон',
    'H1': 'Эл. Почта',
    'I1': 'Рег. номер декларации',
    'J1': 'Дата начала действия',
    'K1': 'Дата окончания',
    'L1': 'Схема',
    'M1': 'Статус',
    'N1': 'Сведения о документах, на основании которых изготовлена продукция',
    'O1': 'ТНВЭД'
}

def get_data(page):
     pass

async def get(url, session, proxy):
    global total
    try:
        async with session.get(url, proxy='http://{}'.format(proxy), timeout=40) as resp:
            total += 1
            if resp.status == 200:
                return await resp.text()
            else:
                write_to_file('bad.txt', url)
            '''if resp.status == 429:
                print('[429] waiting for 30 seconds')
                await asyncio.sleep(time_error429)
            if resp.status == 503:
                print('[503] waiting for 2 minutes')
                await asyncio.sleep(time_error503)'''
    except Exception as e:
        #print('bad proxy', e)
        pass
total = 0
async def save_data_from(url, filename, session, proxy):
    try:
        async with asyncio.Semaphore(semaphore):
            try:
                page = await get(url, session, proxy)
                data = get_data(page)
                if data:
                    text = ''
                    for f in sorted(fields.values()):
                        text += f + ':'
                        text += data[f] + ' '
                    print(text)
                    write_to_excel(data)
            except Exception as e:
                #print('save_data_from', e)
                pass
    except:
        pass

async def run():
    names = get_names_of('pages/')
    it = iter(names)
    cur = 'pages/{}'.format(next(it))
    tasks = []
    urls = open(cur, encoding='utf-8').readlines()
    async with ClientSession(headers=headers) as session:
        for i, url in enumerate(urls):
                if i % 10:
                    proxy = proxy_local.get_proxy()
                task = asyncio.ensure_future(save_data_from(url, cur, session, proxy))
                tasks.append(task)
                end_of_file = url
        #remove_if_done(cur, end_of_file)
        return await asyncio.gather(*tasks)

if __name__ == '__main__':
    proxy_local = Proxy()
    user_agent = UserAgent()
    save = Save()

    semaphore, time_error429, time_error503 = read_conf()

    loop = asyncio.get_event_loop()
    loop.run_until_complete(run())
    loop.close()
    print('total',total)
  • Вопрос задан
  • 474 просмотра
Подписаться 1 Простой 5 комментариев
Пригласить эксперта
Ваш ответ на вопрос

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

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