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 ,提问者您好
使用 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 ,求解的主要内容,如果未能解决你的问题,请参考以下文章