使用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

然后填充到代码