python 用selenium模拟登陆知乎

  • 知乎模拟登陆的一些问题
    以下是我遇到的主要问题
    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的异常,另外还有个好处是,规避了验证码。
    python 用selenium模拟登陆知乎_第1张图片
    以下是代码和注释:
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,就这样吧,以上代码都注释的很清楚了!

你可能感兴趣的:(技术分享)