好的,所以我将它用于 reddit 机器人,但我希望能够弄清楚如何登录到任何网站。如果这有意义....
我意识到不同的网站使用不同的登录表单等。那么我如何弄清楚如何为每个网站优化它?我假设我需要在 html 文件中查找某些内容,但不知道是什么。
我不想使用 Mechanize 或任何其他库(这是这里所有其他答案的内容,实际上并不能帮助我了解正在发生的事情),因为我想自己了解它是如何工作的。
urllib2 文档确实对我没有帮助。
谢谢。
好的,所以我将它用于 reddit 机器人,但我希望能够弄清楚如何登录到任何网站。如果这有意义....
我意识到不同的网站使用不同的登录表单等。那么我如何弄清楚如何为每个网站优化它?我假设我需要在 html 文件中查找某些内容,但不知道是什么。
我不想使用 Mechanize 或任何其他库(这是这里所有其他答案的内容,实际上并不能帮助我了解正在发生的事情),因为我想自己了解它是如何工作的。
urllib2 文档确实对我没有帮助。
谢谢。
我会先说我已经有一段时间没有以这种方式登录了,所以我可能会错过一些更“接受”的方式来做到这一点。
我不确定这是否是您所追求的,但如果没有类似的库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
- op
、user
和。另外,请注意参数 - 这是表单将发布到的 URL,因此将成为我们的目标。所以现在最后一步是将参数打包到有效负载中,并将其作为请求发送到URL。同样在下面,我们创建了一个新的,添加了处理 cookie 和添加标头的功能,为我们提供了一个更强大的开启器来执行请求):passwd
rem
action
POST
action
opener
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
参数)。同样,不确定这是否是您想要的,但希望它有所帮助。