QWebEnginePage runJavaScript()

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Ernie1412
User
Beiträge: 161
Registriert: Freitag 10. Januar 2020, 20:38

ich hab eine Side wo ich webscraping betreiben möchte.
die Bilder sind in einem Javascript als "placeholder" verpackt.
ich bin immer wie folgt vorgegangen:

Code: Alles auswählen

                    driver = webdriver.Firefox(options=Options,executable_path=pfad+ r'\tools\geckodriver.exe')
                    driver.get(url.format(index))                                   
                    iterations = 0
                    while iterations < 3: 
                        html = driver.execute_script("return document.documentElement.outerHTML")
                        time.sleep(2)                                                                           
                        driver.execute_script("window.scrollTo(0, window.scrollY + 800)")
                        iterations += 1
                        ...
                    sel_soup = BeautifulSoup(html, 'html.parser')
                        
usw.
jetzt möchte ich das ganze mit QWebEnginePage machen.
Ich hab festgestelt das er schneller ist als webdriver
wie kriege ich das Javascript am laufen ?
da hab ich folgendes gefunden:

Code: Alles auswählen

class Page(QWebEnginePage):
    def __init__(self, url):
        self.app = QApplication(sys.argv)
        QWebEnginePage.__init__(self)
        self.html = ''
        self.loadFinished.connect(self._on_load_finished)
        self.load(QUrl(url))      
        self.app.exec_()

    def _on_load_finished(self):
        self.html = self.toHtml(self.Callable)
        print('Load finished')

    def Callable(self, html_str):
        self.html = html_str
        self.app.quit()
    page = Page(url).runJavascript("return document.documentElement.outerHTML") 
    soup = BeautifulSoup(page.html,'lxml')
so funktioniert das aber nicht ;(
page = Page(url).runJavascript("return document.documentElement.outerHTML")
AttributeError: 'Page' object has no attribute 'runJavascript'
wo kommt das runJavascript() rein im script ?

kann ich irgendwie herrausfinden das die Bilder geladen sind ?
ich hab das ja bisher mit 3x jeweils :

Code: Alles auswählen

                        time.sleep(2)                                                                           
                        driver.execute_script("window.scrollTo(0, window.scrollY + 800)")
gemacht.
Also der ladet die Side, schläft für 2 sekunden(damit er zeit hat die Bilder zu laden)
scrollt dann 800pixel runter und wartet wieder 2 sekunden usw.
gibt es eine möglichkeit abzufragen ob die Bilder geladen sind oder geht das wieder nur mit sleep(2) usw. ?
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Ernie1412: Wo kommt den `Page` her? Das müsstest Du noch zeigen. Denn die Klasse `Page` die Du da zeigst gibt es an der Stelle wo Du `Page` verwendest noch gar nicht. Das sollte da wohl auch eher nicht auf Klassenebene stehen.

Die `toHTML()`-Methode hat keinen Rückgabewert, es macht also keinen Sinn das `None` an das Attribut zu binden.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Ernie1412
User
Beiträge: 161
Registriert: Freitag 10. Januar 2020, 20:38

Code: Alles auswählen

from PyQt5.QtWebEngineWidgets import QWebEnginePage
ich hab runJavaScript() mit kleinen s geschrieben. aber auch wenn ich es runJava"S"cript() groß schreibe macht er nix nur die fehlermeldung ist weg
in der def __init__:

Code: Alles auswählen

        self.html = ''       
        iterations=0
        while iterations < 3: 
            self.runJavaScript("return document.documentElement.outerHTML")
            time.sleep(2) 
            self.runJavaScript("window.scrollTo(0, window.scrollY + 800)") 
            iterations += 1 
JavaScript("window.scrollTo(0, window.scrollY + 800)") kennt er glaube ich garnicht den Befehl
folgendes kommt: js: Uncaught SyntaxError: Illegal return statement
ich denke das hat was mit dem scrollTo zu tun

die placeholder sind damit immernoch leer src=""
das aufruf-Script habe ich aber so auch schon auf 2 Sides gesehen

also mit onloadfinish und Callable
ich hoffe man kann mir helfen, irgendwie haben alle probleme das javascript zu rendern, scrapy mit splash ging irgendwie nciht, request-html freezt immer mit etlichen chromium im taskmanager, obwohl ich close() verwendetete
nur selenium ging, aber das saulangsam
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Ernie1412: Das der erste Aufruf kein gültiges JavaScript enthält hat nichts mit dem anderen Aufruf zu tun. ``return irgendwas`` ist für sich genommen in JavaScript genau so ungültig wie es das in Python ist.

Du bist dabei Dir Selenium nachzuprogrammieren. Das macht einfach nur Arbeit und birgt viel Potential falsch zu machen wenn man sich versucht dem durch Code-Raten von inhärent asynchronem/nebenläufigen Code zu nähern.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten