您的位置:首页 > 编程语言 > Python开发

python 模拟登陆leetcode

2016-03-25 20:41 507 查看
模拟登陆,首先要知道提交页面的网址,和每次post的内容,采用chrome的浏览器的开发者工具,查看。得到下图



可以看到提交的内容包括”csrfmiddlewaretoken”、”login”、”password”,后两个是用户名和密码,第一个应该是一中验证机制,每次打开页面都会随机生成一个,果不其然,在网页的代码中找到


这样,我们只要每次把登陆界面的csrf值扣出来,然后放到和用户名,密码放到一个字典中,就可以了。这里取csrf值的方式使用了beautifulsoup这个库,先得到一个beautifulSoup对象,参数是网页的源码,和使用的解析模式

url = "https://leetcode.com/accounts/login/"
content = gethtml(url)
soup = BeautifulSoup(content,"html.parser")


beautifulsoup的使用非常简单,我们通过上面可以看到csrf值是在一个input tag中,可以直接用下面的代码获得。

def getxsrf():
input_tag = soup.input
return input_tag["value"]


接下来是

def login():
_xsrf = getxsrf()
print "the xsrf is ",_xsrf
login_data['csrfmiddlewaretoken']=_xsrf
login_data['login'] = "your name"
login_data['password'] = "your pwd"
res = s.post(url,headers = headers_base,data=login_data)
print res.status_code
print res.cookies
return res.cookies


这是你会发现所打印出来的res.status_code是403,也就是网页禁止访问的含义。为什么会出现这种情况呢?谷歌了一下,发现leetcode登录时post的csrf并不是像知乎时藏在网页源码中的,而是在你get时返回值中

url = "https://leetcode.com/accounts/login/"
res = s.get(url=url,headers=headers_base)
print res.cookies['csrftoken']
login_data['csrfmiddlewaretoken']=res.cookies


全部代码如下

from bs4 import BeautifulSoup
import requests
s = requests.session()
headers_base = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, sdch',
'Accept-Language': 'en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4,zh-TW;q=0.2',
'Connection': 'keep-alive',
'Host': 'leetcode.com',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36',
'Referer': 'https://leetcode.com/accounts/login/',
}
login_data={}

def bs(html_doc):
return BeautifulSoup(html_doc,"html.parser")
def login():
url = "https://leetcode.com/accounts/login/"
res = s.get(url=url,headers=headers_base)
print res.cookies['csrftoken']
login_data['csrfmiddlewaretoken']=res.cookies['csrftoken']
login_data['login'] = "your name"
login_data['password'] = "your pwd"
res = s.post(url,headers = headers_base,data=login_data)
print res.status_code
return res.cookies
def mainpage():
login()
# res = s.get(url=url,headers=headers_base,cookies=login())
# print res.text
# write2file("hist.html",res.text)
mainpage()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: