(4)Python笔记:模拟登入CSDN(requests库实现)

因为使用到了requests库,所以需要先安装,直接使用pip安装
进入python安装目录\Scripts,执行 pip install requests(需要python版本支持)
安装完成后就可以开始分析CSDN的登入流程了
1.首先使用chrome退出CSDN,然后选择登入,F12打开开发者工具,选择Network,勾选Preserve log选项
https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn
如下(如果有之前遗留的信息,就点击红点旁的那个斜杠圈就行)
这里写图片描述

2.输入账号密码,点击登入,在左边选择最上面的一个,点击查看,就可以看到右边的详细信息,比较重要的几个就是
headers信息
Host:passport.csdn.net
Referer:https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.103 Safari/537.36

Form data参数
这里写图片描述

3.从上图中的form data参数中,我们可知,在登入CSDN时,将会向后台发送5个参数(当然如果你勾选了自动登入的话还会多一个rememberMe参数)
前2个用户名密码没啥好说的,后面3个其实是登入页面上的隐藏参数,在登入页面右键,查看源代码,搜索一下就可以发下如下语段,所以在模拟登入时,从登入页面中直接获取即可

<!-- 该参数可以理解成每个需要登录的用户都有一个流水号。只有有了webflow发放的有效的流水号,用户才可以说明是已经进入了webflow流程。否则,没有流水号的情况下,webflow会认为用户还没有进入webflow流程,从而会重新进入一次webflow流程,从而会重新出现登录界面。 -->
                    <input type="hidden" name="lt" value="LT-346446-4wYz1t1bpBo9dTQKHXccfCmeJbDVbJ" />
                    <input type="hidden" name="execution" value="e32s1" /> 
                    <input type="hidden" name="_eventId" value="submit" /> 
                    <input class="logging" accesskey="l" value="登 录" tabindex="6" type="button" /> 

4.现在所需的东西基本都获取了,即可以开始着手代码的编写了,python 3.63。说明都放在注释中了,如果想要在第二次登录时自动登入,就将rememberMe处的注释去掉,这样经过第一次登入后,之后的登入都会自动登入。

# -*- coding: utf-8 -*-
import requests
try:
    import cookielib
except:
    import http.cookiejar as cookielib
import re
import time
import os.path


# 构造 Request headers ,就是刚才获取的headers 信息
agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.103 Safari/537.36'
headers = {
    "Host": "passport.csdn.net",
    "Referer": "https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn",
    'User-Agent': agent
}

# 使用登录cookie信息,这里如果存在cookie信息,则会直接读取已有cookie,之后就能直接自动登入了
session = requests.session()
session.cookies = cookielib.LWPCookieJar(filename='cookies')
try:
    session.cookies.load(ignore_discard=True)
    print("Cookie 加载")
except:
    print("Cookie 未能加载")

index_url = 'https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn'
index_page = session.get(index_url, headers=headers)
html = index_page.text

def getlt():
# 获取登录时需要用到的lt
    pattern = r'name="lt" value="(.*?)"'
    # 这里的lt 返回的是一个list
    lt = re.findall(pattern, html)
    print(lt[0])
    return lt[0]

def getExecution():
# 获取登录时需要用到的Execution
    pattern = r'name="execution" value="(.*?)"'
    # 这里的execution 返回的是一个list
    execution = re.findall(pattern, html)
    print(execution[0])
    return execution[0]

def get_eventId():
# 获取登录时需要用到的_eventId
    pattern = r'name="_eventId" value="(.*?)"'
    # 这里的_eventId 返回的是一个list
    _eventId = re.findall(pattern, html)
    print(_eventId[0])
    return _eventId[0]
#登入
def login(secret, account):
    post_url = 'https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn'
    postdata = {
        'lt': getlt(),
        'execution': getExecution(),
        '_eventId': get_eventId(),
        'password': account,
        'username': secret
        #'rememberMe': 'true'
    }
    print(postdata)
    # 直接登录
    login_page = session.post(post_url, data=postdata, headers=headers)
    print(login_page.text)
    #login_code = login_page

    #print(session.get('http://msg.csdn.net/').text)
     # 保存 cookies 到文件,
    # 下次可以使用 cookie 直接登录,不需要输入账号和密码
    session.cookies.save()
def isLogin():
    # 通过查看个人信息来判断是否已经登录
    url = "http://msg.csdn.net/"
    login_code = session.get(url, headers=headers, allow_redirects=False).status_code
    print(login_code)
    if login_code == 200:
        return True
    else:
        return False
if __name__ == '__main__':
    if isLogin():
        print('已登入')
    else:
        login('账号','密码')

完整代码
https://github.com/SecondMagic/-1-python-csdn/blob/master/4.requests%20%E5%AE%9E%E7%8E%B0%E6%A8%A1%E6%8B%9F%E7%99%BB%E5%85%A5CSDN/requests.py

猜你喜欢

转载自blog.csdn.net/yeyinglingfeng/article/details/78404465