java 抓取网站内容 异常Server returned HTTP response code: 403 ,求解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 抓取网站内容 异常Server returned HTTP response code: 403 ,求解相关的知识,希望对你有一定的参考价值。


  ,不能从此网站中抓取内容;Windows );403命令是禁止恶意访问此网站;DigExt)"   NT;   .0;如果是服务器端禁止抓取, User-Agent".
connection;5;MSIE (compatible.0  Mozilla/4: ".setRequestProperty(",那么这个你可以通过设置User-Agent来欺骗服务器; HTTP ,提问者您好

参考技术A 403 错误,在错误中会提示是哪个文件,哪行错误

使用 PyQt5 抓取具有受保护内容的网站

【中文标题】使用 PyQt5 抓取具有受保护内容的网站【英文标题】:Scraping websites with protected content using 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 ?

【问题讨论】:

【参考方案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 规则。

以上是关于java 抓取网站内容 异常Server returned HTTP response code: 403 ,求解的主要内容,如果未能解决你的问题,请参考以下文章

如何利用java中url实现网页内容的抓取

如何用Java抓取网页的具体内容

使用Jsoup获取网页内容超时设置

如何从另一个网站“抓取”内容

使用安全登录抓取网站内容

java异常和异常体系