如何使用Python登录网站?


87

我该怎么做?我试图输入一些指定的链接(使用urllib),但是要执行此操作,我需要登录。

我从网站获得此资源:

<form id="login-form" action="auth/login" method="post">
    <div>
    <!--label for="rememberme">Remember me</label><input type="checkbox" class="remember" checked="checked" name="remember me" /-->
    <label for="email" id="email-label" class="no-js">Email</label>
    <input id="email-email" type="text" name="handle" value="" autocomplete="off" />
    <label for="combination" id="combo-label" class="no-js">Combination</label>
    <input id="password-clear" type="text" value="Combination" autocomplete="off" />
    <input id="password-password" type="password" name="password" value="" autocomplete="off" />
    <input id="sumbitLogin" class="signin" type="submit" value="Sign In" />

这可能吗?

Answers:


70

也许您想使用斜纹布。它很容易使用,应该可以做您想做的事。

它将如下所示:

from twill.commands import *
go('http://example.org')

fv("1", "email-email", "blabla.com")
fv("1", "password-clear", "testpass")

submit('0')

showforms()一旦用于go…浏览要登录的站点,就可以列出所有表单。只需从python解释器中尝试即可。


请注意,在某些情况下,您需要使用Submit()。请参阅: lists.idyll.org/pipermail/twill/2006-August/000526.html 我确认了这个问题,对我来说,使用Submit()工程登录www.pge.com。
user391339 2014年

2
Python 3.6是否有解决方案?斜纹似乎不支持Python 3.5或3.6。我尝试下载并使用进行了转换,2to3但现在ModuleNotFoundError尝试导入时得到了提示。
CGFoX

实际上,我可以ModuleNotFoundError通过使用/转换Twill 1.8.0并安装lxml和来requests解决pip install。但是现在我SyntaxError尝试导入是因为某个地方False = 0....
CGFoX

2
修复它有点痛苦,但它可以起作用:stackoverflow.com/a/45459994/2745116
CGFoX

它是否以https工作场所或我必须做一些像这样
Mahesha999

51

让我尝试简化一下,假设该站点的URL是www.example.com,并且您需要输入用户名和密码进行注册,所以我们转到登录页面,说http://www.example.com/login .php现在并查看其源代码并搜索操作网址,该网址将以类似以下形式的形式标记

 <form name="loginform" method="post" action="userinfo.php">

现在使用userinfo.php来创建绝对URL,它将是“ http://example.com/userinfo.php ”,现在运行一个简单的python脚本

import requests
url = 'http://example.com/userinfo.php'
values = {'username': 'user',
          'password': 'pass'}

r = requests.post(url, data=values)
print r.content

我希望这有一天能对某人有所帮助。


这不适用于我尝试过的大多数网站
Anurag Pandey

在两打帮助/堆栈溢出页面中,我查看了这是唯一可在我需要的站点上工作的解决方案。
浮标

网络自动化的最佳选择是网络机器人。stackoverflow.com/a/51170181/6665568
Natesh bhat

所有值都是用户名和密码吗?我认为这似乎不适用于我选择的网站。
迪伦·洛根

@DylanLogan您始终必须检查实际网页发送到服务器的内容,并根据您的脚本进行调整。服务器不应能够区分您的脚本和Web浏览器。
Jeyekomon

28

通常,您需要Cookie才能登录到站点,这意味着cookielib,urllib和urllib2。这是我在玩Facebook网络游戏时回写的课程:

import cookielib
import urllib
import urllib2

# set these to whatever your fb account is
fb_username = "your@facebook.login"
fb_password = "secretpassword"

class WebGamePlayer(object):

    def __init__(self, login, password):
        """ Start up... """
        self.login = login
        self.password = password

        self.cj = cookielib.CookieJar()
        self.opener = urllib2.build_opener(
            urllib2.HTTPRedirectHandler(),
            urllib2.HTTPHandler(debuglevel=0),
            urllib2.HTTPSHandler(debuglevel=0),
            urllib2.HTTPCookieProcessor(self.cj)
        )
        self.opener.addheaders = [
            ('User-agent', ('Mozilla/4.0 (compatible; MSIE 6.0; '
                           'Windows NT 5.2; .NET CLR 1.1.4322)'))
        ]

        # need this twice - once to set cookies, once to log in...
        self.loginToFacebook()
        self.loginToFacebook()

    def loginToFacebook(self):
        """
        Handle login. This should populate our cookie jar.
        """
        login_data = urllib.urlencode({
            'email' : self.login,
            'pass' : self.password,
        })
        response = self.opener.open("https://login.facebook.com/login.php", login_data)
        return ''.join(response.readlines())

您不一定需要HTTPS或重定向处理程序,但它们不会受到伤害,并且它使打开程序更加健壮。您可能也不需要Cookie,但是很难仅通过已发布的表单来区分。我怀疑您可能仅仅是从“记住我”输入中被注释掉了。


19
import cookielib
import urllib
import urllib2

url = 'http://www.someserver.com/auth/login'
values = {'email-email' : 'john@example.com',
          'password-clear' : 'Combination',
          'password-password' : 'mypassword' }

data = urllib.urlencode(values)
cookies = cookielib.CookieJar()

opener = urllib2.build_opener(
    urllib2.HTTPRedirectHandler(),
    urllib2.HTTPHandler(debuglevel=0),
    urllib2.HTTPSHandler(debuglevel=0),
    urllib2.HTTPCookieProcessor(cookies))

response = opener.open(url, data)
the_page = response.read()
http_headers = response.info()
# The login cookies should be contained in the cookies variable

有关更多信息,请访问:https : //docs.python.org/2/library/urllib2.html


链接无效:2docs.python.org网址中添加了a :docs.python.org/2/library/urllib2.html
Michael Kopp,

18

网页自动化?绝对是“网络机器人”

webbot 甚至是具有动态更改的ID和类名且具有比硒或机械化更多的方法和功能的网页。

这是一个片段:)

from webbot import Browser 
web = Browser()
web.go_to('google.com') 
web.click('Sign in')
web.type('mymail@gmail.com' , into='Email')
web.click('NEXT' , tag='span')
web.type('mypassword' , into='Password' , id='passwordFieldId') # specific selection
web.click('NEXT' , tag='span') # you are logged in ^_^

这些文档也非常简单易用:https : //webbot.readthedocs.io


这个例子很好用。在哪里也可以使用autocomplete=off吗?
安德鲁S

不能在Win 64位上安装。错误:Could not find a version that satisfies the requirement webbot (from versions: 0.0.1.win-amd64)
Mostafa

尝试使用python3
Natesh bhat

如何处理IFRAME在webbot.?..i意味着我不得不关闭页面加载后弹出式菜单了一个iframe ..
arihanth耆那教

7

一般而言,网站可以通过许多不同的方式来检查授权,但是您所针对的方式似乎使您的访问变得相当容易。

您所需要做的就是POSTauth/loginURL上输入一个表单编码的Blob,其中包含您在其中看到的各个字段(忘记标签for,它们是为人类访客装饰的)。 handle=whatever&password-clear=pwd依此类推,只要您知道该句柄(AKA电子邮件)和密码的值,就可以了。

大概是POST将您重定向到带有Set-Cookie验证您的会话的标头的某些“您已成功登录”页面(请确保保存该cookie并在会话进行进一步交互时将其发送回去!)。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.