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':'xxxxxx@xxx.com',
        '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':'xxxxxx@xxx.com',
        'password':password
}
url1='https://logindict.youdao.com/login/acc/login'
res=sess.post(url1,data=datas)
soup=bs4.BeautifulSoup(res.content)
print(soup)

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

田土豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值