2. 爬虫模拟登陆有道

相比上文,主要多了一个加密密码的处理

思路流程

1.首先通过浏览器(这里用的是360浏览器)访问有道登陆界面(‘http://account.youdao.com/loginservice=dict&back_url=http://dict.youdao.com/wordbook/wordlist%3Fkeyfrom%3Dlogin_from_dict2.index),

2.点击F12,并点击F5刷新,单击Network可以看到如下get请求,同时勾选Preserve log

3.随便输入一个账号密码后,点击登陆,找到Post请求(注意观察,此时的post请求对应的网址是‘https://logindict.youdao.com/login/acc/login

4.找到From Data ,即为post请求所要提交的数据,多次尝试输入账号密码,可以发现变化的量只有'ru','username','password',细心的朋友发现password与自己输入的明显不同,这是由于密码经过了加密处理。

5.先处理参数‘ru’,同时点击ctrl+shift+F,在搜索框内输入'ru',在get请求中找到我们所需的参数,由此可以推测,在每次请求、响应后,服务器都会给出一个‘ru’对应的数值,作为下一次post请求的表单参数。大家可以进行验证,记录本次响应的'ru'值,观察下一次请求所需的'ru'值,发现是一致的。

6.最后也是最难的密码加密,通过尝试,如果直接给password传入正确的密码,爬虫模拟登陆是失败的。可以参考有道登陆解密

搜索password,最后一行发现敏感内容,可以猜测是通过md5加密

再次搜索md5,发现在js文件里出现了对应函数,

我们将js文件保存,后通过python库execjs调用函数并求出加密后的值,具体可以参考Python3 ExecJS爬坑

最后就可以通过Session的方法进行模拟登陆了!

实操

1.首先导入必要的库

import requests
import bs4
import execjs

2.提取'ru'的值

#有道登陆网址
url='http://account.youdao.com/login?service=dict&back_url=http://dict.youdao.com/wordbook/wordlist%3Fkeyfrom%3Dlogin_from_dict2.index'
#创建Session对象
sess=requests.Session()
#初次访问
res=sess.get(url,allow_redirects=True)
#将复杂的html转化为树形结构,方便提取
soup=bs4.BeautifulSoup(res.content)
ru=soup.find('form').find_all('input')[4]['value']
print(ru)

输出结果如下:

3.获取加密后的密码

#打开保存的js文件
with open('logincom.js','r',encoding='utf-8') as f:
    js_str=f.read()
ctx = execjs.compile(js_str)
#输入自己的账号密码
password='XXXXXXX'
#ctx.call()的两个参数依此为调用函数和调用函数所需的值
password = ctx.call("hex_md5", password)
print(password)

输出如下:

4.构建表单数据,datas

datas={'app':'web',
        'tp':'urstoken',
        'cf':3,
        'fr':1,
        'ru':ru,
        'product':'DICT',
        'type':1,
        'um':'true',
         #输入自己的账号
        'username':'[email protected]',
        'password':password
}

5.模拟登陆

#post请求网址
url1='https://logindict.youdao.com/login/acc/login'
#发出post请求
res=sess.post(url1,data=datas,allow_redirects=True)
soup=bs4.BeautifulSoup(res.content)
print(soup)

将输出结果复制粘贴到xxx.txt文件内,保存为.html格式,然后双击打开,得到如下(如果出现乱码,将txt编码格式改为‘utf-8’后再保存)

完整代码如下:

import requests
import bs4
import execjs
url='http://account.youdao.com/login?service=dict&back_url=http://dict.youdao.com/wordbook/wordlist%3Fkeyfrom%3Dlogin_from_dict2.index'
sess=requests.Session()
res=sess.get(url)
soup=bs4.BeautifulSoup(res.content)
ru=soup.find('form').find_all('input')[4]['value']
with open('logincom.js','r',encoding='utf-8') as f:
    js_str=f.read()
ctx = execjs.compile(js_str)
password='xxxxxxxxx'
password = ctx.call("hex_md5", password)
datas={'app':'web',
        'tp':'urstoken',
        'cf':3,
        'fr':1,
        'ru':ru,
        'product':'DICT',
        'type':1,
        'um':'true',
        'username':'[email protected]',
        'password':password
}
url1='https://logindict.youdao.com/login/acc/login'
res=sess.post(url1,data=datas)
soup=bs4.BeautifulSoup(res.content)
print(soup)
发布了29 篇原创文章 · 获赞 26 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_42216109/article/details/98168413
2.