2011-03-18 11 views
9

Tengo que rascar una página muy, muy simple en la intranet de nuestra compañía para automatizar uno de nuestros procesos internos (devolviendo la salida de una función como exitosa o no).Raspado de páginas web controladas por Javascript con PyQt4: ¿cómo acceder a las páginas que necesitan autenticación?

me encontré con el siguiente ejemplo:

import sys 
from PyQt4.QtGui import * 
from PyQt4.QtCore import * 
from PyQt4.QtWebKit import * 

class Render(QWebPage): 
    def __init__(self, url): 
    self.app = QApplication(sys.argv) 
    QWebPage.__init__(self) 
    self.loadFinished.connect(self._loadFinished) 
    self.mainFrame().load(QUrl(url)) 
    self.app.exec_() 

    def _loadFinished(self, result): 
    self.frame = self.mainFrame() 
    self.app.quit() 

url = 'http://sitescraper.net' 
r = Render(url) 
html = r.frame.toHtml() 

De http://blog.sitescraper.net/2010/06/scraping-javascript-webpages-in-python.html y es casi perfecto. Solo necesito poder proporcionar autenticación para ver la página.

He estado revisando la documentación de PyQt4 y voy a admitir que está muy por encima de mi cabeza. Si alguien pudiera ayudar, lo agradecería.

Editar: Lamentablemente, el método de gruszczy no funcionó para mí. Cuando yo había hecho algo similar a través de urllib2, he utilizado el siguiente código y funcionó ...

username = 'user' 
password = 'pass' 

req = urllib2.Request(url) 
base64string = base64.encodestring('%s:%s' % (username, password))[:-1] 
authheader = "Basic %s" % base64string 
req.add_header("Authorization", authheader) 

handle = urllib2.urlopen(req) 

Respuesta

7

lo he descubierto. Esto es lo que terminé en caso de que pueda ayudar a alguien más.

#!/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() 
0

Prueba esto:

url = QUrl(url) 
    url.setUserName(username) 
    url.setPassword(password) 
    self.mainFrame().load(url) 
+0

No estaba seguro de cómo formatear correctamente el código en el área de comentarios aquí, así que edité la pregunta anterior. – merph

+0

Entonces me temo que no tengo ni idea, cómo hacerlo: -/ – gruszczy

+0

Eso es genial, de todos modos. Me pusiste en el camino correcto. – merph

Cuestiones relacionadas