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;发现 连…

IP地址转化为数字,charindex ,SUBSTRING

SET NOCOUNT ON; declare I_PCity table(IPStart nvarchar(255), Area nvarchar(255),CityID int,IPID int )declare IPStart nvarchar(255),diana int, --存放点dianb int,dianc int,liea bigint, -- 存放列 lieb bigint,liec bigint,lied bigint,intlon bigin…

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

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

剑指offer之数组中的逆序对

1 问题 在数组中的两个数字&#xff0c;如果前面一个数字大于后面的数字&#xff0c;则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007。 比如数列{6&#xff0c;202&#xff0c;100&#xf…

【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的项目文件组成。本节将会…

ArrayList实现

ArrayList实现 数组实现父类:AbstractList接口:List&#xff0c;RandomAccess&#xff0c;Cloneable&#xff0c;Serializable字段://默认容量private static final int DEFAULT_CAPACITY 10;//空的数组,构造函数参数为0和trim中使用,构造参数给0的人绝对会被打死,每放一个元素…

oracle数据本机自动备份

1、创建三个文件 exp.list 内容&#xff1a;oracle数据库的用户名和密码 name pwd exp.log 主要用于存储在自动备份数据库时的日志信息 exp.sh #!/bin/sh#找到数据库的路径 export ORACLE_BASE/u01/app/oracle export ORACLE_HOME$ORACLE_BASE/product/10.2.0/db_1 export …

Chrome浏览器切换到之前打开的标签页会重新加载

这是谷歌的一种策略。当系统内存不足时&#xff0c;系统会自动从内存中舍弃标签页 在地址栏输入chrome://flags/#automatic-tab-discarding&#xff0c;设置为停用即可。转载于:https://www.cnblogs.com/freefish12/p/5435585.html

数据结构之判断一棵树是不是满二叉树

1 满二叉树 除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。 2 分析 我们知道满二叉树是三…

【Pix4d精品教程】Pix4DMapper 4.4.10/4.4.12/4.5.6经典手把手图文安装教程(附安装包下载)

Pix4Dmapper系列文章合集: 打开Pix4DMapper时提示Pix4DMapper.exe已停止工作的完全解决办法安装Pix4Dmapper时提示“无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-l1-1-0.dll”完全解决办法Pix4Dmapper完整航测内业操作流程手把手图文教程Pix4Dmapper是一款目前比…

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实现同样存在一些缺…

【Solidity】3.类型 - 深入理解Solidity

索引 【Solidity】1.一个Solidity源文件的布局【Solidity】2.合约的结构体 【Solidity】3.类型 【Solidity】4.单位和全局可变量 【Solidity】5.表达式和控制结构 【Solidity】6. 合约 【Solidity】7. 部件 【Solidity】8. 杂项 类型 Solidity是一种静态类型的语言&#xff0c;…

etree解析xml_在python中使用Etree解析XML配置文件

请帮助我使用lxml etree解析以下原型的配置文件。我尝试了for event&#xff0c;element和tostring。不幸的是&#xff0c;我不需要文本&#xff0c;而是需要对于给定的属性。在我从这段代码开始&#xff0c;但是在搜索属性时遇到一个键错误&#xff0c;因为它从一开始就扫描^{…

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

代码&#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…

【CASS精品教程】CASS7.1 道路设计参数文件打开无响应,提示roadpara解决办法,权威解决办法汇总

目录 第一种方法:Win+R 第二种方法:选择打开方式 第三种方法:cmd 在用CASS7.1 软件进行断面法土方量计算,在生成断面图后,需要进行道路设计参数文件的设计,打开断面设计参数文件的时候,无响应,提示roadpara,如下所示:

数据结构之判断一棵树是不是完全二叉树

1 完全二叉树 完全二叉树是由 满二叉树 而引出来的。对于深度为K的&#xff0c;有n个结点的二叉树&#xff0c;当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 如下就是完全二叉树 12 3 4 5 …