使用PyQt / QtWebkit进行Web爬取多个链接
||
我正在尝试抓取一个大型的政府记录网站,该网站需要一种“雪球”方法,即从主搜索页面开始,然后跟随抓取器找到的每个链接到下一页。
我已经可以使用PyQt加载此SiteScraper教程的主页。
import sys
from PySide.QtGui import *
from PySide.QtCore import *
from PySide.QtWebKit import *
from BeautifulSoup 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()
def main():
baseUrl = \'http://www.thesite.gov\'
url = \'http://www.thesite.gov/search\'
r = Render(url)
html = r.frame.toHtml()
# use BeautifulSoup to cycle through each regulation
soup = BeautifulSoup(html)
regs = soup.find(\'div\',{\'class\':\'x-grid3-body\'}).findAll(\'a\')
# cycle through list and call up each page separately
for reg in regs:
link = baseUrl + reg[\'href\']
link = str(link)
# use Qt to load each regulation page
r = Render(link)
html = r.frame.toHtml() # get actual rendered web page
问题是当我尝试呈现新网页时出现此错误:
RuntimeError: A QApplication instance already exists.
我知道该函数正在尝试调用另一个QApplication实例。但是,如何导航到具有相同实例的新页面?
class Render(QWebPage):
def __init__(self, app, url):
QWebPage.__init__(self)
self.loadFinished.connect(self._loadFinished)
self.mainFrame().load(QUrl(url))
app.exec_()
def _loadFinished(self, result):
self.frame = self.mainFrame()
def main():
app = QApplication(sys.argv)
baseUrl = \'http://www.thesite.gov\'
url = \'http://www.thesite.gov/search\'
r = Render(app, url)
html = r.frame.toHtml()
没有找到相关结果
已邀请:
4 个回复
你换
或
仍然可能会更容易。)答案是不要制作多个QApplication。您不允许这样做。让
变成
,然后使用
,而不会打扰call8ѭ。如果那不起作用,请在另一个ѭ9中运行所有内容。
冲汉
与OP相比,在此处张贴了一个简化的示例,以演示基本问题和解决方案。
肉脓措伪
用
然后,您可以像这样简单地抓取数据:
最后,您应该使用QWebView而不是QWebPage。您可以将其设置为像服务器一样受套接字控制。这是我的工作:
庞协腿宛炯