PyQt4 Scrapy实现

2024-09-28 20:51:52 发布

您现在位置:Python中文网/ 问答频道 /正文

使用scrapy时,我遇到了javascript呈现页面的问题。对于站点论坛的特许经营权,例如链接http://www.idee-franchise.com/forum/viewtopic.php?f=3&t=69,试图删除源html,我无法检索到任何帖子,因为它们似乎是在页面呈现之后“附加”的(可能是通过javascript)。在

所以我在网上寻找这个问题的解决方案,我遇到了https://impythonist.wordpress.com/2015/01/06/ultimate-guide-for-scraping-javascript-rendered-web-pages/。在

我对PYPQ完全陌生,但我希望走捷径,复制粘贴一些代码。在

我想把这一页剪掉。但当我在scrapy中实现这一点时,我得到了以下错误:

QObject::connect: Cannot connect (null)::configurationAdded(QNetworkConfiguration) to QNetworkConfigurationManager::configurationAdded(QNetworkConfiguration)
QObject::connect: Cannot connect (null)::configurationRemoved(QNetworkConfiguration) to QNetworkConfigurationManager::configurationRemoved(QNetworkConfiguration)
QObject::connect: Cannot connect (null)::configurationChanged(QNetworkConfiguration) to QNetworkConfigurationManager::configurationChanged(QNetworkConfiguration)
QObject::connect: Cannot connect (null)::onlineStateChanged(bool) to QNetworkConfigurationManager::onlineStateChanged(bool)
QObject::connect: Cannot connect (null)::configurationUpdateComplete() to QNetworkConfigurationManager::updateCompleted()

如果我丢弃一个页面,那么不会发生错误,但是当我将crawler设置为递归模式时,在第二个链接处,我得到一个错误python.exe停止工作,出现上述错误。在

我将搜索这可能是什么,在我读到的某个地方,QApplication对象应该只启动一次。在

有人能告诉我什么是正确的实施吗?在

蜘蛛

^{pr2}$

PYPQ实现

import sys
from PyQt4.QtCore import QUrl
from PyQt4.QtGui import QApplication
from PyQt4.QtWebKit import QWebPage 

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


class PYQTPageRenderor(object):
    def __init__(self, url):
        self.url = url

    def get_html(self):
        r = Render(self.url)
        return unicode(r.frame.toHtml())

Tags: toimportselfurldefconnect错误页面
1条回答
网友
1楼 · 发布于 2024-09-28 20:51:52

如果您想自己做,正确的实现是创建一个使用PyQt处理请求的downlader middleware。它将被scray实例化一次。

不应该那么复杂,只是

  1. 在项目的middleware.py文件中创建QTDownloader类

  2. 构造函数应该创建QApplication对象。

  3. process_request方法应该执行url加载和HTML获取。请注意,您将返回一个带有HTML字符串的Response对象。

  4. 您可以在类的_cleanup方法中进行适当的清理。

  5. 最后,激活中间件,将其添加到项目的settings.py文件的DOWNLOADER_MIDDLEWARES变量中。

如果您不想编写自己的解决方案,可以使用现有的中间件使用Selenium进行下载,比如scrapy-webdriver。如果你不想拥有一个可见的浏览器,你可以指示它使用PhantomJS。

编辑1: 因此,正如Rejected指出的,正确的方法是使用下载处理程序。想法类似,但是下载应该在download_request方法中进行,并且应该通过将其添加到DOWNLOAD_HANDLERS中来启用。看看WebdriverDownloadHandler的例子。

相关问题 更多 >