使用Python或PHP实现浏览器自动化操作
下载浏览器驱动
- https://chromedriver.chromium.org/downloads(谷歌浏览器)
- https://github.com/mozilla/geckodriver/releases(火狐浏览器)
- https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver(微软edge)
在Python语言里面使用Selenium
安装
pip3 install selenium
创建浏览器对象
- executable_path需要下载到本地
from selenium import webdriver
browser = webdriver.Chrome(executable_path="./exe/chromedriver") # 使用谷歌浏览器
# browser = webdriver.Firefox(executable_path="./geckodriver") # 使用火狐浏览器
# browser = webdriver.Edge(executable_path="./microsoft-edge") # 使用edge
创建浏览器后,可以使用get方法打开网页
browser.get("https://www.baidu.com")
元素定位方式
- By.ID
- By.XPATH 用于在 XML 和 HTML 文档中进行定位和选择的语言
- By.LINK_TEXT 根据链接文本来选择元素
- By.PARTIAL_LINK_TEXT 根据部分链接文本来选择元素
- By.NAME
- By.TAG_NAME 标签名称
- By.CSS_SELECTOR 根据 CSS 选择器来选择元素
from selenium.webdriver.common.by import By
browser.find_element(by=By.ID, value='my_id')
browser.find_element(by=By.XPATH, value='input[type='submit']')
browser.find_element(by=By.LINK_TEXT, value='新闻')
browser.find_element(by=By.PARTIAL_LINK_TEXT, value='新')
browser.find_element(by=By.NAME, value='user')
browser.find_element(by=By.TAG_NAME, value='div')
browser.find_element(by=By.CLASS_NAME, value='foo_class')
browser.find_element(by=By.CSS_SELECTOR, value='#sty')
查找单个元素
- 捕获NoSuchElementException异常判断是否找到元素
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
try:
element = browser.find_element(by=By.ID, value='my_id')
except NoSuchElementException:
print('元素没有找到'')
查找多个元素
- 未找到元素的时候数据长度为0,不会抛出异常
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
elements = browser.find_elements(by=By.CLASS, value='my_class')
for element in elements:
print(element)
点击元素
element.click()
输入文本
element.send_keys('root')
获取元素属性
element.get_attribute('style')
element.get_attribute('data-id')
获取元素文本
text = element.text
获取页面源码
html = browser.page_source
切换到iframe
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
try:
iframe = browser.find_element(By.TAG_NAME, 'iframe')
browser.switch_to.frame(iframe)
except NoSuchElementException:
logging.info("没找到iframe标签")
回到主文档
browser.switch_to.default_content()
等待新元素出现
- 防止网络慢加载不及时,导致程序异常
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
button = WebDriverWait(browser, 10).until(
EC.presence_of_element_located((By.ID, 'example_button'))
)
捕获WebDriverWait
超时
- 超过
WebDriverWait
设定的最大时间,会抛出TimeoutException
try:
WebDriverWait(browser, 1.5).until(EC.presence_of_element_located((By.CLASS_NAME, 'modal')))
except TimeoutException:
print('等待弹出层超时')
提交表单
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
try:
form = browser.find_element(By.TAG_NAME, 'form')
form.submit()
except NoSuchElementException:
logging.info("没找到form表单")
切换窗口
window_handles = browser.window_handles
browser.switch_to.window(window_handles[1])
拖拽元素
from selenium import webdriver
from selenium.webdriver import ActionChains
# 获取要拖动的元素和目标元素
draggable = browser.find_element_by_id("draggable")
droppable = browser.find_element_by_id("droppable")
# 构建鼠标动作
actions = ActionChains(driver)
actions.drag_and_drop(draggable, droppable).perform()
关闭浏览器
browser.quit()
在PHP语言里面使用Selenium
安装
composer require php-webdriver/webdriver
启动webdriver
- chromedriver –port=4444
- geckodriver
创建浏览器对象
- webdriver需要单独启动
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
require 'vendor/autoload.php';
$serverUrl = 'http://localhost:4444';
$browser = RemoteWebDriver::create($serverUrl, DesiredCapabilities::chrome());
//$browser = RemoteWebDriver::create($serverUrl, DesiredCapabilities::firefox());
//$browser = RemoteWebDriver::create($serverUrl, DesiredCapabilities::microsoftEdge());
其他步骤跟python基本一致
通过谷歌浏览器获取元素
获取头像元素
右键复制selector或XPath
然后填充到代码