爬虫-浏览器自动化

news2024/9/23 7:31:01

什么是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 webdriver

browser = 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 webdriver

browser = 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 BeautifulSoup

browser = 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 BeautifulSoup


browser = 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.attrs
    if '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 time

browser = 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.coloradmin.cn/o/1921319.html

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

相关文章

海南云亿商务咨询有限公司抖店开店正规吗?

在当今的数字经济时代,抖音电商已经成为一股不可忽视的力量。无论是品牌商还是个人创业者,都纷纷涌入这个充满活力和潜力的市场。而在这个风起云涌的浪潮中,海南云亿商务咨询有限公司以其专业的服务和敏锐的市场洞察力,成为抖音电…

GitHub 创始人资助的开源浏览器「GitHub 热点速览」

你是否注意到,现在主流的浏览器如 Chrome、Edge、Brave 和 Opera 都采用了谷歌的 Chromium 引擎?同时,谷歌每年不惜花费数十亿美元,确保其搜索引擎在 Safari 中的默认地位,甚至连 Firefox 也难逃商业利益的影响&#x…

一款好用的特殊字符处理工具

跟mybatis代码的时候,偶然发现的一款特殊字符处理工具java.lang.StringTokenizer。平常,我们看到的mybatis mapper.xml里面各种换行各种缩进,但日志文件里面的sql都是整整齐齐的。没有换行符,缩进等。就是利用该工具做的格式化处理…

在Ubuntu下安装samba实现和Windows系统文件共享

一、安装 apt install -y samba samba-clientSamba is not being run as an AD Domain Controller: Masking samba-ad-dc.service Please ignore the following error about deb-systemd-helper not finding those services. (samba-ad-dc.service masked) Created symlink /et…

每天一个数据分析题(四百二十七)- 方差分析

下面是一个方差分析表: 表中A,B,C,D,E五个单元格内的数据分别是( )。 A. 40,5,35,60,1.71 B. 40,5,35,60&a…

仙侠天花板,圆你土豪梦,上古传说手游详细图文架设教程

前言 这次给大家带来的是一款我的心头好,绝对是我所有架设游戏里排名前三的,一款经典的仙侠手游,安卓苹果双端,画质精美程度真的没有哪几个游戏可以比得上,故事情节加上背景音乐绝对值得沉浸其中慢慢玩,最…

JSONObject和Map<String, Object>的转换

一、前言 Java开发中出参返回和入参传入更灵活的方法是使用Map<String, Object>入参或出参&#xff0c;或者使用JSONObject。 1、好处&#xff0c;参数可变&#xff0c;对接口扩展性很友好。 public ResponseData<WXModelDTO> getUserInfo(RequestBody Map<…

【unity笔记】常见问题收集

一 . Unity Build GI data 卡住问题 问题解决: 参考官方文档&#xff0c;GI(Global Illumination) data 指的是全局照明信息。 在Unity的Edit->Preference中&#xff0c;可以编辑GI缓存路径和分配GI缓存大小。 调出Window->Rendering->Lighting窗口&#xff0c;取消…

OceanMind海睿思成功签约苏州天准,助力数据管理流程闭环!

近日&#xff0c;中新赛克海睿思与苏州天准科技股份有限公司&#xff08;以下简称“苏州天准”&#xff09;达成深度战略合作&#xff0c;为苏州天准提供数据工程平台。 双方将依托OceanMind海睿思提供的业内领先的数据工程建设理念&#xff0c;为苏州天准搭建以数字化平台底座…

大模型中 KV Cache 原理及显存占用分析

本文记录大模型推理阶段 KV Cache 的原理及显存占用情况。 Self-Attention 与 KV Cache 如图&#xff0c;当新生成的 token x 进到模型计算 Attention 时&#xff0c;先分别乘上参数矩阵 W q W_q Wq​、 W k W_k Wk​、 W v W_v Wv​ 得到向量 q&#xff0c;以及矩阵 K、V。…

汽车零配件行业看板管理系统应用

生产制造已经走向了精益生产&#xff0c;计算时效产出、物料周转时间等问题&#xff0c;成为每一个制造企业要面临的问题&#xff0c;工厂更需要加快自动化&#xff0c;信息化&#xff0c;数字化的布局和应用。 之前的文章多次讲解了企业MES管理系统&#xff0c;本篇文章就为大…

华为机试题-从(0,0)开始,计算绘图面积-Java

代码在最后面 1 题目描述 绘图机器的绘图笔初始位置在原点(0,0)&#xff0c;机器启动后按照以下规则来进行绘制直线。 尝试沿着横线坐标正向绘制直线直到给定的终点E。期间可以通过指令在纵坐标轴方向进行偏移&#xff0c;offset Y为正数表示正向偏移&#xff0c;为负数表示负…

linux源码安装mysql8.0的小白教程

1.下载8.x版本的mysql MySQL :: Download MySQL Community Server (Archived Versions) 2.安装linux 我安装的是Rocky Linux8.6 3.设置ip地址,方便远程连接 使用nmcli或者nmtui设置或修改ip地址 4.使用远程连接工具MobaXterm操作: (1)将mysql8版本的压缩包上传到mybaxterm…

【电商选品干货】差异化卖点要这样打造,80%商家却做不到

今天就给大家说说&#xff0c;如何去挖掘产品的差异化卖点&#xff1f;我们要找差异化卖点&#xff0c;就是因为我们的产品转化率不足&#xff0c;通常有下面几点原因&#xff1a; 1、产品差异化卖点不足&#xff0c;商家占比30% 2、流量和产品卖点不匹配&#xff0c;商家占比…

U-2 Net原理+代码实战教程

目录 一、显著性目标检测1.1 核心目标1.2 技术方法 二、U2-Net2.1 双层嵌套U结构2.2 残差U块&#xff08;RSU&#xff09;2.3 网络训练和监督 三、代码实战3.1 克隆仓库3.2 下载预训练模型3.3 安装依赖3.4 运行模型显著性目标检测&#xff1a;训练模型&#xff1a; 一、显著性目…

美团到家平台业务探索

背景 到家业务发展已经近10年&#xff0c;目前最为火热的应该有美团到家、抖音到家等&#xff0c;这种极具挑战性的业务&#xff0c;值得学习和思考。 既然是服务平台化&#xff0c;那一定是兼容了多种业务以及多种模式。 挑战 订单、骑手规模大&#xff0c;供需匹配过程的…

UDS协议——Authentication(29服务)

诊断协议那些事儿 诊断协议那些事儿专栏系列文章,本文介绍诊断和通讯管理功能单元下的29服务Authentication (29 16) service。此服务是在ISO 14229-2020版本中首次增加的为应对网联汽车日益增加的安全风险的新服务。为Client和Server之间的身份认证提供一种方法,以便对意图…

常用3D建模软件有哪些?如何实现3D模型在线预览?

3D建模是指使用计算机软件或其他工具创建三维物体模型的过程。3D建模大概可分为NURBS和多边形网格两类。NURBS对要求精细、弹性与复杂的模型有较好的应用&#xff0c;适合量化生产用途&#xff1b;多边形网格建模则靠拉面方式&#xff0c;适合做效果图与复杂场景动画。建模方法…

论文AIGC率超标,专业去痕工具是快速整改的钥匙,降低学术风险。

在学术领域&#xff0c;独创性是每位研究者梦寐以求的桂冠。随着AI技术的突飞猛进&#xff0c;AI辅助写作软件已成为学术工作者的得力伙伴。尽管如此&#xff0c;这些工具在提供帮助的同时&#xff0c;也引发了一个问题——如何有效减少论文的AI率。AI率&#xff0c;也就是由人…

ubuntu重装系统后,安装cuda,cudnn

一、 先安装驱动&#xff0c;如果驱动安装不成功&#xff0c;会影响桌面&#xff0c;再重装系统还来得及&#xff0c;尝试了很多方法&#xff0c;还是用系统安装最靠谱&#xff1a; 首先进入Ubuntu搜索栏目&#xff0c;找到软件更新器的一个图标&#xff0c;点开之后是这样的。…