Python error aiohttp.client_exceptions.ServerDisconnectedError

448 просмотра
0
0 Комментариев

Здравствуйте, пишу парсер, используя async и aiohttp, и при самом парсинге выдает ошибку

aiohttp.client_exceptions.ServerDisconnectedError: None.

С чем это связано и как обработать ошибку, чтобы ожидать, пока не получишь ответ?
Пытаюсь занова отправить запрос, но уже исключение выбрасывает в самой обработке исключения

    try:
            async with client.get(url) as r:
                return await r.text()
        except aiohttp.ServerDisconnectedError:
            log.info("Ошибка сервера:%s",url)
            async with client.get(url) as r:
                return await r.text()

Основной код:

sem=asyncio.Semaphore(20)
 
async def get_html(request):
    return lxml.html.fromstring(request)
 
async def request(client,url,limit):
    with(await limit):
        try:
            async with client.get(url) as r:
                return await r.text()
        except aiohttp.ServerDisconnectedError:
            log.info("Ошибка сервера:%s",url)
            async with client.get(url) as r:
                return await r.text()
 
async def request_json(client,url):
    async with client.get(url) as r:
        return await r.json()
 
 
 
async def parse_list_object(client, list_objects,limit):
        url=list_objects[0]
        city=list_objects[1]
        log.info("Парсинг list_objects: %s | %s",url, city)
        r=await request(client,url,limit)
        log.info("Запрос list: %s", city)
        html=await get_html(r)
        urls_object=[]
        for elem in html.xpath(".//div[@class='c-product-tile sel-product-tile-main ']"):
            error_div=elem.xpath(".//span[@class='c-product-label__text']")
            if(error_div!=[]):
                error_div=error_div[0]
                error_text=error_div.xpath("span[2]/text()")[0]
                if(error_text!="Витринный образец"):
                    continue
            link_object=url_main+elem.xpath(".//h4[@class='e-h4 u-pb-0']/a")[0].get("href")+"/shopdirections?cityId="+city
            url_temp=[]
            url_temp.append(link_object)
            url_temp.append(city)
            urls_object.append(url_temp)
            log.info("Ссылка телефона: %s - страница List: %s",link_object,url)
        log.info("Спарсен  - %s",url)
        if(len(urls_object)>0):
            print("Количество спарсенных ссылок:",len(urls_object))
            return urls_object
    # except Exception as err:
    #     print(err)
 
 
 
async def main(urls):
    #async with aiohttp.ClientSession() as client:
    #    coroutines = [parse_city(client, url) for url in urls]
    #    completed, pending =await asyncio.wait(coroutines)
    #    for item in completed:
    #        cities=item.result()
    #async with aiohttp.ClientSession() as client:
    #    coroutines1=[parsing_first_list(client, city_url,limit=sem) for city_url in cities]
    #    completed, pending=await asyncio.wait(coroutines1)
    #    list_objects=[]
    #    for item in completed:
    #        list_objects += item.result()
    async with aiohttp.ClientSession() as client:
        coroutines2=[parse_list_object(client, url_object,limit=sem) for url_object in list_objects]
        completed, pending=await asyncio.wait(coroutines2)
        url_object=[]
        for item in completed:
            item= item.result()
            print(item)
            #url_object+=item
 
if __name__ == '__main__':
 
    log = logging.getLogger(__name__)
    format = '%(asctime)s %(levelname)s:%(message)s'
    logging.basicConfig(format=format, level=logging.INFO)
    log.info("Start")
    event_loop = asyncio.get_event_loop()
 
    try:
        t_start = time.time()
        event_loop.run_until_complete(main(url_select_city))
        t_end = time.time()
        log.info("Time End: %s", t_end - t_start)
    finally:
        event_loop.close()


Добавить комментарий

0 Answers

Python Опубликовано 14.12.2018
Напишите свой ответ на данный вопрос.
Scroll Up