Pyhton爬虫使用Selenium实现浏览器自动化操作抓取网页

ops/2024/10/18 16:41:57/

        第三方库Selenium主要是用来抓取动态生成的网页数据,有些网站的内容要下拉网页才会动态加载,特别是那些使用javaScript渲染的内容。当然Selenium还可用于自动化浏览器操作,比如编写一个自动抢火车票的python脚本,这并不难实现。接下了我将通过用Selenium模拟用户的操作来抓取网页。

pip install selenium  # 这是下载Selenium的终端命令

        我使用的是edge浏览器,谷歌浏览器也是一样的,不过初始化webdriver用'driver = webdriver.chrome()',为了简便,我挑选在百度官网上去抓取一些表情包图片。同样我将这些步骤封装成了一个函数,不过因为爬取网页需要分析特定的网页结构,所以能够复用的地方有限,该函数只能用于百度官网,因为我也不确定其他网站的输入框input元素的id是不是"kw"。

        首先,我要模拟用户在百度官网上输入“表情包”到搜索框。search_box1.send_keys(search_name)该函数会将search_name的值传递给search_box1(这是获取的页面input输入框元素)。同时用函数search_box1.send_keys(Keys.RETURN)模拟用户的点击回车操作。
        这个函数有两个参数,第一个是搜索的内容,可以换成其他的,但因为该函数要抓取的是图片URL,所以范围也是有限。第二个是默认参数,默认值为'https://www.baidu.com'。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import timedef get_image_urls(search_name="表情包",url="https://www.baidu.com"):# 初始化 WebDriver(以 Edge 为例)driver = webdriver.Edge()driver.get(url)wait = WebDriverWait(driver, 10)search_box1 = wait.until(EC.element_to_be_clickable((By.ID, "kw")))search_box1.send_keys(search_name)  # 将值为"表情包"的字符串变量传递time.sleep(2) search_box1.send_keys(Keys.RETURN)  # 模拟用户输入回车

        在百度搜索内容时,默认会将搜索结果中的标题以<h3>标签显示。我这里定位到搜索结果的第一个,并用first_a.click()模拟用户点击链接跳转。但是要注意的是由于点击链接会跳转到新窗口,所以我们要用switch_to.windows来切换页面。由于本文旨在讨论Selenium的自动化操作,涉及爬虫的内容并不会很多,所以在接下来的抓取图片URL的操作,只是简单抓取可见的img标签,对于可能还未被加载的图片不在过多讨论。

     # 等待搜索结果的加载,并寻找第一个搜索结果first_h3 = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "h3")))print(first_h3.text)# 查找 h3 内部的第一个 a 标签first_a = first_h3.find_element(By.TAG_NAME, "a")  # 找到第一个子标签 atime.sleep(2) # 点击 a 标签以跳转first_a.click()# 等待一些时间以观察跳转效果(可选)time.sleep(2)driver.switch_to.window(driver.window_handles[1])  # 切换到新窗口

       因为我们访问的网站能够实现无限滚动加载,所以我们会在外部用while循环来控制下拉次数。并使用max_scrolls = 10和scroll_count = 0搭配使用来控制下拉次数为10次。

    # 这里将模拟用户下拉操作十次max_scrolls = 10scroll_count = 0while scroll_count < max_scrolls:last_height = driver.execute_script("return document.body.scrollHeight")driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")time.sleep(2)new_height = driver.execute_script("return document.body.scrollHeight")if new_height == last_height:breakscroll_count += 1img_tags = driver.find_elements(by=By.ID, value='imgid')print("找到的图像标签数:", len(img_tags))  # 打印找到的图像标签数量for img in img_tags:imgitems = img.find_elements(by=By.CLASS_NAME, value='imgitem')for item in imgitems:print(item.text)driver.quit()

        以上所有代码都是在函数get_image_urls()里,不过在while循环里调用了我们自己编写的滚动函数scroll_to_bottom(),这是模拟用户往下拉加载的函数,该函数在上面的程序中被调用。 

def scroll_to_bottom(driver):last_height = driver.execute_script("return document.body.scrollHeight")while True:# Scroll down to the bottomdriver.execute_script("window.scrollTo(0, document.body.scrollHeight);")# Wait for new content to loadtime.sleep(2)  # 可以根据实际情况调整等待时间# Calculate new scroll height and compare with last heightnew_height = driver.execute_script("return document.body.scrollHeight")if new_height == last_height:break  # 如果没有新的内容加载,退出循环last_height = new_height

        本程序涉及使用url地址初始化一个浏览器实例,浏览器自动化操作使用send_keys()来模拟用户的输入以及按键(如回车键),同时使用click()函数来模拟用户点击链接,并用法都不难。以上程序在下载Selenium后就可以直接运行,如果有问题的欢迎在评论区留言!


http://www.ppmy.cn/ops/121565.html

相关文章

【BUG】P-tuningv2微调ChatGLM2-6B时所踩的坑

0.前言 P-tuning v2的实验在网上一抓一大把&#xff0c;这里就说一下我在微调过程中遇到的有些bug&#xff0c;踩过的一些坑&#xff0c;在网上找了很久都没有一些好的解决方案&#xff0c;在这里记录一下。 1.下载预训练模型 在官方给出的教程中&#xff0c;并不需要预先将模…

Redis: 集群环境搭建,集群状态检查,分析主从日志,查看集群信息

集群环境搭建 在 Redis 5版本以前是用 Ruby 来搭建集群&#xff0c;在后面的版本中仍保留了相关功能可以再源码src目录中&#xff0c;看到 redis-trib.rb 这个东西&#xff0c;只是现在用这种方式搭建的少了我们看新的版本是怎样搭建集群的&#xff0c;新版构建集群的方式简单…

Java项目实战II基于Java+Spring Boot+MySQL的购物推荐网站的设计与实现(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 随着互联网技术的飞速发展&#xff0c;电子商务已成为人们日常生活中不可或缺的一部分。然而&#xf…

【深度学习基础模型】深度残差网络(Deep Residual Networks, DRN)详细理解并附实现代码。

【深度学习基础模型】深度残差网络&#xff08;Deep Residual Networks, DRN&#xff09;详细理解并附实现代码。 【深度学习基础模型】深度残差网络&#xff08;Deep Residual Networks, DRN&#xff09;详细理解并附实现代码。 文章目录 【深度学习基础模型】深度残差网络&a…

模拟算法(5)_数青蛙

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 模拟算法(5)_数青蛙 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. 题目链接…

【宽搜】1. 层序遍历模板讲解

题目描述 题目链接&#xff1a;N叉树的层序遍历 层序遍历流程 请仔细阅读下图&#xff1a; 根据上图的流程&#xff0c;下面再明确几个问题&#xff1a; 1. 为什么要使用队列&#xff1f; 队列是先进先出的数据结构&#xff0c;在数的层序遍历中&#xff0c;需要先将节点p…

【Linux】详解Linux下的工具(内含yum指令和vim指令)

文章目录 前言1. Linux下软件安装的方式2. yum2.1 软件下载的小知识2.2 在自己的Linux系统下验证yum源的存在2.3 利用yum指令下载软件2.4 拓展yum源&#xff08;针对于虚拟机用户&#xff09; 3. vim编辑器3.1 vim是什么&#xff1f;3.2 如何打开vim3.2 vim各模式下的讲解3.2.1…

[rk3588 debain]cpu死锁问题解决

1 问题 rk3588机器上运行客户如下程序程序发生“BUG: spinlock recursion on CPU#0” ./rtsp RtspWrapper.xml 应用程序功能是&#xff1a;ip摄像头推流&#xff0c;通过rtsp协议拉流&#xff0c;对视频流做裁剪&#xff0c;缩放工作。首先&#xff0c;根据视频帧率每秒钟处理…