这是真原创,哈哈哈哈哈……
一:模拟登录并保存cookies
在弄这一块的过程中出现了好几个问题,比较基础但当时很头疼,这里写出来,和大家分享学习一下。
搜狗问问打开界面如下,点击登陆,选择qq账号密码登陆。
源码如图
点击登陆
driver.find_element_by_xpath('//*[@id="s_login"]').click()
点击登陆后应该点击账号密码登陆,
driver.find_element_by_xpath('//*[@id="switcher_plogin"]').click()
但这个时候显示定位不到元素:
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {“method”:“xpath”,“selector”:"//*[@id=“switcher_plogin”]"}
可明明没有问题,却为什么这样呢。原因如下:
当点击登陆的时候,新生成了一个iframe框,只有先定位到iframe框后,才能定位想定位的标签元素。
然后就先定位到iframe上,
driver.switch_to.frame('ptlogin_iframe')
照理说这个时候应该没有问题了,可还是报错,提示定位失败,哭了……
no such element: Unable to locate element: {“method”:“css selector”,“selector”:"[id=“ptlogin_iframe”]"}
折腾来折腾去,再看了一下代码,发现原来这个iframe外面还包着一个iframe,emmmm
那就先跳转到外层iframe。
driver.switch_to.default_content()
driver.switch_to.frame("login_iframe")
driver.switch_to.frame('ptlogin_iframe')
driver.find_element_by_xpath('//*[@id="switcher_plogin"]').click()
完整代码如下:
import json,time
# 用户登陆并保存cookie
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("https://wenwen.sogou.com/cate/tag/?ch=ww.dh.fly")
driver.find_element_by_xpath('//*[@id="s_login"]').click()
time.sleep(3)
driver.switch_to.default_content()
driver.switch_to.frame("login_iframe")
driver.switch_to.frame('ptlogin_iframe')
driver.find_element_by_xpath('//*[@id="switcher_plogin"]').click()
time.sleep(3)
driver.find_element_by_id("u").send_keys("10086")
time.sleep(3)
driver.find_element_by_id("p").send_keys("12456789")
time.sleep(3)
driver.find_element_by_id("login_button").click()
time.sleep(3)
cookies = driver.get_cookies()
with open("cookie.txt","w" ) as f:
f.write(json.dumps(cookies))
二.利用cookies登陆搜狗问问
前面一节保存了cookies后,现在就直接利用cookie登陆。
代码如下
from selenium import webdriver
import json,time
url = 'https://wenwen.sogou.com/cate/tag/?ch=ww.dh.fly'
driver = webdriver.Chrome()
# driver.maximize_window()
driver.get(url)
# 使用cookies登陆
driver.delete_all_cookies()
f1 = open('cookie.txt')
cookie = json.loads(f1.read())
f1.close()
for c in cookie:
if 'expiry' in c:
del c['expiry']
driver.add_cookie(c)
driver.refresh()
最后几行代码,要删除那个expiry字段,不然会报错
四、疑难杂症
对于类标签含有多个类的情况,可做如下处理。
driver.find_element_by_css_selector("[class = 'section hide ']")
或者
driver.find_element_by_class_name('section,hide')