python+selenium
概念:
基于浏览器自动化的一个模块
快速入门
- 安装
pip install selenium
- 下载一个浏览器的驱动程序
- 实例化一个浏览器对象
- 编写基于浏览器自动化的操作代码
from selenium import webdriver
import lxml.etree as e
from time import sleep
from selenium.webdriver import ChromeOptions
# bor=webdriver.Edge(executable_path='./msedgedriver.exe')
# bor.get('http://scxk.nmpa.gov.cn:81/xk/')
# bor.get('https://www.ic.net.cn/')
#实现让selenium规避被检测到的风险
option=ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
#加载谷歌驱动程序
bro=webdriver.Edge('./msedgedriver.exe')
#对当前页面发起请求
bro.get('http://scxk.nmpa.gov.cn:81/xk/')
page_text=bro.page_source
# 解析企业名称
tree=e.HTML(page_text)
li_list=tree.xpath('//ul[@id="gzlist"]/li')
for li in li_list:
name=li.xpath('./d;/@title')[0]
print(name)
sleep(3)
bro.quit()
- page_source获取页面源码数据(加载完成后的)
- 标签定位:find系列的方法
- 标签交互:send_keys('xxx')
- 发起请求:get(url)
- 执行js程序:excute_script('jsCode')
- 前进,后退:back(),forward()
- 关闭浏览器:quit()
- 关闭当前页面:close()
- selenium处理iframe
- 如果定位的标签存在于iframe标签之中,则必须使用switch_to_frame('iframeResult')切换浏览器标签定位的作用域
- 动作链(拖动):from selenium.webdriver import ActionChains
- 实例化一个动作连对象:action=ActionChains(bro)
- 长安且点击标签 aciton.click_and_hold(div)
- action. Message: session not created: No matching capabilities foundmove_by_offset(x,y).perform()让动作连立即执行
- action.release()释放动作连对象
设置无头,不展示浏览器的EDGE浏览器
from selenium import webdriver
from time import sleep
# 实现无可视化界面
from selenium.webdriver.edge.options import Options
# 实现规避检测
from msedge.selenium_tools import EdgeOptions
from msedge.selenium_tools import Edge
# 实现无可视化界面的操作
EDGE = {
"browserName": "MicrosoftEdge",
"version": "103.0.1264.44",
"platform": "WINDOWS",
# 关键是下面这个
"ms:edgeOptions": {
'extensions': [],
'args': [
'--headless',
'--disable-gpu',
'--remote-debugging-port=9222',
]}
}
# 实现规避检测
option = EdgeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
# 如何实现让selenium规避被检测到的风险
bro = webdriver.Edge(executable_path='./msedgedriver.exe', capabilities=EDGE)
# 无可视化界面(无头浏览器)
bro.get("https://www.baidu.com")
print(bro.page_source)
sleep(2)
bro.quit()
seleium中./和.//定位,列表获取范围
List<WebElement> selectAddress = ToolDriver.getList("//*[@id=\"main_view\"]/div[4]/div/div/div/","选择部门");//div下方很有多个同一级div
WebElement webElement = selectAddress.get(selectAddress.size()-1);//同一级的最后一个div获取到
List<WebElement> findElements = webElement.findElements(By.xpath("./div"));//最后一级里面还有多个div此时就要区分使用./标识表示当前列表寻找div.//标识当前列表和当前及下方的列表寻找div
这里要注意.//表示在当前元素下接着寻找,如果没有前面的.使用//则是寻找该页码全部的匹配的元素
By.xpath("./div")定位div
使用./标识表示当前列表寻找div.//标识当前列表和当前及下方的列表寻找div
喜喜两种获取list Elements方式
第一种:获取父级再获取多个子集
WebElement findElement = chromeDriver.findElement(By.xpath("/html/body/div[2]/div/div[4]/div[1]/div[2]/div[4]/div[2]/ul"));
List<WebElement> findElements = findElement.findElements(By.xpath("li"));
第二种:直接获取多个子集
//直接将li写入xpath里用findElements获取多个li元素
chromeDriver.findElements(By.xpath("/html/body/div[2]/div/div[4]/div[1]/div[2]/div[4]/div[2]/ul/li"));
image.png
确定元素位置
mylabel = browser.find_element_by_xpath("html/body/div[15]/div[1]/label")
actions = ActionChains(browser)
移动到元素
actions.move_to_element_with_offset(mylabel,-10,0).click().perform()
ActionChains方法列表
click(on_element=None) ——单击鼠标左键
click_and_hold(on_element=None) ——点击鼠标左键,不松开
context_click(on_element=None) ——点击鼠标右键
double_click(on_element=None) ——双击鼠标左键
drag_and_drop(source, target) ——拖拽到某个元素然后松开
drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开
key_down(value, element=None) ——按下某个键盘上的键
key_up(value, element=None) ——松开某个键
move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标
move_to_element(to_element) ——鼠标移动到某个元素
move_to_element_with_offset(to_element, xoffset, yoffset) ——移动到距某个元素(左上角坐标)多少距离的位置
perform() ——执行链中的所有动作
release(on_element=None) ——在某个元素位置松开鼠标左键
send_keys(*keys_to_send) ——发送某个键到当前焦点的元素
send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素