【问题标题】:Scraping websites with protected content using PyQt5使用 PyQt5 抓取具有受保护内容的网站
【发布时间】:2020-09-24 22:51:37
【问题描述】:

我正在尝试从需要登录的动态网站上抓取内容。我发现这段代码适用于 PyQt4 Scraping Javascript driven web pages with PyQt4 - how to access pages that need authentication?

#!/usr/bin/python
# -*- coding: latin-1 -*-
import sys
import base64
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from PyQt4.QtWebKit import *
from PyQt4 import QtNetwork

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

    username = 'username'
    password = 'password'

    base64string = base64.encodestring('%s:%s' % (username, password))[:-1]
    authheader = "Basic %s" % base64string

    headerKey = QByteArray("Authorization")
    headerValue = QByteArray(authheader)

    url = QUrl(url)
    req = QtNetwork.QNetworkRequest()
    req.setRawHeader(headerKey, headerValue)
    req.setUrl(url)

    QWebPage.__init__(self)
    self.loadFinished.connect(self._loadFinished)


    self.mainFrame().load(req)
    self.app.exec_()

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

def main():
    url = 'http://www.google.com'
    r = Render(url)
    html = r.frame.toHtml()

我怎样才能将它们翻译成适用于 PyQt5 ?

【问题讨论】:

    标签: python python-3.x pyqt5


    【解决方案1】:

    你必须使用 QWebEnginePage 所以任务是异步的,因为我从 HTML 中获得,QtWebEngine 不使用 QNetworkRequest 所以你必须使用 QWebEngineHttpRequest:

    import sys
    
    from PyQt5.QtCore import QByteArray, QUrl
    from PyQt5.QtWidgets import QApplication
    from PyQt5.QtWebEngineCore import QWebEngineHttpRequest
    from PyQt5.QtWebEngineWidgets import QWebEnginePage
    
    
    class Render(QWebEnginePage):
        def __init__(self, url):
            app = QApplication(sys.argv)
            QWebEnginePage.__init__(self)
            self.loadFinished.connect(self._loadFinished)
    
            self._html = ""
    
            username = "username"
            password = "password"
            base64string = QByteArray(("%s:%s" % (username, password)).encode()).toBase64()
            request = QWebEngineHttpRequest(QUrl.fromUserInput(url))
            equest.setHeader(b"Authorization", b"Basic: %s" % (base64string,))
    
            self.load(request)
    
            app.exec_()
    
        @property
        def html(self):
            return self._html
    
        def _loadFinished(self):
            self.toHtml(self.handle_to_html)
    
        def handle_to_html(self, html):
            self._html = html
            QApplication.quit()
    
    
    def main():
        url = "http://www.google.com"
        r = Render(url)
        print(r.html)
    
    
    if __name__ == "__main__":
        main()
    

    【讨论】:

    • 感谢@eyllanesc,当前的解决方案会吐出嵌入在 html 中的 JavaScript 代码块。如何获取 javascript 正在加载的页面内容?
    • @cnuvadga 我不明白你,我的代码只解决了你帖子的当前问题,仅此而已。如果您有其他问题,那么您必须创建一个新帖子并提供minimal reproducible example。在 SO,我们不帮助项目,但我们解决具体问题。
    • 加载页面内容后,尝试访问类名为“grp_0”的html div元素,但返回无
    • @cnuvadga 1) 问题是如何访问需要标头进行身份验证的页面,这实际上是将代码从 pyqt4 (QtWebkit) 转换为 PyQt5 (QtWebEngine) 所以我的回答就是这样做的。 2)虽然这不是我的职责,但我看到那个页面“google.com”没有任何div grp_0。正如我已经指出的那样:如果您还有其他问题(访问某个 div),那么您必须使用 MRE 创建一个新帖子。
    • @cnuvadga 3)我不会再讨论这些问题,但我只会回复那些直接涉及我的答案的问题,所以我请你阅读How to Ask并传递tour所以你知道(或重读)SO 规则。
    猜你喜欢
    • 2015-07-01
    • 1970-01-01
    • 2022-01-07
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多