1.导入selenium模块
2.安装与浏览器版本对应的自动化测试工具 谷歌浏览器从ChromeDriver网站中找
from selenium.webdriver import Chrome from selenium.webdriver.chrome.options import Options # 导入自定义配置模块 # 创建配置对象 chrome_options = Options() # chrome_options.add_argument(‘window-size=1920x3000‘) #指定浏览器分辨率 chrome_options.add_argument(‘--disable-gpu‘) #谷歌文档提到需要加上这个属性来规避bug chrome_options.add_argument(‘--hide-scrollbars‘) #隐藏滚动条, 应对一些特殊页面 chrome_options.add_argument(‘blink-settings=imagesEnabled=false‘) #不加载图片, 可以提升速度 # chrome_options.add_argument(‘--headless‘) #浏览器不提供可视化页面. linux下如果系统如果无界面不加这条会启动失败 chrome_options.add_experimental_option(‘excludeSwitches‘, [‘enable-automation‘])#取消浏览器驱动提示 #如果将浏览器驱动的路径设置到环境变量,可以不用传参数 #options 表示配置项 driver = Chrome(options=chrome_options) driver.get(‘https://sports.qq.com/nba/‘) #访问腾讯体育 text = driver.page_source #获取页面的源代码 可以从中获取数据 print(text)
# selenium提供了很多用于解析数据的函数 from selenium.webdriver import Chrome driver = Chrome() driver.get(‘http://www.baidu.com‘) #访问百度 tag = driver.find_element_by_class_name(‘index-logo-src‘) #通过类名拿到标签 # tag = driver.find_element_by_css_selector(‘.index-logo-src‘) #标签的相关内容 print(tag.text) #标签内容 print(tag.parent) #得到的是driver对象,不是父标签 print(tag.get_attribute(‘src‘))#拿到标签中src属性 print(tag.tag_name) #标签名 #一些特别的查找方式 #根据连接的文本查找 tag1 = driver.find_element_by_link_text(‘学术‘) #文本完全匹配 tag2 = driver.find_element_by_partial_link_text(‘术‘) #文本部分匹配 tag3 = driver.find_element_by_name(‘tj_trhao123‘) #属性名name=tj_trhao123 tag4 = driver.find_element_by_tag_name(‘body‘) #标签名称为body #所有方法都带有s的版本,用来获取查找所有匹配,返回一个列表 res = driver.find_elements_by_class_name("mnav") print(res) #嵌套查找 tag5 = driver.find_element_by_class_name("tools") tag6 = tag5.find_element_by_css_selector("#mHolder") #与显示相关的属性 tag7 = driver.find_element_by_class_name("index-logo-src") print(tag7.location) #位置信息 print(tag7.size) #大小信息 #打开浏览器10s后自动关闭 import time time.sleep(10) driver.close() #注意:通过class查找,driver.find_element_by_class_name() ()里面只能有一个值,不能存在空格隔开的多个值
#完成百度搜索,先搜索redvelvet 1s 后搜索wendy from selenium.webdriver import Chrome from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By driver = Chrome() driver.get(‘https://www.baidu.com‘) #隐式等待 driver.implicitly_wait(10) #当要查找的某个元素不存在时 会等一会查找一次(轮询)直到找到该元素 如果超时,则会报错 #找到输入框 key_input = driver.find_element_by_id(‘kw‘) #发送搜索信息 key_input.send_keys(‘redvelvet‘) #回车 key_input.send_keys(Keys.ENTER) #显示等待 明确等待某一个元素 满足某个条件 #等到页面上出现一个id为content_left 的元素为止,最长等待时间为10s WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,‘content_left‘))) #获取搜索结果 如果直接获取元素,可能因为页面没有加载完毕 导致获取失败,需要完成等待元素加载的操作 div = driver.find_element_by_id(‘content_left‘) print(div) import time time.sleep(1) key_input = driver.find_element_by_id(‘kw‘) key_input.clear() #清空输入框 key_input.send_keys(‘wendy‘) key_input.send_keys(Keys.ENTER)
from selenium.webdriver import Chrome #创建动作链对象要导入的模块 from selenium.webdriver import ActionChains driver = Chrome() driver.get("http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable") #隐式加载 driver.implicitly_wait(5) #切换fream 页面分了好几个fream 我们要切换到标签所在的fream driver.switch_to.frame("iframeResult") #获取要拖动的标签 tag = driver.find_element_by_id(‘draggable‘) #要拖动标签的位置 print(tag.location) #获取目标位置标签 tag2 = driver.find_element_by_id(‘droppable‘) #目标标签的位置 print(tag2.location) #创建一个动作对象 asc = ActionChains(driver) #x移动的距离 # dis = tag2.location[‘x‘] - tag.location[‘x‘] # asc.click_and_hold(tag).perform() #点击并且按住,perform表示执行这一动作 # asc.move_to_element(tag2).perform() #移动到指定标签位置 # asc.release().perform() #松手 #上述方式 线性移动 几乎瞬移 很容易被判断为机器人(程序) #解决方法 asc.click_and_hold(tag).perform() #循环逐渐移动 while tag.location[‘x‘] < tag2.location[‘x‘]: ActionChains(driver).move_by_offset(1,0).perform() #每次朝x移动1 asc.release().perform() #============================================================================== #切换到当前fream的父辈fream driver.switch_to.parent_frame() #拿到父辈fream中的标签 driver.find_element_by_id(‘textareaCode‘)
from selenium.webdriver import Chrome driver = Chrome() driver.get("https://www.baidu.com") #1.执行js driver.execute_script("alert(‘小电影‘)") #2.导航前进后退 driver.get("https://www.baidu.com") driver.get("https://www.qq.com") driver.get("https://www.sina.com") driver.back() #后退 driver.forward() #前进 #3.切换选项卡 #创建选项卡 driver.execute_script(‘window.open()‘) #切换到指定选项卡 driver.switch_to.window(driver.window_handles[1]) #在新的选项卡中加载下面页面 driver.get(‘https://www.qq.com‘) #再次切换选型卡 driver.switch_to.window(driver.window_handles[0])
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.keys import Keys import time # 创建配置对象 chrome_options = Options() # chrome_options.add_argument(‘window-size=1920x3000‘) #指定浏览器分辨率 chrome_options.add_argument(‘--disable-gpu‘) #谷歌文档提到需要加上这个属性来规避bug # chrome_options.add_argument(‘--hide-scrollbars‘) #隐藏滚动条, 应对一些特殊页面 chrome_options.add_argument(‘blink-settings=imagesEnabled=false‘) #不加载图片, 可以提升速度 driver = webdriver.Chrome(options=chrome_options) driver.get("https://pages.tmall.com/wow/car/act/zhizu") driver.implicitly_wait(10) # 天猫汽车是懒加载 需要滑动屏幕显示出对应数据再获取 # 这种方式 无法预知到底要按多少次下 # for i in range(1000): # driver.find_element_by_tag_name("body").send_keys(Keys.DOWN) #平滑到底部 加载所有数据到页面 滑动速度太快,无法加载完善 #scrollTo可以把内容滚动到指定的坐标 ({})里面包含top和behavior两个参数 #document.body.clientHeight 获取页面高度 # driver.execute_script(""" # window.scrollTo({ # top: document.body.clientHeight, # behavior:‘smooth‘ # }) # """) # 慢慢滑动 # 执行js获取总高度 height = driver.execute_script("return document.body.clientHeight") # 已经滑动的距离 dis = 0 while dis < height: driver.execute_script(""" window.scrollTo({ top: %s, behavior: "smooth" });""" % dis) dis += 200 #防止均匀加速 time.sleep(0.2) # 获取页头 四个推荐数据 big_div = driver.find_element_by_class_name("zebra-car-goods-1x1") item_div = big_div.find_element_by_css_selector("div") res = item_div.find_elements_by_css_selector(".item") for i in res: print(i.find_element_by_tag_name("a").get_attribute("href")) print(i.find_element_by_css_selector(".img").get_attribute("src")) print(i.find_element_by_css_selector(".info .title").text) infos = i.find_elements_by_css_selector(".interest") print([k.text for k in infos]) # 获取汽车列表 sections = driver.find_elements_by_class_name("zebra-car-goods-1x2") for s in sections: bloks = s.find_elements_by_css_selector(".block") for b in bloks: print(b.find_element_by_css_selector("a").get_attribute("href")) print(b.find_element_by_css_selector(".main").get_attribute("src")) print(b.find_element_by_css_selector(".title").text) infos = b.find_elements_by_css_selector(".interest") print([k.text for k in infos]) driver.close()
原文:https://www.cnblogs.com/lizeqian1994/p/10751172.html