摘要
最近更新时间:2020.08.20 (待更新实验部分)
本文类型:实践应用类(非知识讲解)
本文介绍selenium库和chrome浏览器实现自动抓取网页元素,并定位填写表单数据,可实现自动填写,省去大量人力。为方便使用selenium库以及方便处理运行中的错误,本文将selenium库进行一定的再封装,使读者了解selenium库后,就可快速上手编程。
一、本文知识点:1.安装selenium库,2.selenium库寻找元素的方式,3.selenium库的再封装
二、本文结构:1.先简略介绍知识点,2.按完整段的方式贴出复制后可直接运行的调试代码,方便读者调试贴出的每段代码
三、本文方法实现方式:以百度首页作为操控网页,以谷歌浏览器为实验平台,使用python+selenium进行网页操作。ps:会更新其他相应的抓取网页实验。
四、本文实验:1.
后台自动签到百度贴吧
,2.
后台QQ邮箱读取最新邮件
,等其他待更新实验(均提供详细代码及注释,本文末尾有对应链接)
提示:以下是本篇文章正文内容,下面案例可供参考
一、安装selenium库及相关文件
Selenium库是python用于爬虫网站的自动化工具,支持的浏览器包括Chrome、Firefox、Safari等主流界面浏览器,同时也支持多种操作系统如Windows、Linux、IOS、Android等。
1.安装selenium库
(1)点击win10的开始菜单,直接输入cmd后右键管理员方式运行
(2)若安装python时勾选了添加路径的选项,即可直接输入命令
pip install selenium
(若没有添加,建议卸载python后,重新安装并勾选添加路径。慎重选择该建议,因为需要重新安装之前的下载的库)
(3)在网络连通下等待完成,若提示timeout,则可尝试下面命令切换下载源,重新安装:
pip install selenium -i https://pypi.douban.com/simple
2.下载谷歌浏览器相关文件
本文使用的浏览器为谷歌浏览器,因此只介绍谷歌浏览器的爬虫方法,其他浏览器的方法类似。
(1)
点击下载谷歌浏览器
(2)安装谷歌浏览器后,查看谷歌浏览器的版本号。点击谷歌浏览器右上角的三个点,选择–
帮助
–
关于Google Chrome
–
查看版本号
。
如图,本文的版本号为
84.0.4147.125
(3)
点击下载谷歌浏览器驱动
打开下载驱动的页面,找到与版本号对应的驱动版本,本文的
84.0.4147.125
,因此如图寻找
84.0
开头的驱动,点击打开下载对应系统的驱动。然后将其解压到准备编写项目的文件夹。
不要将其放置python目录或者浏览器安装目录下,如果这样做,当移植到别的电脑时,会出现各种各样的BUG,根本原因是你电脑装了相应的库文件以及驱动,但移植的电脑未必安装。
二、selenium快速入门
1.定位元素的八种方式
(1)
id
(2)
name
(3)
xpath
(4)
link text
(5)
partial link text
(6)
tag name
(7)
class name
(8)
css selector
2. id方式
(1) 在selenium通过
id
定位一个元素:
find_element_by_id
以百度的页面为例,其百度一下输入框部分网页源代码如下:
.......
其中,
为输入框的网页代码,
为百度一下的网页代码
通过id查找元素的代码及注释如下:
import os
import sys
import time
from selenium import webdriver
##此方法获取的工作文件夹路径在py文件下或封装exe后运行都有效##
当前工作主路径 = os.path.dirname(os.path.realpath(sys.argv[0]))
##配置谷歌浏览器驱动路径##
谷歌驱动器驱动 = 当前工作主路径+"/"+"chromedriver.exe"
##初始化selenium控件##
浏览器驱动 = webdriver.Chrome(executable_path=谷歌驱动器驱动)
##打开链接,更换其他网址,请注意开头要带上http://##
浏览器驱动.get("http://www.baidu.com")
##通过id搜索清除搜索框内容##
浏览器驱动.find_element_by_id("kw").clear()
##通过id搜索输入搜索框内容##
浏览器驱动.find_element_by_id("kw").send_keys("python+selenium库 实现爬虫抓取网页数据内容并自动填表的解决方法并附已交付甲方实际稳定运行的代码")
##通过id搜索点击百度一下进行搜索##
浏览器驱动.find_element_by_id("su").click()
##保持5s时间
time.sleep(5)
###关闭退出浏览器
浏览器驱动.quit()
3. name方式
仍以百度输入框为例,在selenium通过
name
定位一个元素:
find_element_by_name
其代码及注释如下:
import os
import sys
import time
from selenium import webdriver
##此方法获取的工作文件夹路径在py文件下或封装exe后运行都有效##
当前工作主路径 = os.path.dirname(os.path.realpath(sys.argv[0]))
##配置谷歌浏览器驱动路径##
谷歌驱动器驱动 = 当前工作主路径+"/"+"chromedriver.exe"
##初始化selenium控件##
浏览器驱动 = webdriver.Chrome(executable_path=谷歌驱动器驱动)
##打开链接,更换其他网址,请注意开头要带上http://##
浏览器驱动.get("http://www.baidu.com")
##通过name搜索清除搜索框内容##
浏览器驱动.find_element_by_name("wd").clear()
##通过name搜索输入搜索框内容##
浏览器驱动.find_element_by_name("wd").send_keys("python+selenium库 实现爬虫抓取网页数据内容并自动填表的解决方法并附已交付甲方实际稳定运行的代码")
##通过id搜索点击百度一下进行搜索##
浏览器驱动.find_element_by_id("su").click()
##保持5s时间
time.sleep(5)
###关闭退出浏览器
浏览器驱动.quit()
4. xpath方式
仍以百度输入框为例,在selenium通过
xpath
定位一个元素:
find_element_by_xpath
。不过这种方法不适合于网页中位置会变动的表格元素,因为xpath方式指向的是固定行和列,无法检测行列内容的变化。
首先在谷歌浏览器中打开百度,在空白处
右键鼠标
,选择
检查(N)
这个选择,可以进入网页的开发者模式,如图所示。然后在百度输入框上
右键鼠标
,再次点击
检查(N)
选择,可以发现右侧代码框中自动选中的部分已经变成百度输入框的代码。最后,在右侧自动选中的代码段上
右键
–选择
copy
–选择
copy Xpath
,百度输入框的
xpath
为
//*[@id="kw"]
,百度一下的
xpath
为
//*[@id="su"]
接下来利用这个值进行百度搜索,代码及注释如下。
import os
import sys
import time
from selenium import webdriver
##此方法获取的工作文件夹路径在py文件下或封装exe后运行都有效##
当前工作主路径 = os.path.dirname(os.path.realpath(sys.argv[0]))
##配置谷歌浏览器驱动路径##
谷歌驱动器驱动 = 当前工作主路径+"/"+"chromedriver.exe"
##初始化selenium控件##
浏览器驱动 = webdriver.Chrome(executable_path=谷歌驱动器驱动)
##打开链接,更换其他网址,请注意开头要带上http://##
浏览器驱动.get("http://www.baidu.com")
##通过xpath搜索清除搜索框内容,注意单引号与双引号的混合使用##
浏览器驱动.find_element_by_xpath('//*[@id="kw"]').clear()
##通过xpath搜索输入搜索框内容,注意单引号与双引号的混合使用##
浏览器驱动.find_element_by_xpath('//*[@id="kw"]').send_keys("python+selenium库 实现爬虫抓取网页数据内容并自动填表的解决方法并附已交付甲方实际稳定运行的代码")
##通过xpath搜索点击百度一下进行搜索,注意单引号与双引号的混合使用##
浏览器驱动.find_element_by_xpath('//*[@id="su"]').click()
##保持5s时间
time.sleep(5)
###关闭退出浏览器
浏览器驱动.quit()
5. link text和partial link text方式
仍以百度首页中新闻元素为例,
通过
link text
定位一个元素:
find_element_by_link_text
通过
partial link text
定位一个元素:
find_element_by_partial_link_text
它们两个的区别在于:
link text
方式为元素text属性的全称,
partial link text
方式为元素text属性的部分,类似模糊搜索,如果网页元素有较多相似的text属性,建议不要使用
partial link text
方式。
百度首页中新闻部分的网页代码如下:
新闻
hao123
地图
视频
下面利用
link text
的方式点击进人新闻页面,代码及其注释如下所示:
import os
import sys
import time
from selenium import webdriver
##此方法获取的工作文件夹路径在py文件下或封装exe后运行都有效##
当前工作主路径 = os.path.dirname(os.path.realpath(sys.argv[0]))
##配置谷歌浏览器驱动路径##
谷歌驱动器驱动 = 当前工作主路径+"/"+"chromedriver.exe"
##初始化selenium控件##
浏览器驱动 = webdriver.Chrome(executable_path=谷歌驱动器驱动)
##打开链接,更换其他网址,请注意开头要带上http://##
浏览器驱动.get("http://www.baidu.com")
##通过link text搜索清除搜索框内容##
浏览器驱动.find_element_by_link_text('新闻').click()
##通过partial link text搜索清除搜索框内容,请注意实际运行时,选择其中一个##
##浏览器驱动.find_element_by_partial_link_text('新').click()
##保持5s时间
time.sleep(5)
###关闭退出浏览器
浏览器驱动.quit()
6. tag name和class name方式
这两种方式不推荐使用,因为在一个网页中
tag name
和
class name
重复度太高,不容易定位,因为本文也不做深入研究。
7. css selector方式
仍以百度输入框为例,在selenium通过
css selector
定位一个元素:
find_element_by_css_selector
。由上文可知,
为输入框的网页代码,
为百度一下的网页代码,那么以css selector方式进行元素搜索的代码及其注释如下:
import os
import sys
import time
from selenium import webdriver
##此方法获取的工作文件夹路径在py文件下或封装exe后运行都有效##
当前工作主路径 = os.path.dirname(os.path.realpath(sys.argv[0]))
##配置谷歌浏览器驱动路径##
谷歌驱动器驱动 = 当前工作主路径+"/"+"chromedriver.exe"
##初始化selenium控件##
浏览器驱动 = webdriver.Chrome(executable_path=谷歌驱动器驱动)
##打开链接,更换其他网址,请注意开头要带上http://##
浏览器驱动.get("http://www.baidu.com")
##通过xpath搜索清除搜索框内容,注意单引号与双引号的混合使用##
浏览器驱动.find_element_by_css_selector("input[id=\"kw\"]").clear()
##通过xpath搜索输入搜索框内容,注意单引号与双引号的混合使用##
浏览器驱动.find_element_by_css_selector("input[id=\"kw\"]").send_keys("python+selenium库 实现爬虫抓取网页数据内容并自动填表的解决方法并附已交付甲方实际稳定运行的代码")
##通过xpath搜索点击百度一下进行搜索,注意单引号与双引号的混合使用##
浏览器驱动.find_element_by_css_selector("input[type=\"submit\"]").click()
##保持5s时间
time.sleep(5)
###关闭退出浏览器
浏览器驱动.quit()
三、我的简单封装
在网站中寻找的元素大多属于键入值或者点击类元素,为了方便使用,将selenium库进一步封装,部分代码如下(还将更新,具体使用方法在项目实践代码及注释中可见):
(1)键入值类
def 网站元素值更改(self,元素名称,更改数值,方法):
元素出现 = False
while(元素出现 == False):
try:
if 方法 == "xpath":
self.浏览器驱动.find_element_by_xpath(元素名称).clear()
self.浏览器驱动.find_element_by_xpath(元素名称).send_keys(更改数值)
if 方法 == "name":
self.浏览器驱动.find_element_by_name(元素名称).clear()
self.浏览器驱动.find_element_by_name(元素名称).send_keys(更改数值)
元素出现 = True
except:
元素出现 = False
time.sleep(0.1)
(2)点击类
def Y网站元素值点击(self,元素名称,方法):
元素出现 = False
循环次数 = 0
while(元素出现 == False):
try:
if 方法 == "xpath":
self.浏览器驱动.find_element_by_xpath(元素名称).click()
if 方法 == "text":
self.浏览器驱动.find_element_by_link_text(元素名称).click()
元素出现 = True
except:
元素出现 = False
循环次数 = 循环次数+1
time.sleep(0.1)
四、实验