有个比较有趣的网站,需要执行两个步骤:
切换到other商品页面
筛价,即输入价格区间
emmm,没有前后顺序要求,这个网站也比较神奇
上代码在解释
# -*- coding:utf-8 -*-
import re
from selenium import webdriver
driver_path = r'E:\Tools\cd\chromedriver.exe'
chrome_options = webdriver.ChromeOptions()
driver = webdriver.Chrome(executable_path=driver_path)
driver.get("https://saudi.souq.com/sa-en/dental-care/70-1781-sar/a-cp/l/?ref=nav&page=1")
driver.maximize_window()
# 获取网页源码
source = driver.page_source
# print(source)
# 在源码中匹配other商品链接,这里用的re,也可以用xpath
url = re.search('value="(.*?other.*)"', source).group(1).strip()
# print(url)
# selenium打开新页面,即other商品页面
js = " window.open('{}')".format(url) # 可以看到是打开新的标签页 不是窗口
driver.execute_script(js)
# 获取当前已打开的页面的所有句柄(两个页面,一个是全部商品页面,一个other商品页面)
all_handles = driver.window_handles
# 当前句柄在全部商品页面,切换到other商品页面
driver.switch_to.window(all_handles[1])
for h in all_handles:
print(h)
# 控制页面下拉200元素
js = "var q=document.documentElement.scrollTop=200"
driver.execute_script(js)
# 获取最低价格输入框
min_price_input = driver.find_element_by_class_name('valueStart')
# 清除输入框内原有数据
min_price_input.clear()
# 传入新数据
min_price_input.send_keys('80')
# 获取最高价输入框
max_price_input = driver.find_element_by_class_name('valueEnd')
max_price_input.clear()
max_price_input.send_keys('1000')
# 应用价格按钮
apply_btn = driver.find_element_by_css_selector('[class="sk-bg-clr1 sk-bg-clr1-eff blue-button button tiny range-slider'
'-apply"]')
apply_btn.click()
代码不多,但是有趣的地方不少:
首先,selenium定位不到other这个button,也许定位到了,点击不生效,或者不跳转:
严格来说,它是一个input,但是,勾选上会自动跳转,selenium未跳转不知道为什么。
开发者模式可以看见,它其实是一个url链接:
思路就有了,用re在page_source直接拿这个链接,新开页面。
打开新页面就是句柄的操作。
在后续操作中,获取到输入框要清理掉里面原有的数据。
定位button时,要用css选择器,因为class是复合型的,也就是class属性中间有空格。
最后就没有什么需要注意的了。