Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 17, 2016 14:48:31

dima2881
Зарегистрирован: 2016-01-09
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

Pyqt работа с несколькими экземплярами qwebview

Мне нужно как можно быстрее обработать большое количество логинов и паролей. Для этого создаю несколько экземпляров qwebview, там открываю нужный сайт пытаюсь авторизоваться (сейчас пока 1 логин и пароль используется, так как пока только присматриваюсь к работе через pyqt).
Возникла проблема в том, что открывается как и положено несколько окон с сайтом, но авторизация начинается только в 1 из окон, в остальных только форма входа прогружается и больше ничего не происходит. Помогите понять в чем проблема может быть?

P.S Ещё вопрос правильно я делаю, что использую qwebview? Просто окно по сути мне не надо и в конечном приложении я его отображать не буду. Мне только нужно, чтобы js код на старнице интерпретировался и чтобы я мог авторизоваться сохранить итоговую страницу.
Может мне на основе другого класса производить парсинг, чтобы ресурсов меньше тратилось?

import sys
from PyQt4 import QtCore, QtGui, QtWebKit
from PyQt4 import QtNetwork
 
 
class NetworkAccessManager(QtNetwork.QNetworkAccessManager):
    def __init__(self, *arg, **args):
        QtNetwork.QNetworkAccessManager.__init__(self, *arg, **args)
        proxy = QtNetwork.QNetworkProxy()
        proxy.setType(QtNetwork.QNetworkProxy.Socks5Proxy)
        proxy.setHostName('187.160.129.238')
        proxy.setPort(10000)
        self.setProxy(proxy)
 
 
class WebPage(QtWebKit.QWebPage):
    def __init__(self, *arg, **args):
        QtWebKit.QWebPage.__init__(self, *arg, **args)
        net_manager = NetworkAccessManager()
        self.setNetworkAccessManager(net_manager)
        self.conf = self.settings()
        self.conf.setAttribute(self.conf.AutoLoadImages, False)
 
 
class Browser(QtWebKit.QWebView):
    def __init__(self, *arg, **args):
        QtWebKit.QWebView.__init__(self, *arg, **args)
        self.loadFinished.connect(self.load_complete)
 
    def load_complete(self):
        page = self.page().mainFrame().documentElement()
 
        user = page.findFirst('#login-appleId')
        passwd = page.findFirst('#login-password')
        submit = page.findFirst("#sign-in")
        user.evaluateJavaScript("this.value='qwerty@mail.ru'")
        passwd.evaluateJavaScript("this.value='123456'")
        submit.evaluateJavaScript("this.click()")
 
        if self.url().toString() == 'https://secure1.store.apple.com/shop/order/list?hist=545':
            print(self.url())
 
 
br = []
 
app = QtGui.QApplication(sys.argv)
 
for i in range(5):
    br.append(Browser())
    br[i].setPage(WebPage())
    br[i].load(QtCore.QUrl('https://secure1.store.apple.com/shop/order/list?hist=545'))
    br[i].show()
 
sys.exit(app.exec_())

Отредактировано dima2881 (Янв. 18, 2016 03:15:59)

Офлайн

#2 Янв. 17, 2016 15:21:56

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

Pyqt работа с несколькими экземплярами qwebview

Насколько помню куки у них будут общими. Что-бы заходить под разными пользователями надо назначать свои cookieJar каждому экземпляру NetworkAccessManager-а.

> Мне только нужно, чтобы js код на старнице интерпретировался и чтобы я мог авторизоваться сохранить итоговую страницу.

Тогда лучше смотреть в сторону grab или selenium-а.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#3 Янв. 17, 2016 15:57:15

dima2881
Зарегистрирован: 2016-01-09
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

Pyqt работа с несколькими экземплярами qwebview

Rodegast
Тогда лучше смотреть в сторону grab или selenium-а.
На сколько я помню grab не умеет интерпретировать js. Что касается selenium, так я как раз с него и начал, но в итоге пришёл к pyqt. Как оказалось phantomjs отвратительно работает через проксю, ну и вообще таскать вместе с приложением внешний брайзер это как-то не очень + очень сомниваюсь, что там быстро все будет работать. Мне кажется pyqt полегче значительно.

Офлайн

#4 Янв. 17, 2016 16:01:52

dima2881
Зарегистрирован: 2016-01-09
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

Pyqt работа с несколькими экземплярами qwebview

Rodegast
Насколько помню куки у них будут общими. Что-бы заходить под разными пользователями надо назначать свои cookieJar каждому экземпляру NetworkAccessManager-а.
Изменил вот так
for i in range(5):
    br.append(Browser())
    page = WebPage()
    page.networkAccessManager().setCookieJar(QtNetwork.QNetworkCookieJar())
    br[i].setPage(page)
    br[i].load(QtCore.QUrl('https://secure1.store.apple.com/shop/order/list?hist=545'))
    br[i].show()
непомогает

Офлайн

#5 Янв. 18, 2016 09:55:34

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

Pyqt работа с несколькими экземплярами qwebview

> непомогает

Там всё немного сложнее. Надо создавать наследника от QNetworkCookieJar и устанавливать в нём собственное хранилище кук, иначе они будут из одного места идти.
http://www.prog.org.ru/topic_14097_0.html



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version