模拟登陆,首先要知道提交页面的网址,和每次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()