如何使用Python脚本(请求库)登录网站?
我正在尝试使用Python库登录一个名为surfline.com的网站,然后如何使用Python脚本(请求库)登录网站?,python,http,web,urllib2,python-requests,Python,Http,Web,Urllib2,Python Requests,我正在尝试使用Python库登录一个名为surfline.com的网站,然后登录后获取一个网页(大概是在一个持久化数据库中) surfline.com在其整个页面中使用的登录表单使用onclick()映射到一个名为verifyLogin()的JS函数,该函数反过来会发布到一个.cfm文件。在success上,它刷新页面,并且只要cookie持续存在,用户现在就保持登录状态 我是第一次使用图书馆,不确定如何: 登录成功 在整个会话期间保持登录状态 然后将主页作为登录用户打印到终端 以下是登录表单(
登录后获取一个网页(大概是在一个持久化数据库中)
surfline.com在其整个页面中使用的登录表单使用onclick()
映射到一个名为verifyLogin()
的JS函数,该函数反过来会发布到一个.cfm
文件。在success
上,它刷新页面,并且只要cookie持续存在,用户现在就保持登录状态
我是第一次使用图书馆,不确定如何:
登录成功
在整个会话期间保持登录状态
然后将主页作为登录用户打印到终端
以下是登录表单(HTML):
我尝试过这段代码,但似乎无法以登录用户的身份获取主页;它仍然会返回给未登录的用户(我的全名应该出现在标题中,等等):
导入请求,json
>>>s=请求。会话()
>>>第_页签出=s.get('http://www.surfline.com/home/index.cfm')
>>>form_data={'type':'POST',
…'url':'/myaccount/inc_login_handler.cfm',
…'数据':“用户名”=myemail@example.com&password=mypassword&rememberMe=true&top\u login=true“,
…“缓存”:False}
>>>美国邮政(url,
…data=json.dumps(form_data),
…头={'content-type':'application/json'})
>>>第\u页已签名\u in=s.get('http://www.surfline.com/home/index.cfm')
基本上,我如何从python文件登录到surfline.com,并以登录用户的身份获取页面?如果请求
库不可能,我不介意使用其他库。多谢各位
编辑:
以下是@André建议的帖子发布后的cookies
我尝试登录该网站,同时监视使用Firebug发出的请求,看起来数据是
应用程序/x-www-form-urlencoded
格式,而不是应用程序/json
,而且您还误解了Javascript代码中的一些值,类型
,url
,data
和cache
是AJAX调用的参数,而不是应该发送到服务器的实际数据
这是希望的工作代码,在POST请求中替换您的电子邮件和密码
from requests import Session # we can just import Session, no need to import the entire requests
s = Session() # new session
page_signed_out = s.get('http://www.surfline.com/home/index.cfm') # gets signed out page, this will set eventual cookies that may be needed later
s.post("http://www.surfline.com/myaccount/inc_login_handler.cfm", {"username":"myemail@example.com", "password":"mypassword", "rememberMe":"true", "top_login":"true"}) # does the actual login, if successful this will set a session cookie
page_signed_in = s.get('http://www.surfline.com/home/index.cfm') # good, we're logged in
编辑: 或者,如果由于任何原因,surfline.com未能成功让您登录,您可以在实际登录时复制浏览器中植入的cookie,并将其“粘贴”到您的程序中,然后将其与您的请求一起传递
from requests import Session
s = Session()
s.cookies["s_cc"] = "your_session_cookie" # replace this with your actual login cookie
page_signed_in = s.get("http://www.surfline.com") # you're logged in :)
如果你也是一个冲浪者,只是想让流整天玩,我会提示你检查一下他们的flash播放器的RTMP连接 更大的提示是: tcpdump-A-n-s0-r file.tcpdump | grep connect 当访问cam页面和RTMP流的grep时
但是你可能会去做其他事情,然后这就偏离主题了。好吧,在我在
s.post()调用中发布正确的数据后,cookies似乎出现了,所以它成功登录了。但是,对“”的第二次调用仍在返回页面,就好像用户未登录一样。我是否必须将cookies作为参数传递给第二次调用或类似的调用?(我将在下一条评论中发布RequestsCookieJar
,这样你就可以看到)实际上,它太长了,我将在问题中发布编辑在Chrome设置中检查,我发现成功登录后由Surfline放置的cookie与会话
对象中找到的cookie不同(例如,有一些称为用户ID
和设置SID
),并且没有像在会话
对象中那样的注销
cookie。因此,我认为登录毕竟没有成功。有没有办法从我的机器上一字不差地运行JavaScript函数,将用户名和密码字段写入文件?@sgarza62如果登录cookie的生存期是只要足够长的时间,您就可以直接将其值从浏览器复制粘贴到脚本中。@sgarza62我改进了您的编辑,不需要使用cookie jar,您只需使用会话
的“cookies”属性作为字典,请参见我的答案。我正在为自己构建预测数据的不同前端表示(不同的布局和添加的功能),但现在你给了我下一个项目的想法。很高兴遇到另一个冲浪程序员-珍稀面包。干杯,布拉德,这完全是我想要的!布拉德,这种方法对你仍然有效吗?rmtp流似乎过了一段时间就不起作用了。也许我不清楚你是如何使用它们的。
>>> import requests, json
>>> s = requests.Session()
>>> page_signed_out = s.get('http://www.surfline.com/home/index.cfm')
>>> form_data = {'type':'POST',
... 'url':'/myaccount/inc_login_handler.cfm',
... 'data':"username=myemail@example.com&password=mypassword&rememberMe=true&top_login=true",
... 'cache':False}
>>> s.post(url,
... data=json.dumps(form_data),
... headers= {'content-type': 'application/json'})
<Response [200]>
>>> page_signed_in = s.get('http://www.surfline.com/home/index.cfm')
from requests import Session # we can just import Session, no need to import the entire requests
s = Session() # new session
page_signed_out = s.get('http://www.surfline.com/home/index.cfm') # gets signed out page, this will set eventual cookies that may be needed later
s.post("http://www.surfline.com/myaccount/inc_login_handler.cfm", {"username":"myemail@example.com", "password":"mypassword", "rememberMe":"true", "top_login":"true"}) # does the actual login, if successful this will set a session cookie
page_signed_in = s.get('http://www.surfline.com/home/index.cfm') # good, we're logged in
from requests import Session
s = Session()
s.cookies["s_cc"] = "your_session_cookie" # replace this with your actual login cookie
page_signed_in = s.get("http://www.surfline.com") # you're logged in :)