selenium 模块(4)
几句题外话
因为准备期末考试的缘故,有一段时间没有写博文了,今天认真一看竟然已经有一个月没有写了。虽然我的博文只有零零总总几人看过,但期间有位大佬 “催更” ,真是叫我汗颜。
如果关注过我写的东西的时间,或许各位就会看到我中间大概有三四个月的时间没有写过博文。
明白了这一点,或许各位看官就大概能理解我的感动了,毕竟对于我这种非计算机专业的人来说,CSDN大佬的鼓励或是指正,就是激励我坚持的一个重要因素了吧。
闲话少说,今天我忙里偷闲写一篇博文,希望对各位看官有帮助。如若没有,绝对是因为我对其中的理解不够深刻。写这一篇博客,大概也有告诉那位 “大佬“ 我仍会继续坚持下去的意思。
与各位看官共勉。(似乎语气有些大了呢 ^_^
)
搜索框的关键词输入(以京东为例)
在上一篇的博文中,我们提到了对商品页的商品点击以及使用滚轮的方法破解动态加载的问题。
那么问题来了,如果我既要对 “ 奥特曼 ” 这个关键词下的商品页面进行这个操作,又要对 “ 小怪兽 ”关键词下的商品页面进行同样的操作怎么办?难道要写两个程序吗?
正所谓爬虫(技术)的出现是为了一劳永逸,所以写两个程序这种笨办法绝不是我们最后会选择的办法。
既然我们使用 selenium 模块是为了模拟浏览器,那么我们就模拟到底,关键词的输入也通过程序来解决。
首先我们使用 xpath 定位定位到搜索框的位置
然后输入关键词。使用send_keys() 方法
话不多说,直接上代码。
from time import sleep
from selenium import webdriver
if __name__ == '__main__':
bor = webdriver.Chrome("chromedriver.exe")
# 发送请求
bor.get("https://www.jd.com/")
key_word_list = ["奥特曼", "小怪兽"]
for i in key_word_list:
# 定位搜索框
key_input = bor.find_element_by_id("key")
# 定位搜索按钮
key_bot = bor.find_element_by_class_name("button")
# 输入关键词
key_input.send_keys(i)
sleep(2)
# 点击
bor.execute_script("arguments[0].click()", key_bot)
sleep(2)
# 返回原始窗口
bor.back()
sleep(2)
# 退出
bor.quit()
其中
bor.back() 相当于浏览器的后退功能
bor.forward() 相当于浏览器的前进功能
有关 iframe 框架的 xpath 定位(以 QQ 空间为例)
前面我们知道了输入关键词,然后我们就激动地想到了激动人心的使用selenium实现模拟登录了,话不多说我们直接上代码。
rom time import sleep
from selenium import webdriver
if __name__ == '__main__':
bor = webdriver.Chrome("chromedriver.exe")
bor.get("https://qzone.qq.com/")
# 首先定位到 “账号密码登录” 并点击
btn = bor.find_element_by_id("switcher_plogin")
bor.execute_script("arguemnts[0].click()")
sleep(2)
# 定位到密码和账号输入框
username = bor.find_element_by_id("u")
username.send_keys("123456") # 输入账号
sleep(2)
password = bor.find_element_by_id("p")
password.send_keys("1213456") # 输入密码
sleep(2)
# 点击登录
login_button = bor.find_element_by_id("login_button")
sleep(2)
bor.quit()
但我们一运行就发现不对了,怎么报错了?
这是怎么回事?难道没有定位到响应的元素?那这是为什么呢?
我们分析源码发现我们要定位的元素都在 iframe 的框架下
而直接使用 xpath 模块是无法直接定位框架下的元素的,所以我们要先进入这个框架
使用bro.switch_to.frame("我们要定位的 iframe 的 ID") # 切换浏览器标签定位的作用域.
from selenium import webdriver
from selenium.webdriver import ActionChains
bro = webdriver.Chrome(executable_path = "chromedriver.exe")
bro.get(url = "")
# 如果定位的标签是在 iframe 标签里面,则必须通过如下操作进行标签定位
bro.switch_to.frame("我们要定位的 iframe 的 ID") # 切换浏览器标签定位的作用域
div = bro.find_element_by_xpath('')
# 实例化动作链
action = ActionChains(bro)
# 点击长按指定标签
action.click_and_hold(div)
# perform() 表示立即执行动作链
# move_by_offset(x, y)。 X 表示水平方向,Y 表示竖直方向
action.move_by_offset(17, 0).perform()
# release 释放动作链
action.release().perform()
# 退出
bro.quit()