python3 爬虫第二步Selenium 使用简单的方式抓取复杂的页面信息

Selenium 简介

该系列专栏上一篇爬虫文章点击这里。

网站复杂度增加,爬虫编写的方式也会随着增加。使用Selenium 可以通过简单的方式抓取复杂的网站页面,得到想要的信息。

Selenium 是操作浏览器进行自动化,例如自动化访问网站,点击按钮,进行信息采集,对比直接使用bs4 抓取信息,Selenium的抓取速度是有很大缺陷,但是如果抓取页面不多,页面复杂时,使用Selenium是个不错的选择。
本文将会使用Selenium 进行一些简单的抓取,想要深入学习Selenium 可以查看我之前写过的 《selenium3 底层剖析》 上 下 两篇。

Selenium 使用注意

在使用 Selenium前需要安装 Selenium,使用pip命令,安装如下:

pip install selenium

安装完成 Selenium 还需要下载一个驱动。

  • 谷歌浏览器驱动:驱动版本需要对应浏览器版本,不同的浏览器使用对应不同版本的驱动,点击下载
  • 如果是使用火狐浏览器,查看火狐浏览器版本,点击
    GitHub火狐驱动下载地址
    下载(英文不好的同学右键一键翻译即可,每个版本都有对应浏览器版本的使用说明,看清楚下载即可)

作者的环境说明如下:

  • 操作系统:Windows7 SP1 64
  • python 版本:3.7.7
  • 浏览器:谷歌浏览器
  • 浏览器版本: 80.0.3987 (64 位)

下载好驱动后,必须把驱动给配置到系统环境,或者丢到你python的根目录下。

正式开始

首先在代码中引入 selenium

from selenium import webdriver

可能有些读者没有把驱动配置到环境中,接下来我们可以指定驱动的位置:

driver = webdriver.Chrome(executable_path=r'F:\python\dr\chromedriver_win32\chromedriver.exe')

以上代码调用Chrome 方法并且配置驱动地址(这里使用 executable_path 指定驱动地址)为“F:\python\dr\chromedriver_win32\chromedriver.exe”,这时就可以指定了驱动位置,也可以不用配置到环境了。
这时运行一下代码,查看是否会打开一个浏览器。
在这里插入图片描述
这时将会成功打开谷歌浏览器。
这时 driver 变量为浏览器对象,通过 driver 操作浏览器,使用get方法可以访问一个网址。这时我们可以访问 百度。代码如下:

from selenium import webdriver
driver = webdriver.Chrome(executable_path=r'F:\python\dr\chromedriver_win32\chromedriver.exe')
driver.get("http://baidu.com")

成功打开百度搜索界面:
在这里插入图片描述
例如我们想搜索爬虫,使用selenium实现自动搜索。首先需要了解的一个函数为 find_element_by_id,该函数可以通过id 找到界面元素。在html中,大部分有特殊作用的元素会赋予一个id,搜索时需要填写的是百度搜索关键字的文本框,将鼠标移动到文本框,对准文本框点击鼠标右键,点击检查可以查看元素。
在这里插入图片描述
点击检查后将会出现一个源码窗口:
在这里插入图片描述
其中input为文本框元素,id的值是 kw。
这时得知了文本框的id 值为kw,可以使用 find_element_by_id 函数给予id值,找到元素对象,并且可以操作元素对象进行增删操作。由于 find_element_by_id 是浏览器对象的方法,使用浏览器对象调用,代码如下:

input = driver.find_element_by_id('kw')

这时还差向该对象输入要搜索的值。使用 send_keys 方法可以自动键入值,编写如下:

input.send_keys("爬虫")

其中input是刚刚获取的元素对象。这时运行代码查看效果:
在这里插入图片描述
这时自动键入了要搜索的关键帧“爬虫”。接下来根据之前的步骤,应该找到 百度一下 按钮的id,随后点击即可。通过相同的流程,得到百度一下 按钮的html代码:

<input type="submit" id="su" value="百度一下" class="bg s_btn">

得到id为su,使用 find_element_by_id 得到元素对象:

enter = driver.find_element_by_id('su')

该元素调用click方法即可进行点击:

enter.click()

最终代码如下:

from selenium import webdriver
driver = webdriver.Chrome(executable_path=r'F:\python\dr\chromedriver_win32\chromedriver.exe')
driver.get("https://www.baidu.com/")
input = driver.find_element_by_id('kw')
input.send_keys("爬虫")
enter = driver.find_element_by_id('su')
enter.click()

运行结果如下:
在这里插入图片描述

信息获取

能够进行自动打开了,下一步接下来需要做的就是获取搜索的信息。
在这里需要介绍一个知识点 xpath,我们可以理解xpath就像 x,y坐标一样的东西,用于html或者说xml语言中的定位,表示一个位置。简单的使用并不需要去学习它如何编写,因为从浏览器中我们可以直接得到。

如下图,我们右键搜索出来了信息第一个标题,点击检查后会出现源代码。在源代码中右键,选择Copy之后点击Copy XPath,这时我们就把当前这个元素的XPath获取了。
在这里插入图片描述
获取到了XPath后,复制到文本框,查看是如下形式:

//*[@id="3001"]/div[1]/h3/a

在这里注意,理论上每一个页面的第一行结果都将会是该XPath,并不需要每一页都去获取,但也有情况不一致的时候,具体情况得具体分析。
我们简单实用XPath不需要了解过多,接下来可以使用 find_element_by_xpath 获取到当前元素对象。

res_element=driver.find_element_by_xpath('//*[@id="3001"]/div[1]/h3/a')

获取到元素对象后,可以调用该元素对象的text属性获取到当前文本值:

print(res_element.text)

完整代码如下:

from selenium import webdriver
import time
driver = webdriver.Chrome(executable_path=r'F:\python\dr\chromedriver_win32\chromedriver.exe')
driver.get("https://www.baidu.com/")
input = driver.find_element_by_id('kw')
input.send_keys("爬虫")
enter = driver.find_element_by_id('su')
enter.click()
time.sleep(2)res_element=driver.find_element_by_xpath('//*[@id="3001"]/div[1]/h3/a')
print(res_element.text)

以上代码中 time.sleep(2) 是为了等待点击搜索后页面加载数据,不然会获取不到对象。
结果如下:
在这里插入图片描述
以上省略了浏览器自动打开并搜索内容的过程,直接查看了结果。
那么我们每一页都获取第一个结果,这时只需要自动点击下一页后获取即可。
首先得到下一页按钮的元素对象:
在这里插入图片描述
复制XPath值为:

//*[@id="page"]/div/a[10]

则获取下一页对象并且点击跳转的代码为:

nextbtn_element=driver.find_element_by_xpath('//*[@id="page"]/div/a[10]')
nextbtn_element.click()

运行后发现成功跳转到第二页,接下来可以继续获取搜索栏的第一个对象,可以使用循环实现这个过程,我们设定去搜索前10页的所有第一个结果值,这时所有代码可以写为:

from selenium import webdriver
import time
driver = webdriver.Chrome(executable_path=r'F:\python\dr\chromedriver_win32\chromedriver.exe')
driver.get("https://www.baidu.com/")
input = driver.find_element_by_id('kw')
input.send_keys("爬虫")
enter = driver.find_element_by_id('su')
enter.click()
time.sleep(2)for _ in range(10):res_element=driver.find_element_by_xpath('//*[@id="3001"]/div[1]/h3/a')print(res_element.text)nextbtn_element=driver.find_element_by_xpath('//*[@id="page"]/div/a[10]')nextbtn_element.click()time.sleep(2)

for 循环最下面的停止2秒是为了点击下一页后数据进行加载的等待时间。
运行后,结果发现报错:
在这里插入图片描述
我们的12行为:

res_element=driver.find_element_by_xpath('//*[@id="3001"]/div[1]/h3/a')

那么在这里应该是 //*[@id="3001"]/div[1]/h3/a 定位错误,没有找到该定位的元素。我们查看第一页、第二页、第三页的第一条结果进行对比:

第一页://*[@id="3001"]/div[1]/h3/a
第二页://*[@id="11"]/h3/a
第三页://*[@id="21"]/h3/a
第四页://*[@id="31"]/h3/a
第五页://*[@id="41"]/h3/a

从以上数据得知,只有第一页的XPath 不同,其它的XPath都遵循从11-21-31-41 每一页加10的规律。
并且发现下一页按钮的 XPath也发生了改变,变成了:

//*[@id="page"]/div/a[11]

完整代码如下:

from selenium import webdriver
import time
#请求网页
driver = webdriver.Chrome(executable_path=r'F:\python\dr\chromedriver_win32\chromedriver.exe')
driver.get("https://www.baidu.com/")
#输入并且搜索
input = driver.find_element_by_id('kw')
input.send_keys("爬虫")
enter = driver.find_element_by_id('su')
enter.click()
#等待2秒加载
time.sleep(2)
#获取第一个结果并且点击下一页
res_element=driver.find_element_by_xpath('//*[@id="3001"]/div[1]/h3/a')
print(res_element.text)
nextbtn_element=driver.find_element_by_xpath('//*[@id="page"]/div/a[10]')
nextbtn_element.click()
time.sleep(2)#设置一个变量start
start=1
#循环点击下一页 并且获取第一条数据
for _ in range(10):start+=10xpath_val=r'//*[@id="'+str(start)+r'"]/h3/a' #//*[@id="11"]/h3/ares_element=driver.find_element_by_xpath(xpath_val)print(res_element.text)nextbtn_element=driver.find_element_by_xpath('//*[@id="page"]/div/a[11]')#//*[@id="page"]/div/a[11] //*[@id="page"]/div/a[11]nextbtn_element.click()time.sleep(2)

以上代码中:

from selenium import webdriver
import time
#请求网页
driver = webdriver.Chrome(executable_path=r'F:\python\dr\chromedriver_win32\chromedriver.exe')
driver.get("https://www.baidu.com/")
#输入并且搜索
input = driver.find_element_by_id('kw')
input.send_keys("爬虫")
enter = driver.find_element_by_id('su')
enter.click()
#等待2秒加载
time.sleep(2)
#获取第一个结果并且点击下一页
res_element=driver.find_element_by_xpath('//*[@id="3001"]/div[1]/h3/a')
print(res_element.text)
nextbtn_element=driver.find_element_by_xpath('//*[@id="page"]/div/a[10]')
nextbtn_element.click()
time.sleep(2)

为之前的代码,新增循环为遍历下一页以及获取第一个结果:

   #设置一个变量start
start=1
#循环点击下一页 并且获取第一条数据
for _ in range(10):start+=10xpath_val=r'//*[@id="'+str(start)+r'"]/h3/a' #//*[@id="11"]/h3/ares_element=driver.find_element_by_xpath(xpath_val)print(res_element.text)nextbtn_element=driver.find_element_by_xpath('//*[@id="page"]/div/a[11]')#//*[@id="page"]/div/a[11] //*[@id="page"]/div/a[11]nextbtn_element.click()time.sleep(2)

首先设置一个start,因为第二页是 XPath 中变化的值为11-21-31…,设置一个变量为1,每次加10即可,所以在循环中,第一句为:

start+=10

由于XPath的值其它字符串没变化,所以整一条XPath语句可以写为:

xpath_val=r'//*[@id="'+str(start)+r'"]/h3/a'

之后传入xpath函数获取元素即可:

res_element=driver.find_element_by_xpath(xpath_val)

接下来的语句都没有太大变化,只有按钮的XPath有变化,所以更改了XPath。其它代码均和之前的相似。最终运行结果如下:
在这里插入图片描述
由于有一些其它信息所以打码了,这就是一个简单的selenium爬虫编写方式,之后将会持续更新爬虫系列。

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

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

相关文章

windows远程连接linux-安装xfce界面,ubuntn添加新用户

参考&#xff1a;“ 使用xrdp实现windows 远程桌面连接linux” http://blog.csdn.net/qq_33530388/article/details/64502902; http://www.linuxidc.com/Linux/2017-04/142690.htm 之前一直用mstsc连接windows主机&#xff0c;今天想用此来连接linux主机时&#xff0c;发现 连…

Qt 如何处理密集型耗时的事情

有时候需要处理一些跟界面无关的但非常耗时的事情&#xff0c;这些事情跟界面在同一个线程中&#xff0c;由于时间太长&#xff0c;导致界面无法响应&#xff0c;处于“假死”状态。例如&#xff1a;在应用程序中保存文件到硬盘上&#xff0c;从开始保存直到文件保存完毕&#…

【EPS精品教程】基于DOM和DSM创建垂直模型、加载垂直模型

本教程讲解EPS三维测图模块,主要内容有新建工程、创建垂直模型,为后续工作做准备。 目录 一、创建工程 二、生成垂直摄影模型

从旧金山到上海, HTTP/3 非常快!

HTTP/3 是超文本传输协议 (HTTP) 的第三个版本&#xff0c;它对 Web 性能来说意义重大, 让我们看看HTTP/3 如何让网站的速度变得更快&#xff01;等等&#xff0c;HTTP/2 发生了什么? 不是几年前才开始推广 HTTP/2 吗? 确实是这样, 但是它出现了一些 问题[1]&#xff0c; 包括…

最大尺寸分辨率_未来就在眼前——视涯科技推出最高分辨率硅基OLED显示屏幕...

声明&#xff1a;新闻稿非映维官方稿件&#xff0c;任何法律问题均与映维无关视涯科技•未来就在眼前2019年7月9日&#xff0c;在位于合肥新站高新区的自建工厂内&#xff0c;视涯科技(以下简称&#xff1a;“视涯”)作为一家半导体显示技术公司&#xff0c;公布开发中的两款硅…

Qt 第二步 熟悉文件结构组成(二)

目录导航&#xff1a; 《Qt 第一步 HelloWorld 的第一个程序》 《Qt 第二步 槽与信号&#xff08;一&#xff09; 实现点击按钮并弹窗》 本文参考《Qt5.9 c开发》 上一篇文使用了槽与信号完成了点击按钮并弹窗的程序效果&#xff0c;这一篇文将会了解Qt的项目文件组成。本节将会…

php基础教程 第一步 环境配置及helloworld

PHP 是服务器端脚本语言。全称为 Hypertext Preprocessor 为超文本预处理器。 据说php8不久后也要发布了&#xff0c;趁着8还没有发布赶紧写一个php5到php7&#xff08;在基础教程写完后将写php7新特性&#xff09;的教程。PHP版本之间更新会增加新特性&#xff08;别的语言也…

Hadoop(五)C#操作Hive

HiveHive将HiveQL&#xff08;类sql语言&#xff09;转为MapReduce&#xff0c;完成数据的查询与分析&#xff0c;减少了编写MapReduce的复杂度。它有以下优点&#xff1a;学习成本低&#xff1a;熟悉sql就能使用良好的数据分析&#xff1a;底层基于MapReduce实现同样存在一些缺…

深度优先搜索——八皇后问题

代码&#xff1a;&#xff08;控制台打印不了92种情况&#xff0c;只打印前10种&#xff09; 1 #include<iostream>2 #include<string>3 #include<windows.h>4 #define ok 15 #define error 06 using namespace std;7 8 9 int a[9][9]{0}; 10 int num0; 1…

python3 爬虫第三步 本文包你学会正则 不会就来锤我

简介 正则表达式是一种描述字符的一种方式&#xff0c;通过该方式&#xff0c;匹配字符串。 正则表达式是自由的&#xff0c;一个字符的含义往往代表着一类字符&#xff0c;通过多个正则正则符号的组合描述&#xff0c;可以使组成的正则表达式能够描述一类字符串。 在开发中&a…

.NET性能优化-使用结构体替代类

前言我们知道在C#和Java明显的一个区别就是C#可以自定义值类型&#xff0c;也就是今天的主角struct&#xff0c;我们有了更加方便的class为什么微软还加入了struct呢&#xff1f;这其实就是今天要谈到的一个优化性能的Tips使用结构体替代类。那么使用结构体替代类有什么好处呢&…

ISE14.7兼容性问题集锦

一、 关于win8和win10不兼容性解决办法 &#xff08;win7不会出现闪退的问题&#xff0c;按安装流程做完就可以直接使用了&#xff09; 在安装目录下&#xff0c;我这里是D:\ISE_14.7\14.7\ISE_DS\ISE\lib\nt64中找到libPortability.dll和libPortabilityNOSH.dll两个文件夹&…

幼儿园调查过程怎么写_深圳全托幼儿园哪个好 幼儿园寄宿怎么报名

陪孩子一起阅读的精髓不是认字和背诵&#xff0c;亲子阅读的那些事 亲子阅读是当代的养育新潮流&#xff0c;但它还有更可贵的一面。 脾气再大的妈妈&#xff0c;都有温柔可爱的时刻&#xff0c;就是陪伴孩子阅读的时刻&#xff0c;曾经有一位在我看来算不上温柔的妈妈&#xf…

ArcGIS实验教程——实验二:ArcGIS地理配准完整操作步骤

ArcGIS实验视频教程合集&#xff1a;《ArcGIS实验教程从入门到精通》&#xff08;附配套实验数据&#xff09; 目录 一、地理配准工具条简介 二、地理配准过程 1、加载数据&#xff08;点击下载&#xff09;提取码&#xff1a;v9y8 2、加载地理配准工具条 3、添加控制点 …

php基础教程 第二步 通俗易懂的学习变量、常量与数据类型

简介 变量、常量以及数据类型 在编程中&#xff0c;变量指一个存储值的一个盒子&#xff0c;或者说容器。例如一个箱子&#xff0c;用来放杂物&#xff0c;这个箱子就是一个容器&#xff0c;值就为杂物。容器可以分为很多类型&#xff0c;例如瓶子、被子、盒子等。值也有很多类…

可见光能量范围_JACS:游书力团队通过可见光促进的吲哚衍生物分子内去芳构化合成环丁烷稠合的四环吲哚螺环...

点击上方了解化学加VIP会员企业导读近日&#xff0c;中国科学院上海有机所游书力团队开发了一种可见光促进的吲哚衍生物分子内[22]环加成方法&#xff0c;可以极好的收率和立体选择性得到环丁烷稠合的四环吲哚螺环(Scheme 1&#xff0c;底部)。该成果近期发表在J. Am. Chem. So…

记将一个大型客户端应用项目迁移到 dotnet 6 的经验和决策

在经过了两年的准备&#xff0c;以及迁移了几个应用项目积累了让我有信心的经验之后&#xff0c;我最近在开始将团队里面最大的一个项目&#xff0c;从 .NET Framework 4.5 迁移到 .NET 6 上。这是一个从 2016 时开始开发&#xff0c;最多有 50 多位开发者参与&#xff0c;代码…

ArcGIS实验教程——实验一:ArcGIS软件的认识与使用

ArcGIS实验视频教程合集&#xff1a;《ArcGIS实验教程从入门到精通》&#xff08;附配套实验数据&#xff09; 实验目录 第一节 Esri简介 1.1 ESRI简介 1.2 Esri产品发展历程 第二节 ArcGIS简介 2.1 ArcGIS简介 2.2 ArcGIS产品体系 第三节 Desktop简介 3.1 Desktop简介…

10分钟学会vue滚动行为

滚动行为 什么是路由的滚动行为 当切换到新路由时&#xff0c;想要页面滚到顶部&#xff0c;或者是保持原先的滚动位置&#xff0c;就像重新加载页面那样 注意: 这个功能只在 HTML5 history 模式下可用。在这个模式下我们需要启动一个服务 我们用scrollBehavior 方法来做路由滚…

php基础教程 第三步 学习字符串及相关函数

字符串 上一节中我们学习了 php 变量、常量以及数据类型的一些概念。这一节中进一步学习数据类型中的字符串类型及其相关操作方法。 字符串指一串字符的合集。例如单个字符 a&#xff0c;单个字符 b&#xff0c;单个字符 c…这些 a、b、c 皆是字符&#xff1b;当把这些字符连…