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)