我正在尝试使用urllib2和cookiejar登录网站。它会保存会话ID,但是当我尝试打开另一个需要身份验证的链接时,它表示我没有登录。我做错了什么?
这是代码,但对我来说失败了:
import urllib
import urllib2
import cookielib
cookieJar = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookieJar))
# Gives response saying that I logged in succesfully
response = opener.open("http://site.com/login", "username=testuser&password=" + md5encode("testpassword"))
# Gives response saying that I am not logged in
response1 = opener.open("http://site.com/check")
答案 0 :(得分:4)
您的实施似乎很好......并且应该可行。
它应该发送正确的cookies
,但我认为该网站实际上没有登录你的情况。
你怎么能说它不发送cookies
或者cookies
你得到的不是认证你的那个。
使用:response.info()
查看回复标题,了解您实际收到的Cookie。
网站可能没有登录你,因为:
检查User-agent
您没有设置,因为有些网站只能从4个主要浏览器打开以禁止机器人访问。
网站可能正在寻找您可能不会发送的特殊隐藏表单字段。
1条建议:
from urllib import urlencode
# Use urlencode to encode your data
data = urlencode(dict(username='testuser', password=md5encode("testpassword")))
response = opener.open("http://site.com/login", data)
此外有一件事很奇怪:
site.com
在javascript中实现md5时才有可能。退房.. !! :)
答案 1 :(得分:2)
我在自己的测试服务器上遇到了类似的问题,它在浏览器中运行良好,但在urllib2.build_opener
解决方案中没有。
问题似乎是在urllib2中。正如these answers建议的那样,使用功能更强大的mechanize库而不是urllib2很容易:
cookieJar = cookielib.CookieJar()
browser = mechanize.Browser()
browser.set_cookiejar(cookieJar)
opener = mechanize.build_opener(*browser.handlers)
开场白将按预期工作!