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选择器写错了,一是访问页面确实没有这个元素。。。上个图


我要的是密码登录,它默认是免密码登录,你不先点击密码登录,是提取不到密码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()
结果,又来了个请求参数异常,请升级客户端。。。

啥意思,我浏览器也没问题啊,升级哪个客户端额。。。于是自己手动访问了下,发现没问题啊。这个是啥子情况呢。。。经过思考(百度找),有了解决方法:
-
手动启动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⊙)…
浙公网安备 33010602011771号