爬虫-浏览器自动化

什么是selenium

selenium是浏览器自动化测试框架,原本用于网页测试。但到了爬虫领域,它又成为了爬虫的好帮手。有了 selenium,我们便不再需要判断网页数据加载的方式,只要让 selenium 自动控制浏览器,就像有双无形的手,控制着你的鼠标和键盘,自动地帮你干活。爬取数据?自动抢票?这些当然统统都不在话下。

安装selenium

和安装python的第三方库是一样的

pip install selenium

selenium还需要安装相应的浏览器驱动才能控制浏览器。强烈推荐使用Chorme浏览器。

查看自己电脑上的浏览器版本,依次点击浏览器右上角的 三个点 - 帮助 - 关于 Google Chrome。

将下载的对应版本的的 chromedriver 解压缩,Windows 系统得到 chromedriver.exe,这个就是我们需要的浏览器驱动。我们要将它放到 Python 所在安装目录里。

为了验证驱动是否安装成功,Windows 系统在的 命令行 或者 Anaconda Prompt 中输入 chromedriver 命令,如果出现类似下图所示的内容,就证明驱动已经安装成功了。

打开浏览器

来看下如何用selenium打开Chrom浏览器

# 从 selenium 中导入 webdriver(驱动)
from selenium import webdriver# 选择 Chrome 浏览器并打开
browser = webdriver.Chrome()

获取数据

# 从 selenium 中导入 webdriver(驱动)
from selenium import webdriver# 选择 Chrome 浏览器打开
browser = webdriver.Chrome()
# 打开网页
browser.get('https://wpblog.x0y1.com')
# 关闭浏览器
browser.quit()

browser 是我们实例化的浏览器。我们将网址传给 browser 对象的 get() 方法,即可打开对应的网页。最后调用 quit() 方法将浏览器关闭。

我们的目的是获取数据,接下来让我们用 browser 对象的 page_source 属性来获取网页的源代码。值得注意的是,用 selenium 获取的网页源代码是数据加载完毕后最终的源代码,也就是网页加载后通过 API 获取的数据也在这个源代码中。

因此,我们就不用再区分要爬取的网页是静态网页还是动态网页了,在 selenium 眼里统统都一样。

代码作用
browser  = webdriver.Chrome()打开Chrome浏览器
browser.get("网址")打开网页
browser.page_source获取网页源代码
browser.quit()关闭浏览器

处理数据

我们来看看如何用 selenium 处理数据。我们以获取博客的 h1 元素为例。

from selenium import webdriverbrowser = webdriver.Chrome()
browser.get('https://wpblog.x0y1.com')
h1 = browser.find_element(by='tag name', value='h1')
# 上面的代码也可以写成  
# h1 = browser.find_element('tag name', 'h1')
print(h1.text)
browser.quit()

方法作用
find_element(by = 'tag name', value=...)通过标签查找元素
find element(by = 'class name', value=...) 通过 class 属性名查找元素
find element(by = 'id', value=...) 通过 id 查找元素
find element(by = 'name', value=...)通过 name 属性查找元素
find element(by = 'Link text', value=...) 通过链接文本查找元素
find element(by = 'partial link text', value=...) 通过链接的部分文本查找元素

这些方法找到的元素(返回值)都是 WebElement 对象,它和 BeautifulSoup 里的 Tag 对象一样,也有一个 text 属性,一样也是获取元素里的文本内容。

BeautifulSoup 中通过 select() 方法查找所有被所传入的 CSS 选择器选中的元素。刚才介绍的那些方法都是查找第一个符合条件的元素,接下来我们来看看 selenium 中查找所有符合条件的元素的方法。

这些方法非常简单,直接把 find_element() 方法改成 find_elements() 方法即可:

方法作用
find_elements(by = 'tag name', value=...)通过标签查找元素
find elements(by = 'class name', value=...) 通过 class 属性名查找元素
find elements(by = 'id', value=...) 通过 id 查找元素
find elements(by = 'name', value=...)通过 name 属性查找元素
find elements(by = 'Link text', value=...) 通过链接文本查找元素
find elements(by = 'partial link text', value=...) 通过链接的部分文本查找元素

 比如获取网页源代码中所有的a元素

from selenium import webdriverbrowser = webdriver.Chrome()
browser.get('https://wpblog.x0y1.com')
# 注意下面是 elements
a_tags = browser.find_elements('tag name', 'a')for tag in a_tags:print(tag.text)
browser.quit()

值得一提的是,WebElement 对象也可以调用 selenium 查找元素的方法。这样就和 BeautifulSoup 中的 Tag 对象一样,可以一层一层的查找元素,直到找到为止。

BeautifulSoup 的原理是将网页源代码的字符串形式解析成 BeautifulSoup 对象,然后通过 BeautifulSoup 对象 的属性和方法提取出我们需要的数据。发现没有?BeautifulSoup 只需要一个网页源代码的字符串形式即可。

之前我们都是使用 requests 库获取网页源代码,并通过 text 属性取得其字符串形式。而 selenium 获取网页后的 page_source 属性值正是字符串格式的!

以上面获取博客网页源代码中所有的 a 元素 为例,加上 BeautifulSoup 可以这样写:

from selenium import webdriver
from bs4 import BeautifulSoupbrowser = webdriver.Chrome()
browser.get('https://wpblog.x0y1.com')
# 用 BeautifulSoup 解析网页源代码
soup = BeautifulSoup(browser.page_source, 'html.parser')
a_tags = soup.select('a')
for tag in a_tags:print(tag.text)
browser.quit()

我写了一个两者结合爬取豆瓣读书的代码

import time
from selenium import webdriver
from bs4 import BeautifulSoupbrowser = webdriver.Chrome()
browser.get("https://book.douban.com/top250/")
time.sleep(2)#soup = BeautifulSoup(res.text, 'html.parser')
soup = BeautifulSoup(browser.page_source, 'html.parser')
#print(soup)
# 所有书名所在元素
book_name_tags = soup.select("a")
#print(book_name_tags)
book_names = []
for book_name in book_name_tags:name = book_name.attrsif 'title' in name:book_names.append(name['title'])# 所有书籍信息所在元素
book_info_tags = soup.find_all('p', class_="pl")for i in range(len(book_names)):name = book_names[i]author = book_info_tags[i].text.split('/')[0]publisher = book_info_tags[i].text.split('/')[-3]print("%s / %s / %s" % (name, author, publisher))browser.quit()

 返回的结果如下:

红楼梦 / [清] 曹雪芹 著  /  人民文学出版社 
活着 / 余华  /  作家出版社 
1984 / [英] 乔治·奥威尔  /  北京十月文艺出版社 
哈利·波特 / J.K.罗琳 (J.K.Rowling)  /  人民文学出版社 
三体全集 / 刘慈欣  /  重庆出版社 
百年孤独 / [哥伦比亚] 加西亚·马尔克斯  /  南海出版公司 
飘 / [美国] 玛格丽特·米切尔  /  译林出版社 
动物农场 / [英] 乔治·奥威尔  /  上海译文出版社 
三国演义(全二册) / [明] 罗贯中  /  人民文学出版社 
房思琪的初恋乐园 / 林奕含  /  北京联合出版公司 
福尔摩斯探案全集(上中下) / [英] 阿·柯南道尔  /  1981-8 
白夜行 / [日] 东野圭吾  /  南海出版公司 
小王子 / [法] 圣埃克苏佩里  /  人民文学出版社 
安徒生童话故事集 / (丹麦)安徒生  /  人民文学出版社 
天龙八部 / 金庸  /  生活·读书·新知三联书店 
撒哈拉的故事 / 三毛  /  哈尔滨出版社 
呐喊 / 鲁迅  /  人民文学出版社 
邓小平时代 / 【美】傅高义 (Ezra.F.Vogel)  /  生活·读书·新知三联书店 
悉达多 / [德] 赫尔曼·黑塞  /  天津人民出版社 
杀死一只知更鸟 / [美] 哈珀·李  /  译林出版社 
明朝那些事儿(1-9) / 当年明月  /  中国海关出版社 
失踪的孩子 / [意] 埃莱娜·费兰特  /  人民文学出版社 
新名字的故事 / [意] 埃莱娜·费兰特  /  人民文学出版社 
野草 / 鲁迅  /  人民文学出版社 
沉默的大多数 / 王小波  /  中国青年出版社

 控制浏览器

我们要想登录博客,那必须具备登录的动作,再学习两个方法,分别是:click() 和 send_keys()

方法作用
click()

点击元素

send_keys()模拟按键输入

看下其在代码中的应用

from selenium import webdriver
import timebrowser = webdriver.Chrome()
# 打开博客
browser.get('https://wpblog.x0y1.com')
# 找到登录按钮
login_btn = browser.find_element('link text', '登录')
# 点击登录按钮
login_btn.click()
# 等待 2 秒钟,等页面加载完毕
time.sleep(2)
# 找到用户名输入框
user_login = browser.find_element('id', 'user_login')
# 输入用户名
user_login.send_keys('codetime')
# 找到密码输入框
user_pass = browser.find_element('id', 'user_pass')
# 输入密码
user_pass.send_keys('shanbay520')
# 找到登录按钮
wp_submit = browser.find_element('id', 'wp-submit')
# 点击登录按钮
wp_submit.click()
# 找到 Python 分类文章链接
python_cat = browser.find_element('css selector', 'section#categories-2 ul li a')
# 点击该分类
python_cat.click()
# 找到跳转的页面中的所有文章标题元素
titles = browser.find_elements('css selector', 'h2.entry-title a')# 找到标题元素中内含的链接
links = [i.get_attribute('href') for i in titles]
# 依次打开 links 中的文章链接
for link in links:browser.get(link)# 获取文章正文内容content = browser.find_element('class name', 'entry-content')print(content.text)browser.quit()

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

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

相关文章

【以史为镜、以史明志,知史爱党、知史爱国】中华上下五千年之-元朝

元朝是中国历史上第一个由蒙古族族建立的大统一封建王朝。完整的元王朝历史进程分为四个阶段: 元朝的历史让我们一笔带过,相信大家也不怎么喜欢看。同意的点赞! 元朝的前身——蒙古汗国(1206年—1271年) 建立王朝统治—…

快速体验 Llama3 的 4 种方式,本地部署,800 tokens/s 的推理速度真的太快了!

北京时间4月19日凌晨,Meta在官网上官宣了Llama-3,作为继Llama1、Llama2和CodeLlama之后的第三代模型,Llama3在多个基准测试中实现了全面领先,性能优于业界同类最先进的模型,你有没有第一时间体验上呢,这篇文…

加入这些使用,代码变得简单即优雅!

加入这些使用,代码变得简单即优雅!在Spring Boot应用中,拦截请求通常可以通过两种方式实现:使用HandlerInterceptor(处https://mp.weixin.qq.com/s?__bizMzkzMTY0Mjc0Ng&mid2247484482&idx1&sn063cea7cda…

Apache AGE 运算符

运算符 字符串特定比较运算符 测试数据 SELECT * FROM cypher(graph_name, $$ CREATE (:Person {name: John}),(:Person {name: Jeff}),(:Person {name: Joan}),(:Person {name: Bill}) $$) AS (result agtype);Starts With 对字符串执行区分大小写的前缀搜索。 SELECT * …

【源码开源】C#桌面应用开发:串口调试助手

c#桌面应用开发 1、环境搭建和工程创建:参照番茄定时器项目 工程创建参照 2、界面布局设计 3、具体功能函数 (1)端口扫描: private void btn_com_scan_Click(object sender, EventArgs e){//端口号扫描ReflashPortToComboBox(…

安装失败,已为系统安装 Microsoft Edge Webview2 Runtime

在使用微软的webview2的时候,有时候会出现如下错误提示: 解决方案: 1、打开电脑“控制面板”,找到Microsoft Edge Webview2 Runtime 2、鼠标右键点击,“更改”,按电脑指示操作执行。 3、再次安装Microsoft…

CV每日论文--2024.7.12

1、LLaVA-NeXT-Interleave: Tackling Multi-image, Video, and 3D in Large Multimodal Models 中文标题:LLaVA-NeXT-Interleave:处理大型多模态模型中的多图像、视频和 3D 简介:视觉指令调整在增强大型多模态模型(LMMs)的能力方面取得了显著…

事务码 BP DYNPRO_NOT_FOUND

事务码 BP DYNPRO_NOT_FOUND 使用事务 BP 时,模块 PBO_START_SUBSCREEN 中 SAPLBUSS 中的转储 DYNPRO_NOT_FOUND 目录 问题 双击查看详细信息时发生错误DYNPRO_NOT_FOUND 解决方案 执行事务码BUSP 重新生成屏幕 参考链接: 1621119

2w才学到的交易策略,Anzo Capital今天免费分享

花费了2w学费才学到的外汇交易策略,Anzo Capital今天免费分享!那就是使用交易价格行动和利润区策略,在实施价格行动利润区策略时,关键步骤一定要严格执行,下面是操作的关键步骤: 1. 定义趋势:首…

获取网页logo图标

怎么获取网页logo图标的URL链接 第一种方法: 最常用的方法(适用于90%的站点)是,直接在访问网址首页链接后加上上/favicon.ico,例如: https://www.baidu.com/favicon.ico 第二种方法: 按F12&…

【逆向基础】十二、工具分享之Process Explorer

一、简介 Process Explorer是一款出色的进程资源管理器。在调试运行window系统中的程序软件时,使用Process Explorer可以通过工整的UI界面,让我们快速了解软件的进程信息,挂载的动态库等;可以帮助我们快速定位分析的方向&#xf…

python如何结束程序运行

方法1:采用sys.exit(0),正常终止程序,从图中可以看到,程序终止后shell运行不受影响。 方法2:采用os._exit(0)关闭整个shell,从图中看到,调用sys._exit(0)后整个shell都重启了(RESTAR…

30.ROM-IP核的调用

(1)ROM IP核简介: ROM是只读存储器,是一种只能读出事先锁存的固态半导体存储器。其特性是一旦存储资料就无法再将之改变或删除,并且资料也不会因为电源关闭而消失。(掉电不丢失) FPGA使用内部RA…

上讯信息 InforCube运维管理审计系统 RepeatSend 前台RCE漏洞复现

0x01 产品简介 上讯信息的InforCube运维管理审计系统(InforCube OMA)是一款新一代运维安全审计产品,旨在全面提升企业IT运维管理水平,通过细粒度授权、全过程操作记录及控制、全方位操作审计等功能,实现运维过程的“事…

USB PD SINK协议取电芯片不同品牌介绍对比-在选择PD SINK 协议芯片时,用户需要综合考虑各方面的因素,包括工作耐压、稳定性、兼容性等

PD SINK协议芯片是现代通信技术中的一项重要技术,它起着连接不同系统的桥梁作用。协议芯片内部集成了各种不同的通信协议,如蓝牙、Wi-Fi、以太网等,使不同设备之间的通信变得更加简单和高效。协议芯片推动了信息通信技术的发展。在过去&#…

Windows下查看某个端口被某个应用占用

1、打开命令窗口(以管理员身份运行) ​​​​​​​​​​ 2、查找所有运行的端口 输入所有命令:当前命令可以查看当前电脑的全部端口使用情况 netstat -ano3、查看被占用端口对应的 PID(这里以8000端口为例) netstat -ano|findstr &qu…

博物馆地图导航系统:高精度地图引擎与AR/VR融合,实现博物馆数字化转型

在人民日益追求精神文化的时代下,博物馆作为传承与展示人类文明的璀璨殿堂,其重要性不言而喻。然而,随着博物馆规模的不断扩大和藏品种类的日益丰富,游客在享受知识盛宴的同时,也面临着“迷路”与“错过”的困扰。博物…

一周涨8K star!RAG技术迎来大升级,速度关注

之前我们聊到过RAG,它是目前非常常用的增强大模型能力的技术,通过检索增强生成(RAG),大型语言模型能够从外部知识源检索信息,从而回答涉及私有或未见文档的问题。 今天我们分享一个开源项目,它…

【MybatisPlus】QueryWapper和LambdaQueryWrapper的区别

【MybatisPlus】QueryWapper和LambdaQueryWrapper的区别 (一)MyBatisPlus的条件查询构造器QueryWrapperLambdaQueryWrapper优缺点使用场景 (二)Lambda的概念(三)QueryWrapper如何进化成LambdaQueryWrapper的…

Python爬虫之路(2):爬天气情况

hello hello~ ,这里是绝命Coding——老白~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页:绝命Coding-CSDN博客 &a…