使用 urllib2 登录网站 - Python 2.7

Posted

技术标签:

【中文标题】使用 urllib2 登录网站 - Python 2.7【英文标题】:Login to website using urllib2 - Python 2.7 【发布时间】:2012-12-05 05:55:21 【问题描述】:

好的,所以我将它用于 reddit 机器人,但我希望能够弄清楚如何登录到任何网站。 如果这是有道理的......

我意识到不同的网站使用不同的登录表单等。那么我如何弄清楚如何为每个网站优化它?我假设我需要在 html 文件中查找某些内容,但不知道是什么。

我不想使用 Mechanize 或任何其他库(这是这里所有其他答案的内容,实际上并不能帮助我了解正在发生的事情),因为我想自己了解它是如何做到的一切正常。

urllib2 文档确实对我没有帮助。

谢谢。

【问题讨论】:

【参考方案1】:

我先说我已经有一段时间没有以这种方式登录了,所以我可能会错过一些更“被接受”的登录方式。

我不确定这是否是您所追求的,但没有像 mechanize 这样的库或像 selenium 这样的更强大的框架,在基本情况下,您只需查看表单本身并找出inputs。比如查看www.reddit.com,再查看渲染页面的源码,你会发现这个表单:

<form method="post" action="https://ssl.reddit.com/post/login" id="login_login-main"
  class="login-form login-form-side">
    <input type="hidden" name="op" value="login-main" />
    <input name="user" placeholder="username" type="text" maxlength="20" tabindex="1" />
    <input name="passwd" placeholder="password" type="password" tabindex="1" />

    <div class="status"></div>

    <div id="remember-me">
      <input type="checkbox" name="rem" id="rem-login-main" tabindex="1" />
      <label for="rem-login-main">remember me</label>
      <a class="recover-password" href="/password">reset password</a>
    </div>

    <div class="submit">
      <button class="btn" type="submit" tabindex="1">login</button>
    </div>

    <div class="clear"></div>
</form>

在这里,我们看到了一些input - opuserpasswdrem。另外,请注意action 参数 - 这是表单将发布到的 URL,因此将成为我们的目标。所以现在最后一步是将参数打包到有效负载中,并将其作为POST 请求发送到action URL。同样在下面,我们创建了一个新的opener,添加了处理 cookie 和添加标头的功能,为我们提供了一个更强大的开启器来执行请求):

import cookielib
import urllib
import urllib2


# Store the cookies and create an opener that will hold them
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))

# Add our headers
opener.addheaders = [('User-agent', 'RedditTesting')]

# Install our opener (note that this changes the global opener to the one
# we just made, but you can also just call opener.open() if you want)
urllib2.install_opener(opener)

# The action/ target from the form
authentication_url = 'https://ssl.reddit.com/post/login'

# Input parameters we are going to send
payload = 
  'op': 'login-main',
  'user': '<username>',
  'passwd': '<password>'
  

# Use urllib to encode the payload
data = urllib.urlencode(payload)

# Build our Request object (supplying 'data' makes it a POST)
req = urllib2.Request(authentication_url, data)

# Make the request and read the response
resp = urllib2.urlopen(req)
contents = resp.read()

请注意,这可能会变得更加复杂 - 例如,您也可以使用 GMail 执行此操作,但您需要引入每次都会更改的参数(例如 GALX 参数)。同样,不确定这是否是您想要的,但希望对您有所帮助。

【讨论】:

那是 /amazing/,谢谢!几乎正是我想要的,现在我知道我还需要阅读更多内容。完美! @tommo 没问题,我的朋友 - 我记得当我试图整理这些东西时,我也经历了同样的问题:) 祝一切顺利! @tommo 没问题-出于好奇,您正在查看哪些文档?您可以在 urllib2 文档 (docs.python.org/2/library/urllib2.html#examples) 的最底部看到它们的用法示例。这相当于将它们添加到opener。如果您创建 Request 对象 (docs.python.org/2/library/urllib2.html#urllib2.Request),则设置会有所不同,其中 headers 作为字典输入。那有意义吗?很高兴查看您正在查看的内容并解释其中的差异(如果可以的话:))。 如果我有同样的问题,但想改用 python 3,有什么建议。 第二个帮助很大,但是当我导航到另一个关于登录的页面时,它就像我没有登录一样。有谁知道如何解决这个问题?我正在使用 urllib 和漂亮的汤进行网络解析。

以上是关于使用 urllib2 登录网站 - Python 2.7的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 登录网站,填写表格,然后退出

cookielib和urllib2模块相结合模拟网站登录

Python利用cookie模拟网站登录

Urllib2 在 python 中使用 Tor

[转载]python实现带验证码网站的自动登陆

python2.7 urllib2访问https 网站出错