PyQt5 WebEngine mehrere WebViews mit jeweils unterschiedlichen Proxys in einem Fenster funktioniert nur bei den ersten beiden Proxys?
Hallo liebe Community,
Ich wollte mit PyQt eine Oberfläche Implementieren, die mehre Websites mit unterschiedlichen Proxys pro Laufzeit aufruft, und anzeigt.
Das soll dann ungefähr so aussehen:
, nur, dass beim 2. Fenster eine andere Proxyaddresse stehen sollte. Hier ist mein Code:
import json
import random
import threading
import time
from typing import *
import requests
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import requests, re
from PyQt5.QtWebEngineWidgets import *
import PyQt5.QtNetwork
import PyQt5.QtWidgets
def refresh_browser():
time.sleep(10)
host, port, ct = random.choice(proxylist)
print(host, port, ct)
PyQt5.QtNetwork.QNetworkProxy.setApplicationProxy(
PyQt5.QtNetwork.QNetworkProxy(PyQt5.QtNetwork.QNetworkProxy.Socks5Proxy, host, port))
window.refresh.click()
proxylist = [(a, b, c) for a, b, c in json.load(open("proxies.txt")) if c == "DE"]
available_proxiy_protocols = {"socks5":PyQt5.QtNetwork.QNetworkProxy.Socks5Proxy, "http":PyQt5.QtNetwork.QNetworkProxy.HttpProxy}
class Browser(QMainWindow):
def __init__(self, url, proxylist: List):
super(Browser, self).__init__()
self.window = QWidget()
self.layout = QVBoxLayout()
self.horizontal = QHBoxLayout()
self.browsers = []
self.c = 0
self.current_url = url
self.button = QPushButton()
self.button.clicked.connect(lambda: self.navigate(self.current_url))
self.refresh = PyQt5.QtWidgets.QPushButton()
self.refresh.clicked.connect(lambda: self.refr(self.current_url))
for proxy in proxylist:
#HIER MUSS ETWAS GEÄNDERT WERDEN
self.browser = QWebEngineView()
self.layout.addLayout(self.horizontal)
self.layout.addWidget(self.browser)
self.browser.setUrl(QUrl(self.current_url))
self.browsers.append(self.browser)
self.window.setLayout(self.layout)
self.window.show()
def navigate(self, url): self.browser.setUrl(QUrl(url))
def refr(self, url):
for br in self.browsers:
br.setUrl(QUrl(url))
host, port, ct = random.choice(proxylist)
print(host, port, ct)
#PyQt5.QtNetwork.QNetworkProxy.setApplicationProxy(PyQt5.QtNetwork.QNetworkProxy(PyQt5.QtNetwork.QNetworkProxy.Socks5Proxy, host, port))
app = QApplication([])
proxys = [("104.255.170.63", 60757), ("103.241.227.114", 6667)]
ip = "https://httpbin.org/ip"
PyQt5.QtNetwork.QNetworkProxy.setApplicationProxy(PyQt5.QtNetwork.QNetworkProxy(PyQt5.QtNetwork.QNetworkProxy.Socks5Proxy, proxys[0][0], proxys[0][1]))
print(proxys)
window = Browser(ip, proxys)
app.exec()
Kann mir jemand helfen, uns mir sagen, wie ich nach jederm Browserfenster, das erstellt wird, einen anderen Proxy setzen kann?
Vielen Dank Im Voraus
LG Lukas Zander
1 Antwort
Du kannnst für eine einzelne QWebPage einen bestimmten Proxy definieren, indem du ihr eine entsprechende QNetworkAccessManager-Instanz überreichst.
- QNetworkAccessManager-Instanz anlegen und Proxy setzen (setProxy)
- Instanz an QWebPage überreichen (setNetworkAccessManager)
Die aktuelle QWebPage-Instanz erhältst du über die page-Methode des QWebView.
Für QWebEngineView-Objekte funktioniert das allerdings nicht.
Jedes QWebView besitzt eine eigene QWebPage. Jede QWebPage benutzt einen eigenen Proxy.
Ok, und warum kann ich dann nicht einfach mehrer WebViwes erstellen, und davor einen neuen ApplicationProxy setzen? Weist du wie ich jeder webview direkt eine Proxy zuweisen kann, denn bei mir wird ab dem 2. ApplicationProxy kein neuer mehr verwendet?
Entweder du setzt einen Proxy, der für die gesamte Anwendung gilt (setApplicationProxy) oder du teilst jeder QWebPage einen individuellen Proxy zu. Andere direkt unterstützte Möglichkeiten kenne ich nicht.
Und wie Teile ich jeder QWebPage einen individuellen Proxy zu?
Ich habe das gerade mal getestet, es funktioniert aber nicht, denn es nutzt den Dedault-Proxy:
self.browser = PyQt5.QtWebEngineWidgets.QWebEngineView()
proxy_obj = PyQt5.QtNetwork.QNetworkProxy(PyQt5.QtNetwork.QNetworkProxy.ProxyType.Socks5Proxy, proxy[0],
proxy[1])
PyQt5.QtNetwork.QNetworkAccessManager().setProxy(proxy_obj)
Du hast irgendwie meine Antwort nicht richtig gelesen, oder? Weil du arbeitest weiter mit einem QWebEngineView und den zweiten Schritt sehe ich auch nicht in deinem Code.
Bei mir gibt es aber kein QWebPage, höchstens kann ich QWebEnginePage importieren, die hat aber keine Methode setNetworkAccessManager
vllt kurz dc, stehe ganz schön auf dem Schlauch sry (CoolBlockZock#2993)
Ok, ich sehe, ich bin auf einem veralteten Stand. Die QWebView-Komponente wurde mit Version 5.6 entfernt. Das heißt, direkt vom Framework besteht keine Möglichkeit, individuelle Proxies zu setzen.
Qt WebEngine does not feature an API for setting proxies directly. Anyhow, it can
1.) Use the system proxy settings
2.) Use any proxy set explicitly in Qt Network
ok, danke, ich versuche mal, ne alter version zu verwenden
Du findest die beiden relevanten Module dann in PyQt5.QtWebKitWidgets.
Ungefährer Code:
webview = QWebView()
networkAccessManager = NetworkAccessManager()
networkAcessManager.setProxy(""" proxy ... """)
webview.page().setNetworkAccessManager(networkAccessManager)
Laut meinem letzten Projekt mit QWebView habe ich dort die Version 5.12 genutzt.
Ok ja mit Python 37 geht das noch trotzdem danke
Ok, das mein also, dass das mit QWebPage mit mehreren Fenstern jeweils unterschiedlicher proxys geht? Danke