Seite 1 von 1

Async Seite laden

Verfasst: Samstag 5. Dezember 2020, 15:41
von Ernie1412
ich bin immer so vorgegangen:

Code: Alles auswählen

session = HTMLSession()
results = session.get(url_complete,headers=HEADERS)
links=results.html.xpath('//a[@class="sc-1z0w6pb-9 jLcJOe"]/@href')
for i,link in enumerate(links):
    try:
       image=results.html.find('img')[i]
       img=image.attrs['src']
       filename=image.attrs['title']        
       img_r = session.get(img,stream=True)
       CoverPfad=os.path.join(pfad,"images",filename+".webp")
       with open(CoverPfad, 'wb') as output_file:
            shutil.copyfileobj(img_r.raw,output_file)
       del img_r
das dauert halt seine Zeit
jetzt habe ich mal ein test gemacht wie man das async hinkriegt.
von 14sec. normale Version
auf 1.5 sec. async
Aber ich habe jedes einzeln ohne for schleife gemacht. wie kann ich das in eine schleife generieren:

Code: Alles auswählen

asession = AsyncHTMLSession()
async def a1():
        res = await asession.get(url+links[0],headers=HEADERS)
        image=results.html.find('img')[0]
        ...
async def a2():
        res = await asession.get(url+links[1],headers=HEADERS)
        image=results.html.find('img')[1] 
        ...             
        
usw.
wie kann ich async def (): irgendwie automatisieren ?
ich kann ja "def" und dann ein Namen nicht einfach 'a'+str(i) nehmen, gibts da einen andere Möglichkeit für ?
als Beispiel habe ich: https://requests.readthedocs.io/project ... en/latest/
genommen und dieses Script:
But async is fun when fetching some sites at the same time:

Code: Alles auswählen

from requests_html import AsyncHTMLSession
 asession = AsyncHTMLSession()

 async def get_pythonorg():
 r = await asession.get('https://python.org/')

 async def get_reddit():
 r = await asession.get('https://reddit.com/')

 async def get_google():
 r = await asession.get('https://google.com/')

 session.run(get_pythonorg, get_reddit, get_google)


Re: Async Seite laden

Verfasst: Samstag 5. Dezember 2020, 16:13
von __deets__
Auch asynchrone Funktionen kennen Argumente. Die kann man dann uebergeben. Also zb die URLs.

Re: Async Seite laden

Verfasst: Samstag 5. Dezember 2020, 16:28
von Ernie1412
ich muss die doch in eine definition reinpacken oder wie sonst starte ich das mit session.run() ?

Code: Alles auswählen

asession.run(a1(links[0]),a1(links[1]))
File "D:\Python_v390\lib\site-packages\requests_html.py", line 771, in run
tasks = [
File "D:\Python_v390\lib\site-packages\requests_html.py", line 772, in <listcomp>
asyncio.ensure_future(coro()) for coro in coros
TypeError: 'coroutine' object is not callable
sys:1: RuntimeWarning: coroutine 'a1' was never awaited

also so nicht :cry:

Re: Async Seite laden

Verfasst: Samstag 5. Dezember 2020, 17:00
von __deets__
Keine Ahnung, du zeigst da irgend einen Ausschnitt ohne Kontext. Vollstaendigen Code, und vollstaendigen Traceback. Wie immer.

Re: Async Seite laden

Verfasst: Samstag 5. Dezember 2020, 17:16
von Ernie1412

Code: Alles auswählen

from requests_html import HTMLSession
from requests_html import AsyncHTMLSession
import functools

url='https://xyz.org'
HEADERS = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36'}

session = HTMLSession()
results = session.get(url,headers=HEADERS)

links=results.html.xpath('//a[@class="sc-1z0w6pb-9 jLcJOe"]/@href')
async def daten_holen(link):
    res = await asession.get(url+link,headers=HEADERS)           
    Titel=res.html.xpath('//h1[@data-test-component="VideoTitle"]/text()',first=True)
    
asession = AsyncHTMLSession()
links = [ 
    functools.partial(daten_holen, link) for link in links
]

asession.run(*links))
damit gehts nun :)
ich hab doch im 1. Post alles geschriebene vom Code
ok ich hab das mitr asession.run() vergessen, Sorry