0

我需要使用 python 登录到一个站点。本网站使用 cookie。我尝试过使用urllib2requests库以及相关问题的答案

# -*- coding:utf-8 -*-
import cookielib
import urllib
import urllib2
import requests

auth_data = {
    'login': '+79269999999',
    'password': 'strongpassword',
    'source': 'MENU',
}
urls = {
    'home': r'https://qiwi.ru',
    'login': r'https://qiwi.ru/auth/login.action',
    'reports': r'https://qiwi.ru/report/list.action',
}
headers = {
    #'content-type': 'application/json',
    'User-agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
    'Referer': 'qiwi.ru',
}


def requests_foo():
    with requests.session() as c:
        c.get(urls['home'])
        request = c.post(urls['login'], data=auth_data, headers=headers)
        print request.headers['content-type']
        print request.status_code


def urllib_foo():
    cj = cookielib.CookieJar()
    opener = urllib2.build_opener(
        urllib2.HTTPSHandler(),
        urllib2.HTTPCookieProcessor(cj))
        login_data = urllib.urlencode(auth_data)
        request = urllib2.Request(urls['home'], login_data, headers)
        opener.open(request)
    try:
        request = urllib2.Request(urls['login'], login_data, headers)
        resp = opener.open(request)
    except IOError, e:
        print e
    else:
        print resp.read()

但是这两个函数都返回HTTP 错误 401:未经授权

现场登录应该怎么做?

编辑

我尝试使用mechanize,但没​​有成功

def is_logged_in(html):
    return auth_data['login'] in html

def mechanize_foo():
    br = mechanize.Browser()
    br.open(urls['home'])
    br.select_form(nr=0)
    forms = [f for f in br.forms()]
    forms[0].action = urls['login']
    forms[0]['login'] = auth_data['login']
    forms[0]['password'] = auth_data['password']

    response = br.submit()
    print is_logged_in(response.read())
4

2 回答 2

0

恐怕浏览网站不是构建请求的目的。如果要模拟 Web 浏览器,则需要使用一个名为mechanize.

可以继续这样做,但一段时间后它会变得非常烦人,因为你需要设置大量的样板代码。

它是我知道的唯一可以做到这一点的工具,可能还有其他工具。是该站点的链接,您可以在其中学习如何在 Python 中使用它。

编辑

可以使用硒。从这里下载。

于 2013-10-29T21:33:24.080 回答
0

我用firefox+firebug来测试登录系统。主页正在连接login.action两次。

它第一次发送loginpasswordsource获取一些 JSON 数据token

第二次发送login, password,sourceloginToken(之前收到的)。

因此与该服务器的连接更加复杂。

如果您没有经验,最好尝试 Selenium 或 Mechanize(请参阅 Games Brainiac 答案)。

于 2013-10-29T22:07:44.993 回答