Selenium 使用本地浏览器

Python爬虫Python爬虫 2024-06-30 22:10:01 729
摘要: 安装python 复制代码 pipinstallselenium                                                浏览器                        地址                                                                        Edge                        developer.microsoft.com/en-us/micro…                                                        Firefox                        github.com/mozilla/gec…                                                        Safari                        webkit.org/blog/6...

  安装

  pip install selenium

浏览器 地址
Edge developer.microsoft.com/en-us/micro…
Firefox github.com/mozilla/gec…
Safari webkit.org/blog/6900/w…
Chrome(113之前) CNPM Binaries Mirror (npmmirror.com)
Chrome(113之后) CNPM Binaries Mirror

  在 Selenium4中,webdriver.Chrome的初始化方法不再接受executable_path参数来指定Chrome WebDriver的路径。会自动下载驱动。

  使用本地浏览器

  找到本地浏览器

image.png

  命令行启动本地浏览器

  启动前确保其他Chrome实例都关闭

  shell

  复制代码

  cd C:\Program Files\Google\Chrome\Application chrome.exe --remote-debugging-port=9222

  使用selenium调用

  from selenium import webdriver from scrapy.selector import Selector from selenium.webdriver.common.by import By browser_options = webdriver.ChromeOptions() # 这段代码用于启用 Chrome 浏览器的调试功能,并将调试器的地址设置为 127.0.0.1:9222 browser_options.add_experimental_option('debuggerAddress', '127.0.0.1:9222') # 启动浏览器 browser = webdriver.Chrome(options=browser_options) browser.get('https://juejin.cn/')

  option配置

  from selenium import webdriver from scrapy.selector import Selector from selenium.webdriver.common.by import By browser_options = webdriver.ChromeOptions() #关闭自动控制blink特征 options.add_argument('--disable-blink-features=AutomationControlled') # 设置代理ip(会和启动本地浏览器冲突) options.add_argument(f'--proxy-server=http://{proxy_ip}') # 添加无头选项 options.add_experimental_option('detach', True) # 启动浏览器 browser = webdriver.Chrome(options=browser_options) browser.get('https://juejin.cn/')

  使用

  ChromeOptions

  from selenium import webdriver browser_options = webdriver.ChromeOptions() #关闭自动控制blink特征 options.add_argument('--disable-blink-features=AutomationControlled') browser = webdriver.Chrome(options=browser_options) browser.get('https://juejin.cn/')

  页面基本属性

  from selenium import webdriver from scrapy.selector import Selector from selenium.webdriver.common.by import By import time browser_options = webdriver.ChromeOptions() #关闭自动控制blink特征 options.add_argument('--disable-blink-features=AutomationControlled') browser = webdriver.Chrome(options=browser_options) browser.get('https://juejin.cn/') time.sleep(2) # 网页标题 print(browser.title) # 当前网址 print(browser.current_url) # 浏览器名称 print(browser.name) # 网页源码 print(browser.page_source)

  get

  访问页面

  from selenium import webdriver browser_options = webdriver.ChromeOptions() #关闭自动控制blink特征 options.add_argument('--disable-blink-features=AutomationControlled') browser = webdriver.Chrome(options=browser_options) browser.get('https://juejin.cn/')

  set_window_size

  set_window_size()方法可以用来设置浏览器大小(就是分辨率),而maximize_window则是设置浏览器为全屏。

  from selenium import webdriver from scrapy.selector import Selector import time browser_options = webdriver.ChromeOptions() #关闭自动控制blink特征 options.add_argument('--disable-blink-features=AutomationControlled') browser = webdriver.Chrome(options=browser_options) # 设置浏览器大小:全屏 browser.maximize_window() browser.get('https://juejin.cn/') time.sleep(2) # 设置分辨率 500*500 browser.set_window_size(500,500) time.sleep(2) # 设置分辨率 1000*800 browser.set_window_size(1000,800)

  refresh

  刷新页面

  from selenium import webdriver from scrapy.selector import Selector import time browser_options = webdriver.ChromeOptions() #关闭自动控制blink特征 options.add_argument('--disable-blink-features=AutomationControlled') browser = webdriver.Chrome(options=browser_options) browser.get('https://juejin.cn/') time.sleep(2) browser.refresh()

  前进后退

  forward()方法可以用来实现前进,back()可以用来实现后退。

  from selenium import webdriver from scrapy.selector import Selector import time browser_options = webdriver.ChromeOptions() #关闭自动控制blink特征 options.add_argument('--disable-blink-features=AutomationControlled') browser = webdriver.Chrome(options=browser_options) browser.get('https://juejin.cn/') time.sleep(2) # 打开淘宝页面 browser.get(r'https://www.baidu.com') time.sleep(2) # 后退到掘金页面 browser.back() time.sleep(2) # 前进的百度页面 browser.forward()

  find_element的By定位

  # 使用前先导入By类 from selenium.webdriver.common.by import By

  browser.find_element(By.ID,'kw') browser.find_element(By.NAME,'wd') browser.find_element(By.CLASS_NAME,'s_ipt') browser.find_element(By.TAG_NAME,'input') browser.find_element(By.LINK_TEXT,'新闻') browser.find_element(By.PARTIAL_LINK_TEXT,'闻') browser.find_element(By.XPATH,'//*[@id="kw"]') browser.find_element(By.CSS_SELECTOR,'#kw')

  import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait browser_options = webdriver.ChromeOptions() browser_options.add_argument('--disable-extensions') #关闭自动控制blink特征 options.add_argument('--disable-blink-features=AutomationControlled') browser = webdriver.Chrome(options=browser_options) browser.wait = WebDriverWait(browser, 20) browser.get('https://juejin.cn/') time.sleep(5) print(browser.find_element(By.XPATH, '//button[@class="login-button"]'))

  find_elements

  如果定位的目标元素在网页中不止一个,那么则需要用到find_elements,得到的结果会是列表形式,其他操作一致。

  from selenium import webdriver from selenium.webdriver.common.by import By import time browser_options = webdriver.ChromeOptions() #关闭自动控制blink特征 options.add_argument('--disable-blink-features=AutomationControlled') browser = webdriver.Chrome(options=browser_options) browser.get('https://juejin.cn/') time.sleep(2) print(browser.find_elements(By.CLASS_NAME, 'nav-item-wrap'))

  get_attribute获取属性

  from selenium import webdriver from selenium.webdriver.common.by import By import time browser_options = webdriver.ChromeOptions() #关闭自动控制blink特征 options.add_argument('--disable-blink-features=AutomationControlled') browser = webdriver.Chrome(options=browser_options) browser.get('https://juejin.cn/') time.sleep(2) # https://lf3-cdn-tos.bytescm.com/obj/static/xitu_juejin_web/e08da34488b114bd4c665ba2fa520a31.svg print(browser.find_element(By.CLASS_NAME, 'logo-img').get_attribute('src')) # 获取源码 print(browser.find_element(By.XPATH, '//div[@class="custom-tbody"]').get_attribute('innerHTML'))

  获取文本

  from selenium import webdriver from selenium.webdriver.common.by import By import time browser_options = webdriver.ChromeOptions() #关闭自动控制blink特征 options.add_argument('--disable-blink-features=AutomationControlled') browser = webdriver.Chrome(options=browser_options) browser.get('https://juejin.cn/') time.sleep(2) # 登录 # 注册 print(browser.find_element(By.CLASS_NAME, 'login-button').text)

  其他属性

  from selenium import webdriver from selenium.webdriver.common.by import By import time browser_options = webdriver.ChromeOptions() #关闭自动控制blink特征 options.add_argument('--disable-blink-features=AutomationControlled') browser = webdriver.Chrome(options=browser_options) browser.get('https://juejin.cn/') time.sleep(2) # {'x': 1361, 'y': 12} print(browser.find_element(By.CLASS_NAME, 'login-button').location) # {'height': 36, 'width': 95} print(browser.find_element(By.CLASS_NAME, 'login-button').size)

  输入文本

  from selenium import webdriver from selenium.webdriver.common.by import By import time browser_options = webdriver.ChromeOptions() #关闭自动控制blink特征 options.add_argument('--disable-blink-features=AutomationControlled') browser = webdriver.Chrome(options=browser_options) browser.get('https://juejin.cn/') time.sleep(2) browser.find_element(By.XPATH,'//input[@class="search-input isResourceVisible"]').send_keys('yhq')

  点击

  from selenium import webdriver from selenium.webdriver.common.by import By import time browser_options = webdriver.ChromeOptions() #关闭自动控制blink特征 options.add_argument('--disable-blink-features=AutomationControlled') browser = webdriver.Chrome(options=browser_options) browser.get('https://juejin.cn/') time.sleep(2) browser.find_element(By.XPATH,'//div[@class="login-button-wrap"]').click()

  清空文本

  from selenium import webdriver from selenium.webdriver.common.by import By import time browser_options = webdriver.ChromeOptions() #关闭自动控制blink特征 options.add_argument('--disable-blink-features=AutomationControlled') browser = webdriver.Chrome(options=browser_options) browser.get('https://juejin.cn/') time.sleep(2) browser.find_element(By.XPATH,'//input[@class="search-input isResourceVisible"]').clear()

  回车确认

  from selenium import webdriver from selenium.webdriver.common.by import By import time browser_options = webdriver.ChromeOptions() #关闭自动控制blink特征 options.add_argument('--disable-blink-features=AutomationControlled') browser = webdriver.Chrome(options=browser_options) browser.get('https://juejin.cn/') time.sleep(2) browser.find_element(By.XPATH,'//div[@class="xxxxx"]').submit()

  下拉框

  # 使用前先导入Select类 from selenium.webdriver.support.select import Select

  '''1、三种选择某一选项项的方法''' select_by_index() # 通过索引定位;注意:index索引是从“0”开始。 select_by_value() # 通过value值定位,value标签的属性值。 select_by_visible_text() # 通过文本值定位,即显示在下拉框的值。 '''2、三种返回options信息的方法''' options # 返回select元素所有的options all_selected_options # 返回select元素中所有已选中的选项 first_selected_options # 返回select元素中选中的第一个选项 '''3、四种取消选中项的方法''' deselect_all # 取消全部的已选择项 deselect_by_index # 取消已选中的索引项 deselect_by_value # 取消已选中的value值 deselect_by_visible_text # 取消已选中的文本值

  模拟鼠标

  # 使用前先导入ActionChains类 from selenium.webdriver.common.action_chains import ActionChains

  scss

  复制代码

  ActionChains(browser):调用ActionChains()类,并将浏览器驱动browser作为参数传入 perform():执行ActionChains()中储存的所有操作,可以看做是执行之前一系列的操作

  右键

  from selenium import webdriver from selenium.webdriver.common.by import By import time from selenium.webdriver.common.action_chains import ActionChains browser_options = webdriver.ChromeOptions() #关闭自动控制blink特征 options.add_argument('--disable-blink-features=AutomationControlled') browser = webdriver.Chrome(options=browser_options) browser.get('https://juejin.cn/') time.sleep(2) right_click = browser.find_element(By.XPATH,'//div[@class="login-button-wrap"]') ActionChains(browser).context_click(right_click).perform()

  双击

  from selenium import webdriver from selenium.webdriver.common.by import By import time from selenium.webdriver.common.action_chains import ActionChains browser_options = webdriver.ChromeOptions() #关闭自动控制blink特征 options.add_argument('--disable-blink-features=AutomationControlled') browser = webdriver.Chrome(options=browser_options) browser.get('https://juejin.cn/') time.sleep(2) right_click = browser.find_element(By.XPATH,'//div[@class="login-button-wrap"]') ActionChains(browser).double_click(right_click).perform()

  悬停

  import time from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By browser_options = webdriver.ChromeOptions() #关闭自动控制blink特征 options.add_argument('--disable-blink-features=AutomationControlled') browser = webdriver.Chrome(options=browser_options) browser.get('https://juejin.cn/') time.sleep(5) elem = browser.find_element(By.CLASS_NAME, 'more') # 获取元素当前位置坐标 elem_location = elem.location print(elem_location) elem_locationX = int(elem_location['x']) elem_locationY = int(elem_location['y']) # 悬停 ActionChains(browser).move_to_element(elem).perform()

  拖拽

  import time from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By browser_options = webdriver.ChromeOptions() #关闭自动控制blink特征 options.add_argument('--disable-blink-features=AutomationControlled') browser = webdriver.Chrome(options=browser_options) browser.get('https://juejin.cn/') time.sleep(5) start = browser.find_element(By.CLASS_NAME, 'logo-img') start_loc = start.location # 悬停 ActionChains(browser).drag_and_drop_by_offset(start, start_loc['x'] + 100, start_loc['y'] + 100).perform()

  显示等待

  设置一个等待时间和一个条件,在规定时间内,每隔一段时间查看下条件是否成立,如果成立那么程序就继续执行,否则就抛出一个超时异常。

  makefile

  复制代码

  WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None) driver: 浏览器驱动 timeout: 超时时间,等待的最长时间(同时要考虑隐性等待时间) poll_frequency: 每次检测的间隔时间,默认是0.5秒 ignored_exceptions:超时后的异常信息,默认情况下抛出NoSuchElementException异常

  vbnet

  复制代码

  until(method,message='') method: 在等待期间,每隔一段时间调用这个传入的方法,直到返回值不是False message: 如果超时,抛出TimeoutException,将message传入异常

  ini

  复制代码

  until_not(method,message='') until_not 与until相反,until是当某元素出现或什么条件成立则继续执行,until_not是当某元素消失或什么条件不成立则继续执行,参数也相同。

  import time from selenium.webdriver.support import expected_conditions as EC from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait browser_options = webdriver.ChromeOptions() #关闭自动控制blink特征 options.add_argument('--disable-blink-features=AutomationControlled') browser = webdriver.Chrome(options=browser_options) browser.get('https://juejin.cn/') # 等待页面加载完成 WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '.item-box')))

  运行JavaScript

  import time from selenium.webdriver.support import expected_conditions as EC from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.keys import Keys browser_options = webdriver.ChromeOptions() #关闭自动控制blink特征 options.add_argument('--disable-blink-features=AutomationControlled') browser = webdriver.Chrome(options=browser_options) browser.get('https://juejin.cn/') time.sleep(5) browser.execute_script('window.scrollTo(0, document.body.scrollHeight)') browser.execute_script('alert("yhq")')

  close

  关闭浏览器当前页面

  from selenium import webdriver browser_options = webdriver.ChromeOptions() #关闭自动控制blink特征 options.add_argument('--disable-blink-features=AutomationControlled') browser = webdriver.Chrome(options=browser_options) browser.get('https://juejin.cn/') browser.close()

  quit

  关闭浏览器全部页面

  from selenium import webdriver browser_options = webdriver.ChromeOptions() #关闭自动控制blink特征 options.add_argument('--disable-blink-features=AutomationControlled') browser = webdriver.Chrome(options=browser_options) browser.get('https://juejin.cn/') browser.quit()

  mouse

  安装

  shell

  复制代码

  $ pip install mouse

  使用

  move

  from selenium import webdriver from scrapy.selector import Selector from selenium.webdriver.common.by import By from mouse import move browser_options = webdriver.ChromeOptions() #关闭自动控制blink特征 options.add_argument('--disable-blink-features=AutomationControlled') # 启动浏览器 browser = webdriver.Chrome(options=browser_options) browser.get('https://www.zhihu.com/signin') # 选择登录方式 browser.find_element(By.XPATH, '//div[@class="SignFlow-tab"]').click() # 输入账号密码 browser.find_element(By.NAME, 'username').send_keys('15284374543') browser.find_element(By.NAME, 'password').send_keys('YHQzh1026') # 点击登录 # browser.find_element(By.XPATH, '//button[@type="submit"]').click() move(1028, 567)

  click

  from selenium import webdriver from scrapy.selector import Selector from selenium.webdriver.common.by import By from mouse import move, click browser_options = webdriver.ChromeOptions() #关闭自动控制blink特征 options.add_argument('--disable-blink-features=AutomationControlled') # 启动浏览器 browser = webdriver.Chrome(options=browser_options) browser.get('https://www.zhihu.com/signin') # 选择登录方式 browser.find_element(By.XPATH, '//div[@class="SignFlow-tab"]').click() # 输入账号密码 browser.find_element(By.NAME, 'username').send_keys('15284374543') browser.find_element(By.NAME, 'password').send_keys('YHQzh1026') # 点击登录 # browser.find_element(By.XPATH, '//button[@type="submit"]').click() move(1028, 567) click()