最新 详解如何模拟登录知乎 英文验证码以及中文倒立字(2.0 持续更新)
–持续更新中—
可转至我的博客:http://www.dwlufvexyu.com/%e6%9c%80%e6%96%b0-%e8%af%a6%e8%a7%a3%e5%a6%82%e4%bd%95%e6%a8%a1%e6%8b%9f%e7%99%bb%e5%bd%95%e7%9f%a5%e4%b9%8e%ef%bc%882-0-%e6%8c%81%e7%bb%ad%e6%9b%b4%e6%96%b0%ef%bc%81%ef%bc%89/
开始更新:
废话不多讲,一样的直接入正题;
爬取知乎,需要登录;只要登录获得了cookie,便可反复利用
那么首先说说如何最简单的登录知乎?看我的另一篇博文
接下来开始一步一步操作:
首先,第一步:直接 进行 “检查”; 获取到 “密码登录”的xpath元素(直接复制即可)。
#切换登录
change_login = browser.find_element_by_xpath('//*[@id="root"]/div/main/div/div/div[1]/div/form/div[1]/div[2]')
#进行点击
change_login.click()
Step 2. 直接“检查”到 账号以及密码框;
可以看到<账号 是input name="username" 以及 密码 name="password">
然后直接用find_element_by_name找到 对应输入框,然后利用send_keys进行传值。这里为了避免以前登陆过,进页面会有存有的账号密码导致重复输入,所以先执行ctrl+A进行输入框内容的选中,再进行传值。
这里手机号以13579246810,密码admin123为例 ;如图,这里设置延时,为了得到更好的查看效果,为了速度可以不要。
#可以设置延时
time.sleep(1)
#采用ctrl+a 进行选中输入 进行覆盖 避免追加输入导致账号密码错误
browser.find_element_by_name("username").send_keys(Keys.CONTROL+"a")
browser.find_element_by_name("username").send_keys('13579246810')
time.sleep(1)
browser.find_element_by_name("password").send_keys(Keys.CONTROL + "a")
browser.find_element_by_name("password").send_keys('admin123')
time.sleep(1)
step3.账号密码输入完毕后,进行确定。同样进行 “检查” 找到“确定”的xpath元素。再进行click() ; 等待10s进行判断,这里等待10s是为了 假如登陆成功,需要一定时间进行加载页面;”
login = browser.find_element_by_xpath('//*[@id="root"]/div/main/div/div/div[1]/div/form/button')
login.click()
#这里如果直接登录成功,则等待10s等待跳转后的页面加载完成
time.sleep(10)
#如果是登录False
login_success=False
那么随机找到一个登陆成功页面的xpath元素,那么就可以判断是已登陆成功,反之False; 如找到如下元素div的xpath,如果存在,那么为True;
while not login_success:
try:
notify_ele=browser.find_element_by_class_name('Popover PushNotifications AppHeader-notifications')
login_success=True
except:
pass
如果不存在,登陆失败,则pass继续操作,进行判断中/英文验证码
英文验证码:
中文同样的:
#判断英文验证码还是倒立字验证码
try:
english_captcha_element = browser.find_element_by_class_name('Captcha-englishImg')
except:
english_captcha_element = None
try:
chinese_captcha_element = browser.find_element_by_class_name('Captcha-chineseImg')
except:
chinese_captcha_element = None
接下来就先识别英文二维码吧:
有三种打码方式 : 编码实现(tesseract-ocr) 识别率低 , 在线打码(云打码) ,人工打码(后两者识别率更高,通过平台提供的API),通常使用在线打码(也就是云打码)
这里我们用 “云打码” 平台(比较好用的在线打码平台),进入官网,我们创建一个用户 以及 一个开发者账号(账号密码可设置为一样) 方便测试;关于为什么 需要创建两个账户,可以百度。这里简要说一下 ,开发者通过平台给用户提供调用API,当用户在线打码成功,开发者会获得相应的分成利润。
如????,可以看到我的开发者用户,测试已经获取0.1的分成了。
用户界面,每次打码都会消耗积分
进入开发者中心,下载最新云打码接口
下好之后,记得改好文件;如下
现在来仔细看英文验证码:从图中可以明显看出是base64加密,且有一段是多余的,除此之外有个坑还~仔细看有个%0A也是多余的
所以我们先解码
if english_captcha_element:
#这里解码同中文倒立字
#取src
base64_text = english_captcha_element.get_attribute("src")
import base64
#打上断点来debug看看code是什么
#替换
code = base64_text.replace("data:image/jpg;base64,","").replace("%0A","")
#print(code)
f = open("yzm_en.jpeg", "wb")
f.write(base64.b64decode(code))
f.close()
多达75次的%0A
接下来就是调用云打码平台提供的api,下面的账号密码是注册的用户的账号密码~
验证码code 如果为空,就继续打码
#采用云解码提供的API 在线打码
#导入之前云打码下载的那个包
from douban.tools.yundama_requests import YDMHttp
#username passwd appID appKey
yundama=YDMHttp("username","passwd",'appid','appkey')
#图片名 及 打码方式
code=yundama.decode("yzm_en.jpeg",5000,60)
#判断是否成功
while True:
if code == "":
code = yundama.decode("yzm_en.jpeg",5000,60)
else:
break
#成功后自动输入验证码;同样send_keys传入验证码值~
browser.find_element_by_xpath('//*[@id="root"]/div/main/div/div/div[1]/div/form/div[4]/div/div/label/input').send_keys(code)
如下可以看到已经识别成功了~~~
然后就直接登录成功了~~
-----持续更新------
上一篇: 2020年中大厂前端面试总结
下一篇: 数据库索引鸟瞰(整理并学习)