当前位置: 首页 > news >正文

Python爬虫常用项

selenium

1.使用selenium打开界面

使用selenium打开界面,需要使用对应的谷歌驱动,版本需要一致,放在项目文件夹中即可直接使用webdriver.Chrome()调用,否则需要输入地址

 from selenium import webdriverdriver = webdriver.Chrome()    # 获取驱动driver.get("https://web.whatsapp.com")  # 打开网页

2.selenium浏览器配置

当需要测试或爬取数据时,可以选择无头浏览器,提供效率。为了不被反爬,可以使用 Selenium 和 webdriver_manager 来配置 Chrome 浏览器的选项,并初始化 WebDriver。

chrome_options = Options() 用于创建一个Options对象,用add_argument函数完成对Chrome的配置。

service = Service(ChromeDriverManager().install()) # 使用 webdriver_manager 自动下载并安装与当前 Chrome 浏览器版本兼容的 ChromeDriver。

 from selenium.webdriver.chrome.service import Service   # Service 和 Options 用于配置 Chrome 浏览器的选项。from selenium.webdriver.chrome.options import Options   # Service 和 Options 用于配置 Chrome 浏览器的选项。from webdriver_manager.chrome import ChromeDriverManager  # ChromeDriverManager 用于自动管理 ChromeDriver 的版本,确保与当前的 Chrome 浏览器版本兼容。from selenium import webdriverchrome_options = Options()   # 创建一个 Options 对象,用于存储 Chrome 的配置选项。chrome_options.add_argument("--headless")    # 启用无头模式,浏览器不会显示图形界面。chrome_options.add_argument("--disable-gpu")   #  禁止使用 GPU,这在无头模式下通常需要设置。chrome_options.add_argument("--window-size=1920,1080")   # 设置浏览器窗口的大小。hrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")   #  设置用户代理(User-Agent),用于模拟不同的浏览器或设备,避免被网站识别为爬虫。service = Service(ChromeDriverManager().install())  # 使用 webdriver_manager 自动下载并安装与当前 Chrome 浏览器版本兼容的 ChromeDriver。driver= webdriver.Chrome(service=service, options=chrome_options)  # 创建一个 WebDriver 实例,传入配置好的服务和选项。​driver.quit() # 关闭浏览器

3.浏览器界面调整

上述 Options() 可以设定打开浏览器窗口尺寸,但有时需要验证码滑块等,最好使用全屏状态,更适合调整像素。

fullscreen_window() 浏览器全屏状态,无标签页等

driver.maximize_window() 使窗口最大化 有标签页

 driver.fullscreen_window()  # 全屏模式,driver.maximize_window()  # 使窗口最大化  有标签页

4.浏览器返回操作

返回上一页操作使用back()函数完成,返回初始操作可以用get()函数展现

 driver.back() # 返回上一页driver.get() #返回

5.获取界面信息及点击事件

获取<a>标签中的“href”内容可以使用以下内容完成,函数get_attribute("href")

获取<a>标签中的文本内容使用.text

点击<a>标签使用click()

 title=driver.find_element(By.CSS_SELECTOR,"ul.zfjg li a")  # 获取当前界面中的a标签title_text=title.text # 获取a标签中的文本内容url=title.get_attribute("href") # 获取a标签中的href标签中的链接title.click()  #点击a标签所在位置

注意:点击事件和获取文本及标签内容需要是获取界面中唯一标签 find_element()获取的是第一个符合条件的内容。若文本中有多个想要a标签想要获取其信息,需要使用 find_elements() 并进行循环以此读取

 titles=driver.find_elements(By.CSS_SELECTOR,"ul.zfjg li a")for title in titles:url=title.get_attribute("href")title_txt=title.textprint(f"'{title_txt}':'{url}',")

6.浏览器等待事件

等待事件,避免引起反爬机制可以使用两种方式

1>硬等待

在执行一次操作后让系统停留等待2s,可以用time.sleep(2)表示。

 import timetime.sleep(2)

或者为了使等待事件灵活,可以选择这个操作,在执行一次操作后,直接调用smart_wait(driver),可以让其随机等待0.3—1s

 def smart_wait(driver):time.sleep(random.uniform(0.3, 1.0))
2>显式等待

这是selenium中的一个类,WebDriverWait ,用于实现显式等待

 from selenium.webdriver.support.ui import WebDriverWaitWebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "element_id")))

WebDriverWait是selenium中的一个类,用于实现显式等待。(driver, 10)driver 是一个浏览器驱动实例,10是等待时间,如果超过10s没有事件到则显示Timeout。

.until()方法用于指定一个条件,当这个条件满足时,等待结束。

EC.presence_of_element_located((By.ID, "element_id"))检查页面中是否存在指定的元素,但不保证元素是可见的。

3>其他常见的EC 条件函数

EC.visibility_of_element_located(locator)

检查页面中是否存在指定的元素,并且该元素是可见的(即元素的高度和宽度都大于0)。

 WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".class_name")))

EC.element_to_be_clickable(locator)

检查页面中是否存在指定的元素,并且该元素是可点击的(即元素可见且启用)。

 WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//a[contains(text(),'办事指南')]")))

EC.element_to_be_selected(element)

检查指定的元素是否被选中(通常用于单选按钮或复选框)。element 是一个 WebElement 对象

 element = driver.find_element(By.ID, "checkbox_id")WebDriverWait(driver, 10).until(EC.element_to_be_selected(element))
4>硬实时和显式等待
 def smart_wait(driver):""" 智能等待策略 """try:WebDriverWait(driver, 10).until(lambda d: d.execute_script("return document.readyState") == "complete")time.sleep(random.uniform(0.3, 1.0))except:pass

lambda d: d.execute_script("return document.readyState") == "complete" 是一个匿名函数,用于检查页面是否加载完成。 d是 driver 的一个引用。

d.execute_script("return document.readyState") 是通过执行 JavaScript 脚本获取页面的加载状态。

"document.readyState" 是一个 JavaScript 属性,表示页面的加载状态,可能的值有:

  • "loading":页面还在加载中。

  • "interactive":页面已加载完成,但图片、样式表等可能还在加载。

  • "complete":页面完全加载完成。

  • == "complete" 用于判断页面是否完全加载完成。

7.常见的selenium错误及规避

1>StaleElementReferenceException尝试操作的页面元素已经失效

原因:

  • 页面重新加载后,原来的元素引用不再有效。

  • 元素被删除或重新渲染。

  • 你尝试操作的元素在页面中已经不存在。

解决方法:

  • 实时查看界面操作,并在关键节点time.sleep(3)等待一下,最后查看界面新的CSS或Xpath

  • 若界面获取多次同一标签内容,及易容易保错“no found element”,需要更改一下适配选项例如CSS选择器改为ID,或XPATH,减少显示等待中元素的提取。

若系统较大,有错误可以跳过后续查看可以使用try except完成

 try:​except StaleElementReferenceException:print(f"元素过期,重试第{retry + 1}次")retry += 1smart_wait(driver)

相关文章:

  • 数据结构——例题1
  • [特殊字符]CentOS 7.6 安装 JDK 11(适配国内服务器环境)
  • LeetCode热题100--206.反转链表--简单
  • MongoDB 的主要优势和劣势是什么?适用于哪些场景?
  • LeetCode 热题 100_多数元素(97_169_简单_C++)(哈希表;排序)
  • 【2025年前端高频场景题系列】使用同一个链接,如何实现PC打开是web应用、手机打是-个H5 应用?
  • UE5通过C++实现TcpSocket连接
  • X1A000171000300,FC2012AN,32.768kHz,2012mm,EPSON晶振
  • 【Flask全栈开发指南】从零构建企业级Web应用
  • 影刀RPA开发-CSS选择器介绍
  • 第三章 初始化配置(一)
  • 【C++详解】类和对象(上)类的定义、实例化、this指针
  • esp32硬件支持AT指令
  • Leetcode 3544. Subtree Inversion Sum
  • 【Nova UI】十五、打造组件库之滚动条组件(上):滚动条组件的起步与进阶
  • Electron-Vue3、Electron-React、Electron-Angular打造舆情监控系统项目
  • Java SE(12)——异常(Exception)
  • InternVL3: 利用AI处理文本、图像、视频、OCR和数据分析
  • C++11异步编程 --- async
  • SQL易混点:你知道ON 和 WHERE 的区别吗
  • 习近平同巴西总统卢拉会谈
  • 比特币挖矿公司GRYP股价涨超171%:将与特朗普儿子创设的公司合并
  • 飙升至熔断,巴基斯坦股市两大股指收盘涨逾9%
  • 上海现有超12.3万名注册护士,本科及以上学历占一半
  • 牟海松任国家信访局副局长
  • 【社论】人工智能将为教育带来什么