使用Python的QtWebkit呈现基于Javascript的页面,获取QThread:在线程仍在运行时被销毁

时间:2016-11-11 05:57:08

标签: python multithreading pyqt beautifulsoup web-crawler

我正在尝试为通过JavaScript加载的网页编写一个Beautifulsoup抓取工具,这是Beautifulsoup无法解析的。为了解决这个问题,我在使用QtWebkit渲染页面时跟随this tutorial,然后使用Beautifulsoup从生成的HTML中提取页面中的所有href。

然而,页面抓取非常大,在它完成获取这些链接之前,它会抛出错误“QThread:在线程仍在运行时被销毁”。许多人已经发布了关于这个错误的问题并得到了答案,但是这些都是针对PyQT作为应用程序核心的更复杂的项目,因此这些响应假设熟悉库并且我在尝试应用它们时遇到了麻烦对我而言。

似乎我需要通过将线程保存在变量中来防止线程被垃圾收集,但是正确的方法可以避免我。

这是我的代码:

import sys
from PyQt4.QtGui import *  
from PyQt4.QtCore import *  
from PyQt4.QtWebKit import *  
from bs4 import BeautifulSoup

class Render(QWebPage):  
  def __init__(self, url):  
    self.app = QApplication(sys.argv)  
    QWebPage.__init__(self)

    self.loadFinished.connect(self._loadFinished)  
    self.mainFrame().load(QUrl(url))  
    self.app.exec_()  

  def _loadFinished(self, result):  
    self.frame = self.mainFrame()  
    self.app.quit()  

url = 'http://www.lolesports.com/en_US/msi/msi_2016/schedule/default'  
r = Render(url)  
result = r.frame.toHtml()

soup = BeautifulSoup(result, "html.parser")
for link in soup.find_all('a'):
    print(link.get('href'))

1 个答案:

答案 0 :(得分:0)

脚本没有明显的错误,除了一些无害的Qt警告信息之外,它似乎或多或少地按预期工作。

你得到的Qt消息实际上并没有真正的诊断,并不一定表示致命的错误情况。所以我怀疑脚本实际上正在为你工作,你可能只是误解了输出。

如果你想摆脱所有的Qt消息,请将以下行放在脚本的顶部(就在导入的下方):

qInstallMsgHandler(lambda *args: None)

PS:这是我得到的确切输出:

QFont::setPixelSize: Pixel size <= 0 (0)
QFont::setPixelSize: Pixel size <= 0 (0)
QNetworkReplyImplPrivate::error: Internal problem, this method must only be called once.
QFont::setPixelSize: Pixel size <= 0 (0)
QFont::setPixelSize: Pixel size <= 0 (0)
http://na.leagueoflegends.com/en/
http://na.leagueoflegends.com/en/
http://na.leagueoflegends.com/en/news/
http://gameinfo.na.leagueoflegends.com/en/game-info/
http://nexus.leagueoflegends.com/
http://www.lolesports.com/en_US
http://boards.na.leagueoflegends.com/en/
http://ulol.leagueoflegends.com/
https://support.riotgames.com/hc/en-us
https://na.merch.riotgames.com/en/
http://na.leagueoflegends.com/en/news/
http://gameinfo.na.leagueoflegends.com/en/game-info/
http://nexus.leagueoflegends.com/
http://www.lolesports.com/en_US
http://boards.na.leagueoflegends.com/en/
http://ulol.leagueoflegends.com/
https://support.riotgames.com/hc/en-us
https://na.merch.riotgames.com/en/
http://signup.na.leagueoflegends.com/en
None
http://www.lolesports.com/en_US
http://eu.lolesports.com/en
http://eu.lolesports.com/pl
http://eu.lolesports.com/en
http://eu.lolesports.com/fr
http://eu.lolesports.com/es
http://eu.lolesports.com/de
http://lan.lolesports.com/
http://las.lolesports.com/
http://lolesports.com.br/
http://www.lolespor.com/
http://oce.lolesports.com/
javascript:;
javascript:;
javascript:;
javascript:;