有些场景不能用BeautifulSoup解决,例如一些弹框点击,模拟操作浏览器页面,这个时候,就得使用selenium
安装selenium
安装chrome和驱动chromedriver chrome官方下载地址
chromedriver国内驱动
chrome和chromedriver的版本号要对应才可以
上面的驱动已经没有更新最新驱动了。可以在下面链接获取匹配的驱动
chromedriver国内最新镜像驱动
windows配置环境变量
linux配置
chrome和chromedriver需要相同版本,所以我们安装指定版本,目前最新版本是121.0.6167.185,但是驱动只更新到121.0.6167.184
下载121.0.6167.184版本的chromedriver
1 2 3 wget https://storage.googleapis.com/chrome-for-testing-public/121.0.6167.184/linux64/chromedriver-linux64.zip -O chromedriver_linux64.zip # 解压 unzip chromedriver_linux64.zip -d /
下载安装121.0.6167.184版本的chrome
1 2 3 wget https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_121.0.6167.184-1_amd64.deb sudo dpkg -i google-chrome-stable_121.0.6167.184-1_amd64.deb sudo apt-get install -f
1 2 sudo mv /chromedriver /usr/local/bin/ sudo sh -c 'echo "PATH=\$PATH:/usr/bin/google-chrome:/usr/local/bin/chromedriver" >> /etc/environment'
基础使用 1 2 3 4 5 from selenium import webdriverdriver = webdriver.Chrome() driver.get('http://www.baidu.com/' )
ChromeOptions配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 from selenium import webdriveroption = webdriver.ChromeOptions() option.add_argument('--no-sandbox' ) option.add_argument('--disable-dev-shm-usage' ) option.add_argument('--disable-extensions' ) option.add_argument('--headless' ) option.add_argument('--disable-extensions' ) option.add_argument('--disable-infobars' ) option.add_argument('--disable-browser-side-navigation' ) option.add_argument('proxy-server=socks5://127.0.0.1:8888' ) driver = webdriver.Chrome(options=option) driver.get('http://www.baidu.com/' )
还有一个很常用的。等待元素出现。例如点击A按钮之后,过一会才会出现B元素,那么需要使用到WebDriverWait
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECoption = webdriver.ChromeOptions() option.add_argument('--headless' ) option.add_argument('--disable-extensions' ) option.add_argument('proxy-server=socks5://127.0.0.1:8888' ) driver = webdriver.Chrome(options=option) driver.get('http://www.baidu.com/' ) wait = WebDriverWait(driver, 10 ) wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'enter-btn' )))
新标签页 如果有打开新标签页的情况可以使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 handles = driver.window_handles pick_links[0 ].click() wait.until(EC.new_window_is_opened(handles)) handles = driver.window_handles driver.switch_to.window(handles[-1 ])
find_element 用法
根据id寻找元素
1 element.find_element(By.ID, 'postlist' )
根据class寻找元素,如果会找到多个。就用find_elements
1 element.find_element(By.CLASS_NAME, 'enter-btn' )
根据id,模糊寻找message_
1 element.find_element(By.XPATH, "//*[contains(@id, 'message_')]" )
根据class模糊寻找元素message_
1 element.find_element(By.XPATH, './/*[contains(@class, "message_")]' )
以上用法基本可以满足涉及到selenium的日常脚本需求了。