NetBear
@NetBear

Как реализовать парсинг JavaScript веб страницы, требующей авторизации?

Здравствуйте.

Мне необходимо реализовать модуль (на Python), собирающий данные с веб-страниц со следующими особенностями:
- HTML код страницы генерируется JavaScript
- Доступ к страницам реализуется через механизм авторизации

Я, в принципе, нашёл способ запустить JavaScript, чтобы получить HTML, который в последствии будет собран парсером.
Код реализован на основе вот этого совета:
#!/usr/bin/python
# -*- coding: utf-8 -*-
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 = 'user'
    password = 'pass'

    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://omegaqa.corp.emc.com/omega/Apps/AppsContainer.asp?DefaultAppID=6'
    r = Render(url)
    html = r.frame.toHtml()
    print unicode(html, "utf-8", errors="ignore")

if __name__ == '__main__':
    main()


Проблема возникла на этапе прохождения авторизации. Если я не использую PyQt4 для проигрывания JavaScript кода, то тривиальный requests.get чудесно работает в плане прохождения авторизации:
res = requests.get(url, auth=('user', 'password'))
Плохо то, что он приносит JavaScript код, который мне не нужен, вместо HTML, который ещё не сгенерирован.

Собственно вопрос:
Как скрестить прохождение авторизации из requests с генерацией HTML кода с помощью PyQt4.QtWebKit?
  • Вопрос задан
  • 8786 просмотров
Пригласить эксперта
Ответы на вопрос 1
tenoclock
@tenoclock
Python/Django программист
Вам нужно использовать mechanize.Browser() .
Он может и авторизоваться сперва и стянуть страницу.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы