-
知乎模拟登陆的一些问题
以下是我遇到的主要问题
1.request请求:F12抓包可以知道url https://www.zhihu.com/api/v3/oauth/sign_in
,但请求参数众多,第一步获取cookie就报异常,所以转换思路用了selenium。
2.selenium+Chrome:输入知乎账号密码后报miss argument grant_type的异常,有没有验证码都报,而且在没有写close()或者qiut()方法的情况下自动闪退,网上说是版本问题,但我没重装 -
本文思路
本文是用QQ账号登陆的,登陆是另开第三方腾讯的接口,所以不再报miss argument grant_type的异常,另外还有个好处是,规避了验证码。
以下是代码和注释:
from selenium import webdriver
import time
def login(user, passwd):
driver = webdriver.Chrome()
# 注册页面
url = 'https://www.zhihu.com/signup?next=%2F'
driver.get(url)
# 选择登陆
driver.find_element_by_xpath('//div[@class="SignContainer-switch"]/span').click()
# 选择社交账号登陆
driver.find_element_by_xpath('//span[@class="Login-socialLogin"]').click()
# 选择QQ登陆,将会弹出一个QQ登陆窗口
driver.find_element_by_xpath('//button[@class="Button Login-socialButton Button--plain"][3]').click()
# 获取窗口id(有两个窗口,知乎登陆窗口和新弹出的QQ登陆窗口)
handles = driver.window_handles
# 选择QQ登陆窗口
driver.switch_to.window(handles[1])
# 选择窗口内嵌的框架
driver.switch_to.frame('ptlogin_iframe')
# 此处加载可能超时,设置等待
time.sleep(1)
# 选择账号登陆
driver.find_element_by_id('switcher_plogin').click()
# 输入账号
driver.find_element_by_id('u').send_keys(user)
# 输入密码
driver.find_element_by_id('p').send_keys(passwd)
# 点击登陆
driver.find_element_by_id('login_button').click()
# QQ登陆后该窗口将会消失,转到知乎登陆窗口
driver.switch_to.window(handles[0])
# 等待登陆完成和页面加载
time.sleep(5)
data = driver.page_source
driver.close()
return data
user = '#########'
passwd = '##########'
print(login(user, passwd))
-
这里需要注意的问题有以下几个:
1.可能是版本问题,不操作就闪退,但有操作还是会执行,所以不必在意,继续操作即可
2.窗口的切换,不做切换,selenium会继续操作之前窗口,窗口用handle标记
3.模拟登陆过QQ的应该知道QQ登陆是要进行框架切换的,否测就找不到元素,撞死在南墙上。
ok,就这样吧,以上代码都注释的很清楚了!