使用python和mechanize登录login.live.com?

时间:2015-03-14 10:38:58

标签: python mechanize-python

我需要在login.live.com上使用python和mechanize自动登录。 问题是,我找不到任何browser.forms(),但应该有一些,因为我检查了HTML代码:

我的代码:

import urllib2
import lxml
from mechanize import Browser

br=Browser()

#Simulate user
br.set_handle_robots( False )
br.addheaders = [('User-agent', 'GoogleChrome')]

#open site
url = "https://login.live.com/"

rep = br.open(url)

for frm in br.forms(): 
    print frm

应该有一个名为' f1'在' login.live.com'。这部分是否可以动态生成?

的Nero

2 个答案:

答案 0 :(得分:1)

https://login.live.com的回答是空洞的。一切都是通过javascript onload完成的。

要想见到你自己(至少在Mac和Linux上):

wget https://login.live.com/

或者在您的代码中:

import urllib2

from mechanize import Browser

br=Browser()

#Simulate user
br.set_handle_robots( False )
br.addheaders = [('User-agent', 'GoogleChrome')]

#open site
url = "https://login.live.com/"

rep = br.open(url)

print rep.read()

在没有执行javascript的情况下获取这些表单可能很难/不可能,但是为了这样做,我认为你将不得不离开python。编辑:或许你不必(见其他答案)。

如果您不需要实际分析网站响应并且只想做一些简单的事情,那么您可以提出请求而不必过多关注响应(您仍然拥有http状态代码,这可能足以看出您的请求成功)。

我猜也有实际的API。我不熟悉MS产品,也不知道你想要做什么,所以我不能指出任何特定的东西。

答案 1 :(得分:1)

正如sbarzowski指出你需要在网站上执行javascript。 但是你不需要为此留下python。事实上,你可以自动化Qt webkit。

示例(python3,在linux上测试):

#!/usr/bin/env python3
import sys
from urllib.request import urlopen

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

SHOWBROWSER = True
LOGIN = 'name@example.com'
PASS = 'foo'

class WebPage(QWebPage):
    def __init__(self, parent=None):
        super(WebPage, self).__init__(parent)
        self.loadFinished.connect(self._loadFinished)
        self.mainFrame().load(QUrl('http://login.live.com'))

    def javaScriptConsoleMessage(self, msg, lineNumber, sourceID):
        print("JsConsole(%s:%d): %s" % (sourceID, lineNumber, msg))

    def _loadFinished(self, result):
        frame = self.mainFrame()
        url = frame.requestedUrl().toString()
        print(url)
        if url == 'http://login.live.com/':
            frame.evaluateJavaScript(self.get_jquery())
            frame.evaluateJavaScript(
                '''
                $('input[name="login"]').val('{login}')
                $('input[name="passwd"]').val('{password}')
                $('input[type="submit"]').click()
                '''.format(login=LOGIN, password=PASS)
            )
        if 'auth/complete-signin' in url:
            print('finished login')
            if not SHOWBROWSER:
                QApplication.quit()

    def get_jquery(self):
        response = urlopen('http://code.jquery.com/jquery-2.1.3.js')
        return response.read().decode('utf-8')


class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.view = QWebView(self)
        self.view.setPage(WebPage())

        layout = QVBoxLayout(self)
        layout.setMargin(0)
        layout.addWidget(self.view)


def headless():
    app = QApplication(sys.argv)
    view = QWebView()
    view.setPage(WebPage())
    app.exec_()


def main():
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    app.exec_()


if __name__ == "__main__":
    if SHOWBROWSER:
        main()
    else:
        headless()