Async Seite laden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Ernie1412
User
Beiträge: 161
Registriert: Freitag 10. Januar 2020, 20:38

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)

__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Auch asynchrone Funktionen kennen Argumente. Die kann man dann uebergeben. Also zb die URLs.
Ernie1412
User
Beiträge: 161
Registriert: Freitag 10. Januar 2020, 20:38

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:
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Keine Ahnung, du zeigst da irgend einen Ausschnitt ohne Kontext. Vollstaendigen Code, und vollstaendigen Traceback. Wie immer.
Ernie1412
User
Beiträge: 161
Registriert: Freitag 10. Januar 2020, 20:38

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
Antworten