第五天:自动化爬虫
自动化爬虫
- 下载selenium自动爬虫工具
- google自动化执行爬虫工具
- edge自动化执行爬虫工具
- 使用selenium (一般模拟get请求)
- find_element / find_elements()定位元素
- JavaScript 脚本定位元素
- 控制鼠标和键盘
下载selenium自动爬虫工具
根据当时最新浏览器版本,下载最新版本,不然会出现很多问题
google自动化执行爬虫工具
查看google版本
没有更新的更新到最新版本
下载最新的ChromeDriver版本
Google Chrome WebDriver(ChromeDriver)下载
edge自动化执行爬虫工具
查看edge版本
没有更新的更新到最新版本
去下载最新版本的 msedgedriver
Microsoft Edge WebDriver(msedgedriver)下载
使用selenium (一般模拟get请求)
安装selenium
pip install selenium
创建Chrome浏览器对象
from selenium import webdriver
from selenium.webdriver.chrome.service import Service# Chromedriver的位置
Chromedriver_path=r'E:\chromedriver.exe'
service=Service(executable_path=Chromedriver_path)
# 创建Chrome浏览器对象
driver1=webdriver.Chrome(service=service) url='https://www.baidu.com'
# 发送get请求
driver1.get(url)
创建Edge浏览器对象
from selenium import webdriver
from selenium.webdriver.chrome.service import Service# Edgedriver的位置
Edgedriver_path=r'E:\msedgedriver.exe'
service=Service(executable_path=Edgedriver_path)
# 创建Edge浏览器对象
driver2=webdriver.Edge(service=service) url='https://www.baidu.com'
# 发送get请求
driver2.get(url)
driver.get(url)
响应页面的常用属性和方法
类型 | 名称 | …作用说明 | 示例 |
---|---|---|---|
属性 | current_url | 获取当前页面的 URL | driver.current_url |
title | 获取当前页面标题 | driver.title | |
page_source | 获取页面的 HTML 源代码 | driver.page_source | |
window_handles | 获取所有窗口的句柄列表 | driver.window_handles | |
current_window_handle | 获取当前窗口句柄 | driver.current_window_handle | |
name | 获取当前浏览器名称 | driver.name | |
页面操作 | get(url) | 打开指定 URL | driver.get("https://www.baidu.com") |
back() | 模拟浏览器“后退” | driver.back() | |
forward() | 模拟浏览器“前进” | driver.forward() | |
refresh() | 刷新页面 | driver.refresh() | |
查找元素 | find_element(By, value) | 查找单个元素 | driver.find_element(By.ID, "kw") |
find_elements(By, value) | 查找多个元素(列表) | driver.find_elements(By.TAG_NAME, "a") | |
执行脚本 | execute_script(js_code) | 执行 JS 脚本 | driver.execute_script("alert('hi')") |
截图 | save_screenshot(file) | 保存当前页面截图 | driver.save_screenshot("baidu.png") |
窗口控制 | maximize_window() | 最大化窗口 | driver.maximize_window() |
minimize_window() | 最小化窗口 | driver.minimize_window() | |
set_window_size(width, height) | 设置窗口大小 | driver.set_window_size(1280, 720) | |
框架与窗口切换 | switch_to.frame(name_or_element) | 切换到 iframe | driver.switch_to.frame("frame1") |
switch_to.default_content() | 切回主文档 | driver.switch_to.default_content() | |
switch_to.window(handle) | 切换窗口 | driver.switch_to.window(driver.window_handles[1]) | |
警告框 | switch_to.alert | 获取弹出框对象 | alert = driver.switch_to.alert |
Cookies 操作 | get_cookies() | 获取所有 cookies | driver.get_cookies() |
add_cookie(cookie_dict) | 添加 cookie | driver.add_cookie({"name": "test", "value": "123"}) | |
delete_all_cookies() | 删除所有 cookies | driver.delete_all_cookies() | |
等待 | implicitly_wait(seconds) | 隐式等待元素加载 | driver.implicitly_wait(10) |
关闭 | close() | 关闭当前窗口 | driver.close() |
quit() | 关闭所有窗口并退出浏览器 | driver.quit() |
Chrome浏览器配置 (edge浏览器同理)
# Chrome浏览器配置
options=ChromeOptions()
#
# 后台运行
options.add_argument('--headless') # 创建Chrome浏览器对象
driver1=webdriver.Chrome(service=service,options=options)
Chrome 常用的 options.add_argument()
参数 (edge浏览器同理)
参数 | 作用 | 备注 |
---|---|---|
--headless | 无界面模式,在后台运行浏览器 | 常用于服务器或自动化脚本 |
--window-size=1920,1080 | 设置窗口大小 | 部分网页需要特定分辨率才能加载完整内容 |
--incognito | 启动无痕模式 | 不保存缓存、Cookies |
--start-maximized | 启动时最大化 | 适用于可视化调试 |
--disable-extensions | 禁用扩展插件 | 提高运行速度 |
--disable-infobars | 禁用“Chrome 正在受到自动软件控制”的提示 | 让界面更干净 |
--ignore-certificate-errors | 忽略 HTTPS 证书错误 | 爬取测试网站时常用 |
--disable-popup-blocking | 禁用弹窗拦截 | 防止脚本卡死 |
--user-agent="xxx" | 自定义 User-Agent | 用于伪装成特定浏览器 |
--lang=zh-CN,zh | 设置浏览器语言 | 常用于中文页面加载正确 |
--mute-audio | 静音模式 | 视频自动播放时不出声 |
--blink-settings=imagesEnabled=false | 禁止加载图片 | 加快加载速度(爬虫常用) |
--proxy-server=http://IP:PORT | 设置代理服务器 | 用于反爬或国外访问 |
--disable-blink-features=AutomationControlled | 伪装,隐藏“被自动化控制”特征 | 防止网站检测 Selenium |
注意:有个小缺点就是 打开的浏览器在访问请求时间过久会自动退出
# 让浏览器保持运行 不会占用很多cpu内存
while True: time.sleep(1)
find_element / find_elements()定位元素
定位方式 | 参数写法 | 示例 | 说明 |
---|---|---|---|
By.ID | find_element(By.ID, "kw") | 定位 id=“kw” 的元素 | 精准、最快 |
By.NAME | find_element(By.NAME, "wd") | 定位 name=“wd” 的输入框 | 适用于表单元素 |
By.CLASS_NAME | find_element(By.CLASS_NAME, "btn") | 定位 class=“btn” 的元素 | 不能有空格(单类) |
By.TAG_NAME | find_element(By.TAG_NAME, "input") | 定位第一个 <input> 标签 | 适用于通用标签查找 |
By.LINK_TEXT | find_element(By.LINK_TEXT, "新闻") | 精确匹配链接文字 | 匹配 <a> 的文本 |
By.PARTIAL_LINK_TEXT | find_element(By.PARTIAL_LINK_TEXT, "新") | 模糊匹配链接文字 | 模糊匹配 <a> 文本 |
By.XPATH | find_element(By.XPATH, '//*[@id="kw"]') | 根据 XPath 表达式定位 | 功能最强大 |
By.CSS_SELECTOR | find_element(By.CSS_SELECTOR, "#kw") | 使用 CSS 选择器定位 | 高效灵活 |
JavaScript 脚本定位元素
使用方法
# script → 要执行的 JavaScript 代码字符串
driver.execute_script(script)
script
参数常见的 JS 定位元素方式
JS 语句 | 说明 | 示例 |
---|---|---|
document.getElementById("id") | 按 ID 定位 | 获取单个元素 |
document.getElementsByClassName("class") | 按类名定位 | 返回 HTMLCollection |
document.getElementsByTagName("tag") | 按标签名定位 | 返回所有相同标签元素 |
document.querySelector("css选择器") | 使用 CSS 选择器定位 | 最灵活 |
document.querySelectorAll("css选择器") | 获取所有匹配的元素 | 返回 NodeList |
页面元素常用属性
属性 | 说明 | 示例 |
---|---|---|
id | 元素的 id | element.id |
className | 元素的 class 属性值 | element.className |
tagName | 元素的标签名(大写) | element.tagName → "DIV" |
innerHTML | 元素内部的 HTML 字符串 | element.innerHTML |
outerHTML | 包含自身的 HTML 字符串 | element.outerHTML |
innerText | 元素内部的纯文本(忽略 HTML 标签) | element.innerText |
textContent | 元素的所有文本(包括隐藏文本) | element.textContent |
value | 输入框、文本域的值 | element.value |
href | 超链接的链接地址 | element.href |
src | 图片或脚本的资源地址 | element.src |
style | 元素的样式对象 | element.style.color |
text | 获取元素文本 | element.text |
页面元素常用方法
方法 | 说明 | 示例 |
---|---|---|
click() | 模拟鼠标点击 | element.click() |
focus() | 聚焦输入框 | element.focus() |
blur() | 失焦 | element.blur() |
scrollIntoView() | 滚动页面直到元素可见 | element.scrollIntoView() |
setAttribute(name, value) | 设置属性 | element.setAttribute("value", "新内容") |
getAttribute(name) | 获取属性值 | element.getAttribute("href") |
removeAttribute(name) | 移除属性 | element.removeAttribute("disabled") |
appendChild(node) | 添加子元素 | parent.appendChild(child) |
remove() | 删除元素自身 | element.remove() |
querySelector(selector) | 查找子元素 | element.querySelector(".child") |
querySelectorAll(selector) | 查找所有子元素 | element.querySelectorAll("li") |
send_keys(str) | 在输入框中输入文字 | element.send_keys("你好") |
clear() | 清空输入框内容 | element.clear() |
控制鼠标和键盘
导入ActionChains库
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
常用鼠标操作方法
方法 | >>>>>>>>>说明 | 示例 |
---|---|---|
click(element) | 点击指定元素 | ActionChains(driver).click(btn).perform() |
double_click(element) | 双击元素 | ActionChains(driver).double_click(btn).perform() |
context_click(element) | 右击元素 | ActionChains(driver).context_click(btn).perform() |
move_to_element(element) | 鼠标移动到元素上 | ActionChains(driver).move_to_element(menu).perform() |
click_and_hold(element) | 按住元素不放 | ActionChains(driver).click_and_hold(ele).perform() |
release(element) | 释放鼠标 | ActionChains(driver).release(ele).perform() |
drag_and_drop(source, target) | 拖拽元素到目标 | ActionChains(driver).drag_and_drop(src, dst).perform() |
drag_and_drop_by_offset(element, x, y) | 按偏移量拖拽 | ActionChains(driver).drag_and_drop_by_offset(ele, 100, 50).perform() |
move_by_offset(x, y) | 鼠标移动到相对坐标 | ActionChains(driver).move_by_offset(50, 20).perform() |
move_to_element_with_offset(ele, x, y) | 相对于元素偏移移动 | ActionChains(driver).move_to_element_with_offset(ele, 10, 5).perform() |
常用键盘操作方法
方法 / 按键 | 说明 | 示例 |
---|---|---|
send_keys("文本") | 输入文本 | ActionChains(driver).send_keys("hello").perform() |
send_keys(Keys.ENTER) | 回车 | ActionChains(driver).send_keys(Keys.ENTER).perform() |
send_keys(Keys.TAB) | Tab 键 | ActionChains(driver).send_keys(Keys.TAB).perform() |
send_keys(Keys.CONTROL, "a") | Ctrl+A 全选 | ActionChains(driver).key_down(Keys.CONTROL).send_keys("a").key_up(Keys.CONTROL).perform() |
key_down(Keys.SHIFT) / key_up(Keys.SHIFT) | 按下或释放键 | 组合大写字母或快捷键 |
send_keys(Keys.ARROW_DOWN) | 下箭头 | 选择下拉列表 |
send_keys(Keys.BACKSPACE) | 删除 | 删除输入框内容 |
常用的按键组合
操作 | Selenium 方法 | 说明 |
---|---|---|
删除 | element.send_keys(Keys.BACK_SPACE) | 删除输入框光标前的字符 |
全选 | element.send_keys(Keys.CONTROL, 'a') | 选中输入框所有内容 |
复制 | element.send_keys(Keys.CONTROL, 'c') | 复制选中的内容到剪贴板 |
粘贴 | driver.find_element_by_id('passwordA').send_keys(Keys.CONTROL, 'v') | 将剪贴板内容粘贴到指定输入框 |
如果你在阅读过程中也有新的见解,或者遇到类似问题,🥰不妨留言分享你的经验,让大家一起学习。
喜欢本篇内容的朋友,记得点个 👍点赞,收藏 并 关注我,这样你就不会错过后续的更多实用技巧和深度干货了!
期待在评论区看到你的声音,我们一起成长、共同进步!😊