python 模拟登陆leetcode

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

python 模拟登陆leetcode_第1张图片

可以看到提交的内容包括”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()

你可能感兴趣的:(人生苦短,我用python)