2017-12-05 5 views
0

저는 Python을 처음 사용하면서도 배우려고하지만이 문제를 처리 할 수 ​​없습니다. 내가 무한 루프에서 클래스에있는 몇 가지 기능을 실행하고 싶습니다. QApplication이기 때문에 QTimer로해야한다는 것을 배웠습니다. 그러나이를 수행하는 방법을 모색 할 때 나는 대안을 찾지 못했습니다. 일반적인 해결책은 다음과 같습니다.QTimer를 사용하여 infinte 루프에서 함수를 실행하십시오.

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

그러나이 코드를 코드에 삽입해도 아무런 차이가 없습니다. 함수, 클래스 등 아래에 삽입하려고했지만 결과를 얻을 수 없습니다. 내 루프 기능은 다음과 같습니다.

__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_() 

아무도 도와 줄 수 없습니까?

+0

어디서 당신은 타이머를 사용 했습니까? – eyllanesc

+0

@eyllanesc 나는 여기에서 배웠다. (https://stackoverflow.com/questions/25080561/pyqt-application-and-infinite-loop) stacoverflow posts –

답변

1

정기적으로 스크레이퍼를 실행한다고 가정합니다. 아래 스크립트는 60 초마다 한 번씩 모든 URL을 다 긁습니다. signal 부분은 무한 루프를 종료 할 수있는 방법을 제공합니다. Ctrl + C (즉 KeyboardInterrupt)을 입력하면 즉시 중지됩니다.

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

다시 에코모로에게 감사하지만, 나는 두려워한다. 그것이 효과를 내지 못했습니다. 그것은 한 번 완벽하게 작동하지만 반복하지는 않습니다. 그건 그렇고,'timer.start (60000)'는 60 분이 아니라 60 분을 의미합니다. 맞습니까? 또한 코드를 직접 복사하여 추가 했으므로'run() '을 별도로 호출한다고 생각합니다. –

+1

@AhmetUluer. 내 업데이트 답변을 참조하십시오. 스크립트의 주된 문제는 현재의 일괄 처리가 처리 된 후 애플리케이션을 종료하는'processCurrentPage' 행을 제거해야한다는 것이 었습니다. – ekhumoro

+0

다시 한 번 고맙습니다. 그것은 완벽하게 작동합니다. –

관련 문제