文章目录
1.爬虫到底是什么
(1)爬虫是批量化自动获取既有数据
(2)通常来说,都是获取既有数据
(3)也有特殊的:批量注册一些账号、 批量的去领取优惠券、批量下单买商品、自动做任务(签到)
2.爬虫的应用场景
(1)在企业中
①应用最多的,做竞品调研数据采集
②办公自动化,自动从公司的后台等地方,获取数据进行处理
(2) 为个人服务:比如我比较喜欢看小说,而小说网站要收费,可以使用爬虫
(3)盈利:抢票、抢茅台、抢演唱会、自动评论、自动点赞
3.爬虫的四大分类
(1)聚焦爬虫
- 完成某一项特定数据的采集
- 百分之九十的爬虫
(2)通用爬虫
- 就什么内容都采集,都存下来
- 搜索引擎
- 百度
- 谷歌
(3)增量爬虫
- 既可以使聚焦爬虫
- 也可以是通用爬虫
- 当内容发生变化的时候,它可以增量的获取内容
(4)暗网爬虫
- 深网爬虫
- 很少见
- 暗网/深网 本身就是见不得光的地方
- 暗网爬虫既可以使聚焦爬虫,也可以是通用爬虫,当然也可以是增量爬虫
4.Selenium
Selenium 是一个用于 自动化浏览器操作 的开源工具集,主要用于 Web 应用程序测试 和 网页数据抓取。它支持多种编程语言(如 Python、Java、C#、JavaScript 等),可以模拟用户在浏览器中的操作(如点击、输入、导航等),并获取页面内容进行分析。
4.1 使用Selenium的前置条件
(1)Chrome浏览器
①明确浏览器的版本
②电脑中不要安装其他使用了Chrome浏览器开源内核的浏览器。比如:360双擎浏览器、世界之窗。Chrome浏览器存在开源项目,国内的很多的浏览器都号称是双核的。其中的一个核就是基于Chrome浏览器开源项目
③需要使用Python安装Selenium的驱动:pip install selenium
④下载浏览器对应的浏览器版本的驱动:chromedriver,解压后,会有一个chromedriver.exe
4.2 在Python中使用chromedriver.exe时,有几种放置它的方法:
(1)最简单的方法是将 chromedriver.exe 放在你的 Python 项目根目录下(与 .py 文件同级)后直接使用
driver = webdriver.Chrome()
(2)添加到系统 PATH 环境变量
将 chromedriver.exe 放在某个固定目录(如 C:\chromedriver),并将该目录添加到系统的 PATH 环境变量。
这样可以直接调用,无需指定路径:
driver = webdriver.Chrome()
3)指定绝对路径
将chromedriver.exe放在任意位置(如D:\chromedriver.exe),然后在代码中指定绝对路径:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
service = Service(executable_path='D:/chromedriver.exe')
driver = webdriver.Chrome(service=service)
url = "https://www.xinpianchang.com/"
driver.get(url)
driver.close()
(4)如果在使用 driver = webdriver.Chrome() 时没有指定任何参数(如 executable_path),Selenium 会按照以下顺序自动查找 chromedriver.exe:
①系统 PATH 环境变量
Selenium 会检查系统的 PATH 环境变量中是否包含 chromedriver.exe 的路径。如果已将其所在目录添加到 PATH 中,Selenium 会自动找到它。
②当前工作目录:如果 chromedriver.exe 直接放在你的 Python 脚本的当前工作目录下,Selenium 也能找到它。
③WebDriver 管理的缓存目录(Selenium 4+)
如果你使用的是 Selenium 4 或更高版本,并且安装了 webdriver-manager 库(如通过 pip install webdriver-manager),Selenium 可以自动下载并管理 chromedriver.exe,无需手动指定路径。
示例代码(推荐):
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
4.3 Selenium常用API
(1)浏览器操作
from selenium import webdriver
# 启动浏览器(以 Chrome 为例)
driver = webdriver.Chrome()
# 常用浏览器操作
driver.get("https://www.example.com") # 打开网页
driver.refresh() # 刷新页面
driver.back() # 后退
driver.forward() # 前进
driver.title # 获取页面标题
driver.current_url # 获取当前 URL
driver.close() # 关闭当前标签页
driver.quit() # 关闭整个浏览器(释放资源)
(2)元素定位(8种方式)
# 通过 ID
element = driver.find_element("id", "element_id")
# 通过 Name
element = driver.find_element("name", "username")
# 通过 Class Name
element = driver.find_element("class name", "class-name")
# 通过 Tag Name
element = driver.find_element("tag name", "div")
# 通过 Link Text(超链接文本)
element = driver.find_element("link text", "点击这里")
# 通过 Partial Link Text(部分超链接文本)
element = driver.find_element("partial link text", "点击")
# 通过 XPath
element = driver.find_element("xpath", "//div[@class='example']")
# 通过 CSS Selector
element = driver.find_element("css selector", "div.example > input")
# 查找多个元素(返回列表)
elements = driver.find_elements("xpath", "//div")
注意:Selenium 4 推荐使用 find_element(By.XX, “value”),需先导入:
from selenium.webdriver.common.by import By
例如:driver.find_element(By.ID, “element_id”)
(3)元素交互
element.click() # 点击元素
element.send_keys("text") # 输入文本
element.clear() # 清空输入框
element.text # 获取元素文本
element.get_attribute("href") # 获取属性值(如 href)
element.is_displayed() # 是否可见
element.is_enabled() # 是否可操作
element.is_selected() # 是否被选中(复选框/单选框)
element.submit() # 提交表单
(4) 等待机制
①隐式等待(全局等待)
driver.implicitly_wait(10) # 最多等待 10 秒(查找元素时)
②显式等待(针对特定元素)
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 等待元素可见
element = WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.ID, "element_id"))
)
# 其他常用条件:
EC.presence_of_element_located() # 元素存在(不一定可见)
EC.element_to_be_clickable() # 元素可点击
EC.title_contains("Example") # 页面标题包含文本
(5)窗口与框架切换
# 切换窗口
driver.switch_to.window(driver.window_handles[1]) # 切换到第二个标签页
# 切换回主窗口
driver.switch_to.window(driver.window_handles[0])
# 切换 iframe
driver.switch_to.frame("iframe_name_or_id")
driver.switch_to.default_content() # 切回主页面
# 弹窗处理
alert = driver.switch_to.alert # 获取弹窗对象
alert.accept() # 确认
alert.dismiss() # 取消
(6)下拉框(Select 类)
from selenium.webdriver.support.ui import Select
select = Select(driver.find_element("id", "dropdown"))
select.select_by_index(1) # 通过索引
select.select_by_value("val") # 通过 value 属性
select.select_by_visible_text("Text") # 通过可见文本
(7)执行JavaScript
# 滚动到元素
element = driver.find_element("id", "footer")
driver.execute_script("arguments[0].scrollIntoView();", element)
# 修改元素属性
driver.execute_script("document.getElementById('id').style.color='red';")
(8)Cookies 操作
driver.get_cookie("cookie_name") # 获取指定 cookie
driver.get_cookies() # 获取所有 cookies
driver.add_cookie({"name": "foo", "value": "bar"}) # 添加 cookie
driver.delete_all_cookies() # 删除所有 cookies
(9)截图与日志
driver.save_screenshot("screen.png") # 截图保存
# 获取浏览器日志(需配置驱动选项)
logs = driver.get_log("browser")
(10)高级操作(ActionChains)
from selenium.webdriver.common.action_chains import ActionChains
# 鼠标悬停、拖拽等
actions = ActionChains(driver)
actions.move_to_element(element).click().perform()
actions.drag_and_drop(source_element, target_element).perform()