2017-12-05 3 views
0

Ich bin neu in Python und versuche immer noch zu lernen, aber ich konnte nicht mit diesem Problem umgehen. Ich möchte einige Funktionen (die in der Klasse sind) in einer Endlosschleife ausführen. Weil es eine QApplication ist, habe ich gelernt, dass ich es mit einem QTimer machen sollte. Als ich jedoch entdeckte, wie es geht, konnte ich keine funktionierende Alternative finden. Eine gemeinsame Lösung ist:Verwenden Sie QTimer, um Funktionen in einer Infinet-Schleife auszuführen

timer = QTimer() 
timer.timeout.connect(function) 
timer.start(60000) 

Aber wenn ich diese in meinen Code einfügen macht es keinen Unterschied. Ich habe versucht, es unter Funktionen, Klasse usw. einzufügen, konnte aber kein Ergebnis erhalten. Meine Funktionen zum loopen sind hier:

__author__ = 'pc' 
import requests 
from bs4 import BeautifulSoup 
from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets 
import sqlite3 
import sys, getopt, time 
from PyQt5.QtCore import QTimer 

records = [] 
def scrape_page(url, html): 
    soup = BeautifulSoup(html, 'html.parser') 
    data = soup.find('div', class_='tablo_dual_board') 
    try: 
     datas = data.text.splitlines() 
     datas1 = list(filter(None, datas)) 
     records.append(datas1) 
    except: 
     pass 

def process_records(): 
    # add record to database ... 
    print('process records:', len(records)) 

def generate_urls(): 
    onexurl = "https://1xbahis19.com/en/live/Football/" 
    reply = requests.get(onexurl) 
    soup = BeautifulSoup(reply.content, "html.parser") 
    income = soup.find_all("ul", {"id":"games_content"}) 
    links = soup.find_all("a", {"class": "c-events__name"}) 
    urls = [] 
    for matchlink in links: 
     urls.append("https://1xbahis19.com/en/"+(matchlink.get("href"))) 
    return urls 

class WebPage(QtWebEngineWidgets.QWebEnginePage): 
    def __init__(self): 
     super(WebPage, self).__init__() 
     self.loadFinished.connect(self.handleLoadFinished) 

    def start(self, urls): 
     self._urls = iter(urls) 
     self.fetchNext() 

    def fetchNext(self): 
     try: 
      url = next(self._urls) 
     except StopIteration: 
      return False 
     else: 
      self.load(QtCore.QUrl(url)) 
     return True 

    def processCurrentPage(self, html): 
     scrape_page(self.url().toString(), html) 
     if not self.fetchNext(): 
      process_records() 
      print(records) 
      QtWidgets.qApp.quit() 

    def handleLoadFinished(self): 
     self.toHtml(self.processCurrentPage) 

app = QtWidgets.QApplication(sys.argv) 
webpage = WebPage() 
webpage.start(generate_urls()) 
timer = QTimer() 
timer.timeout.connect(WebPage) 
timer.start(60000) 
app.exec_() 

Kann mir bitte jemand helfen?

+0

Woher hast du oder wer hat dir gesagt, dass du einen Timer benutzen sollst? – eyllanesc

+0

@eyllanesc Ich habe gelernt von [hier] (https://stackoverflow.com/questions/25080561/pyqt-application-and-infinite-loop) und andere stacoverflow Beiträge –

Antwort

1

Ich nehme an, Sie möchten den Schaber in regelmäßigen Abständen laufen lassen. Das folgende Skript wird alle URLs alle 60 Sekunden abkratzen. Der signal Teil gibt dort eine Möglichkeit, die Endlosschleife zu beenden - tun Sie einfach Ctrl + C (d. H. KeyboardInterrupt), und es wird sofort gestoppt.

import requests 
from bs4 import BeautifulSoup 
from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets 
import sqlite3 
import sys, getopt, time 
from PyQt5.QtCore import QTimer 

import signal 
# press Ctrl+C to stop the script 
signal.signal(signal.SIGINT, signal.SIG_DFL) 

records = [] 
def scrape_page(url, html): 
    print('scraping page:', url) 
    soup = BeautifulSoup(html, 'html.parser') 
    data = soup.find('div', class_='tablo_dual_board') 
    try: 
     datas = data.text.splitlines() 
     datas1 = list(filter(None, datas)) 
     records.append(datas1) 
    except: 
     pass 

def process_records(): 
    # add record to database ... 
    print('processed records:', len(records)) 
    # clear the current records 
    del records[:] 
    # re-run after a timeout 
    QTimer.singleShot(60000, run) 

def run(): 
    print('running scraper...') 
    webpage.start(generate_urls()) 

def generate_urls(): 
    print('generating urls...') 
    onexurl = "https://1xbahis19.com/en/live/Football/" 
    reply = requests.get(onexurl) 
    soup = BeautifulSoup(reply.content, "html.parser") 
    income = soup.find_all("ul", {"id":"games_content"}) 
    links = soup.find_all("a", {"class": "c-events__name"}) 
    urls = [] 
    for matchlink in links: 
     urls.append("https://1xbahis19.com/en/"+(matchlink.get("href"))) 
    return urls 

class WebPage(QtWebEngineWidgets.QWebEnginePage): 
    def __init__(self): 
     super(WebPage, self).__init__() 
     self.loadFinished.connect(self.handleLoadFinished) 

    def start(self, urls): 
     self._urls = iter(urls) 
     self.fetchNext() 

    def fetchNext(self): 
     try: 
      url = next(self._urls) 
     except StopIteration: 
      return False 
     else: 
      self.load(QtCore.QUrl(url)) 
     return True 

    def processCurrentPage(self, html): 
     scrape_page(self.url().toString(), html) 
     if not self.fetchNext(): 
      process_records() 

    def handleLoadFinished(self): 
     self.toHtml(self.processCurrentPage) 

app = QtWidgets.QApplication(sys.argv) 
webpage = WebPage() 
run() 
app.exec_() 
+0

Danke nochmal ekhumoro, aber ich fürchte ich konnte es nicht funktionieren lassen. Es funktioniert perfekt einmal, aber nicht Schleife. By the way, wie ich weiß, "timer.start (60000)" bedeutet 60 Sekunden nicht 60 Minuten, oder? Außerdem habe ich Ihre Codes direkt kopiert und hinzugefügt, also denke ich, dass sie 'run()' separat aufruft. –

+1

@AhmetUluer. Siehe meine aktualisierte Antwort. Ich denke, das Hauptproblem mit Ihrem Skript war, dass Sie die Zeile in 'processCurrentPage 'entfernen mussten, die die Anwendung nach der Verarbeitung des aktuellen URL-Stapels beendet hat. – ekhumoro

+0

Immer wieder vielen Dank, du hast meine Tage gerettet. Es funktioniert perfekt. –

Verwandte Themen