我遇到了问题。我正在编写一个简单的脚本来登录minecraft.net,然后列出所有经典服务器。但是当我运行我的脚本时,它只是将我重定向回minecraft.net/login。以下是我到目前为止的情况:
import urllib2
import urllib
import re
url = "https://www.minecraft.net/login"
page = urllib2.urlopen(url)
data = page.read()
page.close()
authToken = re.search('name="authenticityToken"[\s]+value="(.+)"', data).group(1)
data_dict = {
"username": "USERNAME",
"password": "PASSWORD",
"remember": "true",
#"redirect": "https://www.minecraft.net",
"authenticityToken": authToken
}
print urllib.urlencode(data_dict)
req = urllib2.Request(url, data=urllib.urlencode(data_dict))
page = urllib2.urlopen(req)
data = page.read()
page.close()
我做错了什么?
答案 0 :(得分:4)
使用Selenium
代替urllib
怎么样?在进行身份验证等复杂的操作时,我更喜欢使用Selenium
,因为它就像网页浏览一样。此解决方案需要安装Firefox。
<强>安装强>
>>> sudo pip install selenium
<强>代码强>
from selenium import webdriver
# initialize the browser and go to the site.
browser = webdriver.Firefox()
url = 'https://www.minecraft.net/login'
user_name = 'your_user_name'
password = 'your_password'
browser.get(url)
# retrieve all necessary page elements
user_name_field = browser.find_element_by_id('username')
password_field = browser.find_element_by_id('password')
user_name_field.send_keys(user_name)
password_field.send_keys(password)
sign_in_btn = browser.find_element_by_id('signin')
# log in
sign_in_btn.click()
我没有Minecraft帐户,所以我无法测试它,但你可能可以检索所有 Minecraft服务器归功于以下方法:
browser.find_elements_by_partial_link_text
browser.find_elements_by_class_name
browser.find_elements_by_css_selector
通常,我建议您使用Selenium
来测试ipython
代码,您可以在其中查看
浏览器工作。 (安装:sudo pip install ipython
)
在大量Javascript处理的情况下 - 请在代码中添加以下行:
browser = webdriver.Firefox()
browser.browser.implicitly_wait(30) # seconds
如果您打算另外支持其他浏览器,可以使用try catch子句支持它
import sys
browser = None
try:
browser = webdriver.Firefox()
except Exception as e:
try:
browser = webdriver.Chrome()
except Exception as e2:
try:
browser = webdriver.Safari()
except Exception as e3:
print 'Could not find Firefox, Chrome or Safari!'
sys.exit(0)
这个嵌套的try-except
子句不是最好的编程风格,但我相信它会有所帮助
你将它用于你的目的。在IPython
Selenium
支持
就我而言,我主要使用Selenium和Firefox。
答案 1 :(得分:3)
对于任何类型的半复杂HTTP请求,您应该使用请求模块(http://requests.readthedocs.org/en/latest/)而不是urllib。它会为你节省很多痛苦。
您需要执行以下操作:
import requests
import re
data = requests.get("https://minecraft.net/login")
auth_token = re.search('name="authenticityToken"[\s]+value="(.+)"', data).group(1)
# If needed, you may have to urlencode all that.
data_dict = {
"username": "USERNAME",
"password": "PASSWORD",
"remember": "true",
#"redirect": "https://www.minecraft.net",
"authenticityToken": auth_token
}
logged_in_data = requests.post("https://minecraft.net/login", data_dict)
答案 2 :(得分:2)
您可以添加cookielib模块登录您的网站。
#!/usr/bin/python
import urllib, urllib2, cookielib, re
login_url = "https://minecraft.net/login"
cookie = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
respon = opener.open(login_url).read()
authToken = re.search('name="authenticityToken"[\s]+value="(.+)"', respon).group(1)
data_dict = {
"username": "USERNAME",
"password": "PASSWORD",
"remember": "true",
"authenticityToken": authToken
}
login = opener.open(login_url, urllib.urlencode(data_dict))
logged_in = login.read()
if login_url in logged_in:
print 'Login failed'
else:
print 'Login OK'