Selenium模拟登陆知乎的二三事

知乎 不知道从什么时候开始,不登录的话,只能看一丢丢

我用Chrome比较多,所以弄了ChromeWebdriver + Chrome + Selenium 来弄这个模拟登陆。。。

大致的过程是这样的,发起请求,定位目标元素,该传值传值,该单击单击。。。一切都是如此的流畅,然而。。。

第一个坑出现了,以前这么做就行

browser.get("https://www.zhihu.com/signin")
browser.find_element_by_css_selector(".SignFlow-accountInput.Input-wrapper input").send_keys(Keys.CONTROL+"a")
browser.find_element_by_css_selector(".SignFlow-accountInput.Input-wrapper input").send_keys("username")
browser.find_element_by_css_selector(".SignFlow-password .Input-wrapper input").send_keys(Keys.CONTROL+"a")
browser.find_element_by_css_selector(".SignFlow-password .Input-wrapper input").send_keys("password")
browser.find_element_by_css_selector(".Button.SignFlow-submitButton").click()

现在这么做,总会告诉你找不到密码输入的input。找不到就俩情况,一是xpath或者css选择器写错了,一是访问页面确实没有这个元素。。。上个图

pic1

pic2

我要的是密码登录,它默认是免密码登录,你不先点击密码登录,是提取不到密码input的。。。so:

browser = webdriver.Chrome(executable_path="webdriver路径")
browser.get("https://www.zhihu.com/signin")
# 在提取元素之前,先点击下密码登录
browser.find_element_by_xpath('//div[@class="SignFlow-tabs"]/div[2]').click()
browser.find_element_by_css_selector(".SignFlow-accountInput.Input-wrapper input").send_keys(Keys.CONTROL+"a")
browser.find_element_by_css_selector(".SignFlow-accountInput.Input-wrapper input").send_keys("username")
browser.find_element_by_css_selector(".SignFlow-password .Input-wrapper input").send_keys(Keys.CONTROL+"a")
browser.find_element_by_css_selector(".SignFlow-password .Input-wrapper input").send_keys("password")
browser.find_element_by_css_selector(".Button.SignFlow-submitButton").click()

结果,又来了个请求参数异常,请升级客户端。。。

pic3

啥意思,我浏览器也没问题啊,升级哪个客户端额。。。于是自己手动访问了下,发现没问题啊。这个是啥子情况呢。。。经过思考(百度找),有了解决方法:

  • 手动启动Chrome(启动前关闭所有的Chrome实例)

    • cmd里启动Chrome,cd到Chrome目录下,输入chrome.exe --remote-debugging-port=9222

    • 访问 127.0.0.1:9222/json

  • 上代码

    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.chrome.options import Options
    
    
    chrome_option = Options()
    chrome_option.add_argument("--disable-extensions")
    chrome_option.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
    browser = webdriver.Chrome(executable_path="ChromeWebdriver路径", chrome_options=chrome_option)
    browser.get("https://www.zhihu.com/signin")
    browser.find_element_by_xpath('//div[@class="SignFlow-tabs"]/div[2]').click()
    # 全选input的内容,再输入账号,防止出错
    browser.find_element_by_css_selector(".SignFlow-accountInput.Input-wrapper input").send_keys(Keys.CONTROL + "a")
    browser.find_element_by_css_selector(".SignFlow-accountInput.Input-wrapper input").send_keys("account")
    # 全选input的内容,再输入密码,防止出错
    browser.find_element_by_css_selector(".SignFlow-password .Input-wrapper input").send_keys(Keys.CONTROL + "a")
    browser.find_element_by_css_selector(".SignFlow-password .Input-wrapper input").send_keys("password")
    
    browser.find_element_by_css_selector(".Button.SignFlow-submitButton").click()
    # 成功登陆后,取到cookies
    browser.get("https://www.zhihu.com")
    cookies = browser.get_cookies()
    

亲测有用,顺利的登陆进去了。。。好像在账号密码正确的时候登录一般不会跳倒立文字的验证码。就先这样了。(⊙o⊙)…

posted on 2021-03-16 15:40  Acjm  阅读(100)  评论(0)    收藏  举报

导航