使用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())
如果您想自己做,正确的实现是创建一个使用PyQt处理请求的downlader middleware。它将被scray实例化一次。
不应该那么复杂,只是
在项目的
middleware.py
文件中创建QTDownloader类构造函数应该创建
QApplication
对象。process_request
方法应该执行url加载和HTML获取。请注意,您将返回一个带有HTML字符串的Response对象。您可以在类的
_cleanup
方法中进行适当的清理。最后,激活中间件,将其添加到项目的
settings.py
文件的DOWNLOADER_MIDDLEWARES
变量中。如果您不想编写自己的解决方案,可以使用现有的中间件使用Selenium进行下载,比如scrapy-webdriver。如果你不想拥有一个可见的浏览器,你可以指示它使用PhantomJS。
编辑1: 因此,正如Rejected指出的,正确的方法是使用下载处理程序。想法类似,但是下载应该在
download_request
方法中进行,并且应该通过将其添加到DOWNLOAD_HANDLERS
中来启用。看看WebdriverDownloadHandler的例子。相关问题 更多 >
编程相关推荐