使用使用Python登录登录CSDN(最新验证可用)
(最新验证可用)
作为一个爬虫菜鸟,今天在网上看到使用Python来模拟登录的博客,就在CSDN上试了试,结果处处碰壁。由于CSDN更新了登陆验证方式,网上的一些方法已经不
能使用,试了很久终于是模拟登陆成功了,但是频繁登陆会导致账号异常。
谷歌浏览器查看登录请求
谷歌浏览器查看登录请求
网址:https://passport.csdn.net/login?code=public,输入账号密码登陆,查看NetWork,如下所示。其中的doLogin就是对应着登陆请求,可以看见其中的请求URL
同样可以看见请求时所提交的数据,这里不是Form Data而是Request PayLoad,这两个的区别可以在百度中查阅,在具体请求时需要区分。
Python模拟登陆
模拟登陆
找到了请求URL和对应的参数就开始用Python模拟登陆,代码如下:
# coding:utf-8
import requests
from bs4 import BeautifulSoup
import re
import urllib
class CsdnHelper:
csdn_login_url = 'https://passport.csdn.net/v1/register/pc/login/doLogin'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
'content - type': 'application / json;charset = UTF - 8'
}
blog_url = 'http://write.blog.csdn.net/postlist/'
def __init__(self):
self._session = requests.session()
self._session.headers = CsdnHelper.headers
def login(self, username, password):
'''从页面获取参数,准备提交表单'''
payloadData = {
'loginType': "1",
}
res = requests.post(CsdnHelper.csdn_login_url, json=payloadData, headers=CsdnHelper.headers)
if 'UserNick' in res.cookies:
nick = res.cookies['UserNick'] print(urllib.unquote(nick))
else:
raise Exception('登录失败')
if __name__ == '__main__':
csdn_helper = CsdnHelper()
username = '***'
password = '***.'
csdn_helper.login(username, password)
一顿操作猛如虎,,点击运行,结果就是GG:
{"msg":"页面过期","code":"1015","message":"系统繁忙,请稍候再试","status":false}
在一顿百度之后,只有一篇博客上提到是由于CSDN在登陆之前加了一个验证,,于是再回去看控制台请求的记录,发现在登陆前会有一个Check,如下所示。
看到这个,于是就猜测是否是要在登陆请求之前先对这个URL请求通过验证再来登陆呢,那么就创建一个全局的Session来模拟登陆:
# coding:utf-8
import requests
from bs4 import BeautifulSoup
import re
import urllib
class CsdnHelper:
"""登录CSDN和列出所有文章的类"""
csdn_check_url = 'https://passport.csdn.net/v1/api/riskControl/checkHVC'
csdn_login_url = 'https://passport.csdn.net/v1/register/pc/login/doLogin'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
'content - type': 'application / json;charset = UTF - 8'
}
blog_url = 'http://write.blog.csdn.net/postlist/'
def __init__(self):
self._session = requests.session()
self._session.headers = CsdnHelper.headers
def login(self, username, password):
payloadData = {
#登陆里里面的payload数据
}
checkData = {
#check里面的payload数据
}
self._session.post(CsdnHelper.csdn_check_url, json=checkData, headers= CsdnHelper.headers)
res = self._session.post(CsdnHelper.csdn_login_url, json=payloadData, headers=CsdnHelper.headers)
if 'UserNick' in res.cookies:
nick = res.cookies['UserNick'] print(urllib.unquote(nick))
else:
raise Exception('登录失败')
if __name__ == '__main__':
csdn_helper = CsdnHelper()
username = '*****'
password = '*****.'
csdn_helper.login(username, password)
最终登陆成功:
作者:LMRzero