基于selenium的网页自动搜索

news/2025/10/10 21:58:53/文章来源:https://www.cnblogs.com/LJianYu/p/19133874

第一节

通过简单的百度网页打开学习selenium库的基本功能。

 1 from selenium import webdriver
 2 from selenium.webdriver.chrome.service import Service
 3 from selenium.webdriver.chrome.options import Options
 4 from selenium.webdriver.common.by import By
 5 from selenium.webdriver.support.ui import WebDriverWait
 6 from selenium.webdriver.support import expected_conditions as EC
 7 import time
 8 
 9 from selenium.webdriver.common.keys import Keys
10 
11 # 配置 ChromeDriver 路径,替换为你的 ChromeDriver 路径,你也可以将chromedriver拖入文件根目录,使用'./chromedriver.exe'路径。
12 chrome_driver_path = 'E:/Git_repo/VSCode_tmp/autopython/chromedriver-win64/chromedriver.exe'  # 替换为你的 ChromeDriver 路径
13 
14 # 初始化 ChromeDriver Service
15 service = Service(chrome_driver_path)
16 # 打开浏览器时的相关配置,可以根据需求进行打开和关闭
17 options = Options()
18 options.add_argument("--start-maximized")  # 启动时最大化窗口
19 options.add_argument("--disable-blink-features=AutomationControlled")  # 使浏览器不显示自动化控制的信息
20 # options.add_argument("--disable-gpu")  # 禁用GPU硬件加速
21 options.add_argument("--disable-infobars")  # 隐藏信息栏
22 # options.add_argument("--disable-extensions")  # 禁用所有扩展程序
23 # options.add_argument("--disable-popup-blocking")  # 禁用弹出窗口拦截
24 # options.add_argument("--incognito")  # 启动无痕模式
25 # options.add_argument("--no-sandbox")  # 关闭沙盒模式(提高性能)
26 # options.add_argument("--disable-dev-shm-usage")  # 使用/dev/shm分区以避免共享内存问题
27 # options.add_argument("--remote-debugging-port=9222")  # 启用远程调试端口
28 options.add_experimental_option("excludeSwitches", ["enable-automation"])
29 options.add_experimental_option("useAutomationExtension", False)
30 
31 
32 # 初始化 WebDriver,并传入 ChromeDriver Service
33 driver = webdriver.Chrome(service=service, options=options)
34 # # 防反爬:隐藏 webdriver 特征
35 # driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => false});")
36 
37 try:
38     # 打开百度搜索首页
39     url = "https://www.baidu.com"
40     driver.get(url)
41     # 显式等待,直到搜索框出现
42     wait = WebDriverWait(driver, 10)
43     # 通过Xpath表达式获取到百度输入框的html元素,方法也提供By.ID和By.CLASS_NAME的方法,用户可自动尝试
44     search_box = wait.until(EC.presence_of_element_located((By.XPATH, "//*[@id='chat-textarea']")))
45     # 输入搜索关键词
46     search_box.send_keys("原神"+ Keys.RETURN)
47     # 模拟按下回车键进行搜索
48     #search_box.submit()
49     # 等待搜索结果加载完成
50     wait.until(EC.presence_of_element_located((By.XPATH, "//div[@id='content_left']")))
51     # 打印搜索结果的标题
52     print(driver.title)
53     # 延时五秒展示结果
54     time.sleep(5)
55 
56 finally:
57     # 关闭 WebDriver
58     driver.quit()

代码主要分为五大块,第一块为导入selenium库驱动网页所需要的包和驱动chrome浏览器的chrome_driver;第二块为初始化ChromeDriver Service主要为控制如何打开浏览器;第三块为初始化 WebDriver,并传入 ChromeDriver Service;第五块为具体打开网页和处理网页按钮的方法,这里使用了XPATH方式寻找网页元素。

第二节

要想实现网页自动化登录最简单的方法是使用cookie方式登录,通过保存之前登录网页的cookie实现网页的自动化登录,而且还可以避免使用自动化工具打开浏览器无法保存登录信息的问题。

 1 from selenium import webdriver
 2 from selenium.webdriver.chrome.service import Service
 3 from selenium.webdriver.chrome.options import Options
 4 import os
 5 import json
 6 import time
 7 
 8 # 配置 ChromeDriver 路径,替换为你的 ChromeDriver 路径,你也可以将chromedriver拖入文件根目录,使用'./chromedriver.exe'路径。
 9 chrome_driver_path = 'E:/Git_repo/VSCode_tmp/autopython/chromedriver-win64/chromedriver.exe'  # 替换为你的 ChromeDriver 路径
10 
11 # 初始化 ChromeDriver Service
12 service = Service(chrome_driver_path)
13 options = Options()
14 options.add_argument("--disable-blink-features=AutomationControlled")  # 使浏览器不显示自动化控制的信息
15 
16 # 初始化 WebDriver,并传入 ChromeDriver Service
17 driver = webdriver.Chrome(service=service, options=options)
18 
19 try:
20     # 打开小红书首页
21     url = "https://www.xiaohongshu.com"
22     driver.get(url)
23     time.sleep(40)  # 等待页面加载完成
24 
25     # 获取 cookies
26     cookies = driver.get_cookies()
27 
28     # 打印当前工作目录
29     print("Current working directory: ", os.getcwd())
30 
31 
32     # 将 cookies 保存到文件
33     with open("cookies.json", "w") as f:
34         json.dump(cookies, f)
35     print("Cookies have been saved to cookies.json")
36 finally:
37     # 关闭 WebDriver
38     driver.quit()

上面程序通过手动登录网页而后再保存网页cookie用于之后的自动化登录。

第三节

通过上面的保存的cookie,编写程序实现网页自动登录并实现指定内容搜索。

  1 from selenium import webdriver
  2 from selenium.webdriver.chrome.service import Service
  3 from selenium.webdriver.chrome.options import Options
  4 from selenium.webdriver.common.by import By
  5 from selenium.webdriver.support.ui import WebDriverWait
  6 from selenium.webdriver.support import expected_conditions as EC
  7 
  8 from selenium.common.exceptions import NoSuchElementException
  9 import random
 10 import os
 11 import time
 12 import json
 13 
 14 
 15 from selenium.webdriver.common.keys import Keys
 16 
 17 # 配置 ChromeDriver 路径,替换为你的 ChromeDriver 路径,你也可以将chromedriver拖入文件根目录,使用'./chromedriver.exe'路径。
 18 chrome_driver_path = 'E:/Git_repo/VSCode_tmp/autopython/chromedriver-win64/chromedriver.exe'  # 替换为你的 ChromeDriver 路径
 19 
 20 # 初始化 ChromeDriver Service
 21 service = Service(chrome_driver_path)
 22 # 打开浏览器时的相关配置,可以根据需求进行打开和关闭
 23 options = Options()
 24 options.add_argument("--start-maximized")  # 启动时最大化窗口
 25 options.add_argument("--disable-blink-features=AutomationControlled")  # 使浏览器不显示自动化控制的信息
 26 # options.add_argument("--disable-gpu")  # 禁用GPU硬件加速
 27 options.add_argument("--disable-infobars")  # 隐藏信息栏
 28 # options.add_argument("--disable-extensions")  # 禁用所有扩展程序
 29 # options.add_argument("--disable-popup-blocking")  # 禁用弹出窗口拦截
 30 # options.add_argument("--incognito")  # 启动无痕模式
 31 # options.add_argument("--no-sandbox")  # 关闭沙盒模式(提高性能)
 32 # options.add_argument("--disable-dev-shm-usage")  # 使用/dev/shm分区以避免共享内存问题
 33 # options.add_argument("--remote-debugging-port=9222")  # 启用远程调试端口
 34 options.add_experimental_option("excludeSwitches", ["enable-automation"])
 35 options.add_experimental_option("useAutomationExtension", False)
 36 
 37 
 38 MAX_ITEMS_BEFORE_WRITING = 5  # 每收集 5 条数据就写入一次文件
 39 
 40 def write_to_file(collected_items):
 41     print("当前工作目录:", os.getcwd())
 42     # 追加写入文件的逻辑
 43     with open('result.json', 'a', encoding='utf-8') as file:
 44         json_data = [json.dumps(item, ensure_ascii=False) for item in collected_items]
 45         file.write('\n'.join(json_data) + '\n')
 46     print("Results saved successfully.")
 47 
 48 #随机延时函数,用来模拟动作比较快的点击操作
 49 def random_delay(time_start, time_end):
 50     delay = random.uniform(time_start, time_end)
 51     time.sleep(delay)
 52 
 53 def scroll_and_collect(driver, num_items):
 54     collected_items = []
 55     collected_count = 0
 56     result_count = 0
 57     while result_count < num_items:
 58         # 获取了页面上的所有选项卡
 59         items = driver.find_elements(By.XPATH, "//section[@class='note-item']")
 60         # 遍历获取的列表,分析里面的元素
 61         for item in items:
 62             try:
 63                 # 找到元素里封面、标题、作者昵称、作者头像等元素
 64                 cover = item.find_element(By.XPATH, ".//a[@class='cover mask ld']/img").get_attribute("src")
 65                 title = item.find_element(By.XPATH, ".//a[@class='title']//span").text
 66                 author_avatar = item.find_element(By.XPATH, ".//a[@class='author']//img[@class='author-avatar']").get_attribute("src")
 67                 author_name = item.find_element(By.XPATH, ".//a[@class='author']//span").text
 68 
 69                 # 存储获取的结果
 70                 collected_items.append({
 71                     "cover": cover,
 72                     "title": title,
 73                     "author_avatar": author_avatar,
 74                     "author_name": author_name
 75                 })
 76                 result_count += 1
 77                 collected_count += 1
 78                 # 写入文件
 79                 if collected_count >= MAX_ITEMS_BEFORE_WRITING:
 80                     write_to_file(collected_items)
 81                     collected_items = []  # 清空已收集的项
 82                     collected_count = 0  # 重置计数器
 83             except NoSuchElementException:
 84                 continue
 85         # 翻页
 86         driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
 87         random_delay(4, 8)  # 等待页面加载新的内容
 88 
 89         # 等待新内容加载的逻辑
 90         try:
 91             WebDriverWait(driver, 10).until(
 92                 EC.presence_of_element_located((By.XPATH, "//section[@class='note-item']"))
 93             )
 94         except NoSuchElementException:
 95             break
 96         # 最后一次写入剩余的项
 97     if collected_count > 0:
 98         write_to_file(collected_items)
 99     return collected_items
100 
101 # 初始化 WebDriver,并传入 ChromeDriver Service
102 driver = webdriver.Chrome(service=service, options=options)
103 # # 防反爬:隐藏 webdriver 特征
104 # driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => false});")
105 
106 try:
107     # 打开小红书首页
108     url = "https://www.xiaohongshu.com"
109     driver.get(url)
110 
111     #time.sleep(4)  # 等待页面加载完成,后面改成显式等待
112     # 显式等待,直到二维码登录出现
113     wait = WebDriverWait(driver, 5)
114     try:
115         # 通过Xpath表达式获取到XHS登录框的html元素,判断是否可以登录
116         ## 此处需要重新确认XPATH元素,修改不使用直接复制F12值
117         search_box = wait.until(EC.presence_of_element_located((By.XPATH, "//*[@id='app']/div[1]/div/div[1]/div[2]")))
118         print("成功等待登录界面")
119     except Exception as e:
120         print(f"等待登录界面超时,错误信息:{e}")
121 
122     #读取之前的cookies
123     with open("cookies.json", "r") as f:
124         cookies = json.load(f)
125     # 添加每个cookie到浏览器
126     for cookie in cookies:
127         driver.add_cookie(cookie)
128     
129     #刷新页面
130     driver.refresh()
131 
132     wait = WebDriverWait(driver, 3)
133     # 等待登录按钮 **消失**(最多 3 秒),也可以判断cookie是否有效
134     try:
135         wait.until(EC.invisibility_of_element_located((By.XPATH, '//*[@id="login-btn"]')))
136         print("成功登录小红书")
137     except Exception as e:
138         print(f"登录小红书失败,错误信息:{e}")
139 
140     time.sleep(5)
141      # 显式等待,直到搜索框出现
142     wait = WebDriverWait(driver, 10)
143     search_box = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@placeholder='搜索小红书']")))
144     search_box.send_keys("漫展")
145     time.sleep(5)
146     search_button = wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@class='input-button']")))
147     search_button.click()
148     time.sleep(5)
149     wait.until(EC.presence_of_element_located((By.XPATH, "//section[@class='note-item']")))
150     time.sleep(5)
151 
152     num_items = 100
153     scroll_and_collect(driver, num_items)
154 
155     '''##单次测试代码
156 
157     items = driver.find_elements(By.XPATH, "//section[@class='note-item']")
158     print(f"找到 {len(items)} 个笔记项")
159     print(items)
160     collected_items = []
161     collected_count = 0
162     result_count = 0
163     for item in items:
164         try:
165             # 找到元素里封面、标题、作者昵称、作者头像等元素
166             cover = item.find_element(By.XPATH, ".//a[@class='cover mask ld']/img").get_attribute("src")
167             title = item.find_element(By.XPATH, ".//a[@class='title']//span").text
168             author_avatar = item.find_element(By.XPATH, ".//a[@class='author']//img[@class='author-avatar']").get_attribute("src")
169             author_name = item.find_element(By.XPATH, ".//a[@class='author']//span").text
170 
171             # 存储获取的结果
172             collected_items.append({
173                 "cover": cover,
174                 "title": title,
175                 "author_avatar": author_avatar,
176                 "author_name": author_name
177             })
178             result_count += 1
179             collected_count += 1
180             # 写入文件
181             if collected_count >= MAX_ITEMS_BEFORE_WRITING:
182                 write_to_file(collected_items)
183                 collected_items = []  # 清空已收集的项
184                 collected_count = 0  # 重置计数器
185         except NoSuchElementException:
186             continue
187         
188         '''
189     # 延时几秒以便查看搜索结果
190     time.sleep(60)
191 
192 finally:
193     # 关闭 WebDriver
194     driver.quit()

构造登录环境和初始化WebDriver与第一节一致,这里不重复,这里主要讲代码打开网页之后的操作。整个执行部分分为两块,一块是自动登录,一块是网页指定内容搜索。

自动登录主要分为三步。第一步,进入网页后检测是否有登录二维码,如果有则认为网页加载完成可以进行登录;第二步,通过导入之前保存的cookie,刷新完成网页的自动登录;第三步,通过检测网页是否存在登录按钮,判断登录操作是否成功,如果没有则认为成功。

网页指定内容搜索主要是通过找到搜索框并将指定文字内容写入实现功能。根据网页的特点保存网页元素,并在每个元素内保存指定的字段内容用于其他。

 

总结

在完成这些程序之前我根本没有网页自动化的任何知识,通过阅读前人的教程和询问AI居然可以实现基本的功能,这让我再一次认识到AI能力的强大,至少在python自动化上已经超过大多数人了!!!

 

参考链接

Python使用selenium库实现网页自动化登陆以及数据抓取(爬虫)教程 - 云霄雨霁 - 博客园

30分钟上手Web自动化测试:Python+Selenium零基础实战指南 - xiaodi888 - 博客园

通义AI助手

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/934438.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MacOS Nginx

查看是否安装:brew info nginx 安装:brew install nginx 卸载:brew uninstall nginx 查看版本:nginx -v 安装目录:/opt/homebrew/Cellar/nginx/1.29.0 (27 files, 2.5MB) 根目录:Docroot is: /opt/homebrew/var/…

缓存的击穿、雪崩、穿透在你项目中的场景是什么

在我们的 OJ 平台中,为了保护数据库、提升响应速度,我设计了一套缓存防护体系: 缓存穿透: 针对恶意请求或不存在的题目 ID,我们用布隆过滤器提前过滤掉无效请求,误判率控制在 0.13% 以下,保护数据库不被大量无效…

[WC2021] 表达式求值

给定一个式子,包含 >,<,? 或者 \([0,m)\) 中的一个数字。其中每个数字代表一个数。 > 代表返回两边的最大值,< 代表返回两边的最小值,? 表示你要在上文的两个符号中选择一个符号替换它。 假设有 \(…

Set集合

无索引 Hashset主注意: LinkedHashset: 存取有顺序其余和hashset一样

JAVA - LinkedList 与 ArrayList 区别和 LinkedList 的四大接口解析

什么是 LinkedListLinkedList 就像一个火车车厢队列。每个“车厢”里装着一个数据(元素),而且每个车厢都知道:自己前面是哪节车厢(previous),自己后面是哪节车厢(next),所以它是一种 “链式结构”。 不像 Ar…

苍穹外卖第三天(Swagger、@RequestParam和@RequestBody的使用场景、@PostMapping和@RequestMapping的区别、对象属性拷贝、@Insert注解)

一、Swagger Swagger是一个用于生成、描述、文档化可视化API的工具(框架)。直接使用Swagger会比较繁琐,所以我们用到了Knife4j框架,它对Swagger进行了封装,简化了相应的操作。 1、Knife4j的使用方式: (1)导入K…

Git 多账号管理

# 新建空白文件夹 mkdir <YOUR PROJECT> # 初始化仓库 git init # 配置当前仓库账号 git config user.name "<YOUR NAME>" git config user.email "<YOUR EMAIL>" # 给当前账号…

完整教程:一文读懂费用分析:定义、分类与成本费用区别

完整教程:一文读懂费用分析:定义、分类与成本费用区别2025-10-10 21:48 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; …

Hyper Server 2019安装I226-V网卡驱动

背景:Hyper-V Server 2019 安装完提示找不到活动的网络适配器 网卡型号:Intel I226-V 以下内容以Hyper-V Server 2019和Intel I226-V网卡为例,其他系统版本(NT6以上)和同系列网卡,操作大同小异,可参考进行。 由…

P10201 永恒

rt好题。 对于一次询问 \((x_1,y_1)\) 到 \((x_2,y_2)\),显然若两点不在同一个联通块中则无解。考虑在同一个联通块中的答案。 我们对整张图进行黑白染色。则有结论:若黑色/白色格点存在不同的数,则一定有解。 证明…

CF1209H tj

zd 讲的啥玩意啊。 题意 你初始的能量为 \(0\),每秒会回复一点能量,同时你每秒可以花 \(x\in [0,2]\) 点能量行走 \(x\) 的距离。 同时地上会有 \(n\) 个传送带,传送带的基础速度为 \(s_i\),求从 \(0\) 走到 \(L\)…

AirBattery - 在Mac上实时监控所有苹果设备电量

AirBattery是一款专为Mac设计的电池监控工具,能够实时显示iPhone、iPad、Apple Watch等苹果设备的电量信息,支持Dock栏、状态栏和小组件显示,让您随时掌握所有设备的电池状态。项目简介 AirBattery 是一款功能强大的…

HTML学习日记

2025.10.10 打卡HTML中尽量不要省略结束标签,而且空元素最好写<br />而不是<br>,这样子做是保证每一个元素都被关闭(空元素在开始标签中关闭)。 使用小写标签,尽管大写也能解析,但是小写标签更被推荐…

10.10每日总结

今天主要的课程有人机交互和机器学习,还有大数据的作业题差一道没完成(用hbase建表),后天就是外语能力大赛的初赛了,加油!

二分图与网络流 Trick

dag 最大独立集(也叫最长反链)Dilworth 定理:一个 dag 中最大独立集的大小,等于其偏序集的最小不可重链覆盖的大小。听着很神秘,实际是这样: 偏序集:对于每一个点三元组 \((i, k, j)\),如果原图中有边 \((i, k…

10月10号

今天进行了日语的学习。 以及对数据结构和离散数学的复习。

win11 系统如何进行硬盘分区?固态硬盘怎么分区?SSD 固态硬盘分区教程

win11本身就有自带的分区功能,所以不用借肋第三方软件也能分区,下面开始分享分区方法。 win11其实和win10差不多,功能也差不多,如果分区过win10可能都不用学就会。 理解原理 将硬盘分区,就是把原有硬盘类式于一个…

10/10

今天上午就一节课,明天放假,雨什么时候停呀

数论(未完)

前言: 复习一下数论(部分) 裴蜀定理 结论: \(∀a,b∈Ζ\),设\(d=gcd(a,b)\) ,则\(∃x,y\)使得\(ax+by=d\) 推论:\(ax+by=m\)有解,当且仅当\(d|m\) 若\(gcd(a,b)=1\),则存在\(x,y\)使得\(ax+by=1\) 对于\(n\)个…

没做完的题

放在这里待办 定义 \[g(n)=2\sum ^n_{i=2}\left \lfloor \frac{n}{i} \right \rfloor^2 \phi(i)+n^2 \]求 \(g(n)\) 定义 \[f(n)=\frac{g(n)-n^2}{2} \]则 \[f(n)=\sum ^n_{i=2}\left \lfloor \frac{n}{i} \right…