请求html。 AttributeError:asyncio的__aexit__错误如何解决?

时间:2019-07-29 14:31:52

标签: python asynchronous async-await

无法对url发出异步请求,并且无法从错误中获取响应。

  

文件“ D:\ Dev \ Scripts \ ol_as.py”,主行中的第28行       与request_html.AsyncHTMLSession()作为会话异步:

     

AttributeError:退出

update

1 个答案:

答案 0 :(得分:0)

您非常接近。从实验开始,AsyncHTMLSession不喜欢在上下文管理器中使用并传递给不同的协程。您还需要r.html.arender而不是仅渲染。

如果您想要指定数量的页面中的报价单,这就是我想出的:

from requests_html import AsyncHTMLSession
import asyncio
import json
from itertools import chain


async def get_quotes(s, url):
    r = await s.get(url)
    await r.html.arender()
    var_data = r.html.find('script', containing='var data', first=True).text

    #this part could be improved, I'm basically isolating the json rendered bit:
    *shit, var_data = var_data.split('var data =')
    var_data, *shit = var_data.split('; for (var i in data)')

    data = json.loads(var_data)
    quotes = [post['text'] for post in data]
    return quotes

async def main(max_pages=1):
    s = AsyncHTMLSession()
    tasks = []
    for page in range(1,max_pages+1):
        url = f'http://quotes.toscrape.com/js/page/{page}'
        tasks.append(get_quotes(s,url))
    results = await asyncio.gather(*tasks)
    return list(chain(*(res for res in results)))

all_quotes = asyncio.run(main(5))
print(all_quotes)
相关问题