Python爬虫【selenium的基础使用】

一.本文背景及概要

笔者在Python爬虫的学习过程中接触selenium,惊觉此包的强大之处,便对学习的知识做个记录,方便日后需要时查看,同时也和读者分享。文中表述如有错误,敬请指正,感激不尽。

本文主要是对selenium的概要和一些基础的用法。特此说明:笔者学习的资料中selenium版本较旧,在使用途中有些方法和参数已发生改变,笔者将结合查询到的新方法和参数来叙述。

selenium版本:4.11.2

二.初始selenium

这里抛出两个问题:selenium和爬虫有什么关系?其一,大家知道,在我们爬取某些网页的时候,它的数据并不是静态的,而是通过动态加载出来的,如使用Ajax等。这时候我们如要爬取这些动态的数据就需要手动去抓包,这种操作不仅费时费力,而且还不一定能找到。这时候,就该selenium大显身手了。它可以便捷地获取到网站中动态加载的数据,用简洁的代码便可达到我们的要求。其二,我们还可以使用selenium轻松地实现模拟登录。说到这,那么selenium到底是什么?它是一个基于浏览器自动化的模块。

OK,让我们操作起来。首先去下载selenium

pip install selenium

然后去下载一个浏览器驱动器,我这里用edge作例。

查看到自己的edge的版本,我的是116.0.1938.54。接着去Microsoft Edge WebDriver - Microsoft Edge Developer下载对应自己版本的驱动器,如果没有一样的版本号就下载比自己浏览器前面一点点的驱动版本也可以。解压之后将其复制到我们项目目录中(这里只是一种方式,可以放很多地方,本文选择项目中)

 479333110a214f639bfae89c1b64d812.png

现在所有的准备工作都已就绪,selenium,启动!!!

三.selenium的简单使用

 废话少说,直接上代码

from selenium import webdriver
from selenium.webdriver.edge.service import Service
from time import sleep
# 无头浏览器
from selenium.webdriver.edge.options import Options
# 规避检测
from selenium.webdriver import EdgeOptions


# 为了运行不突兀(无头浏览器)
edge_options = Options()
edge_options.add_argument("--headless")
edge_options.add_argument("--disable-gpu")

# 为了不被网站检测出以致请求失败(规避检测)
option = EdgeOptions()
option.add_experimental_option("excludeSwitches", ["enable-automation"])

# 创建对象
s = Service("./msedgedriver.exe")
edge = webdriver.Edge(service=s, options=option)

# 发送请求
edge.get(url="https://qzone.qq.com/")

# 定位到子界面
edge.switch_to.frame("login_frame")

# 定位标签
a_tag = edge.find_element("id", "switcher_plogin")
a_tag.click()

sleep(1)

# 定位账号和密码标签
username_tag = edge.find_element("id", "u")
password_tag = edge.find_element("id", "p")

sleep(1)

# 输入账号和密码
username_tag.send_keys("******")
password_tag.send_keys("******")

sleep(1)

# 定位登录标签
sub_tag = edge.find_element("id", "login_button")
sub_tag.click()

sleep(10)

 接下来逐一讲解,前俩坨代码是为了实现无头浏览器和规避检测的。至于什么是无头浏览器,当你没有这串代码来执行程序,它就会弹出一个框来执行。但是有了这串代码,就会表现的像是打开了自己电脑上的浏览器来执行。说人话就是加了感觉丝滑一些,没那么突兀。而规避检测很好理解,一些网站有这种测试,一旦发现我们是selenium,直接闭门不见,让我们请求失败。而这串代码就是伪装我们的利器。各位要用时直接来这复制粘贴即可。

然后就该创建对象。这里创建对象和旧版不同,先是创建一个Service对象,里面给上我们放在项目里驱动器的路径。之后再创建浏览器对象,注意,这里你是什么浏览器就webdriver.xxx,这里以edge举例。里面参数service给刚刚创建的Service对象,如果写了规避代码就把options给创建的option。注意,导包的时候一定注意自己是什么浏览器,把浏览器换了。

往后走就是基本操作了,和requests有着异曲同工之妙的.get,当然要发送post请求就是.post。里面给上想要访问的地址。请求成功后,最基本的就是获取页面源码,在刚刚提到过,selenium可以便捷地获取页面的动态加载的数据,这里只需要edge.page_source就可以拿到页面源码,不用去考虑Ajax等繁琐的过程(代码中并未展现)。拿到页面源码后自然就可以去创建etree对象,去拿到我们想要的数据了。

上面的代码做的是模拟登录,故并没有去创建etree对象爬取数据。做模拟登录需要先定位到网页当中我们需要输入数据的标签,而一般登录页面需要我们输入账号密码的地方都是一个iframe子界面。所以这时就需要去定位到子界面,否则就会在定位标签的时候出错。

.switch_to.frame("login_frame")

而此方法就可以帮助我们成功定位子界面,里面的参数是页面源代码中iframe标签的id。

定位成功之后,就去抓包需要输入账号密码的标签

.find_element("id", "u")

这里使用此方法,两个参数分别是根据什么属性和属性是什么,比如这里就是根据id是u来定位这个标签。

成功定位到我们需要的标签就开始交互

.send_keys("******")

这个方法是往里面填数据,上面整个代码是模拟QQ空间登录,我自然是不可能把账号密码写出来故用******代替。填好账号密码后,再次如法炮制定位到提交的标签

.click()

然后使用此方法模拟点击,就登录成功了。

在此说明一点,代码中sleep函数只是为了程序执行起来效果更好,并无实际用处。

 

这里,再补充一些上面没提到但常用的一些基础用法。

如果你想在请求的页面执行一些js代码,可以使用

.excute_script("js代码")

来实现一些比如滑动页面等操作。

如果你想前进或者后退页面,可以使用

# 后退
.back()
# 前进
.forward()

新版本的selenium在执行完程序后会自动关闭浏览器,所以.quit()方法就不需要了。

 

四.动作链的使用

如果我们想让selenium模拟我们在浏览器上的一些点击拖拽操作,就需要用动作链来实现。

首先来导包

from selenium.webdriver import ActionChains

然后实例化一个动作链对象

action = ActionChains(edge)

这里的edge是已经发送请求后的浏览器对象了,这很好理解,如果连页面是什么都不知道怎么去进行操作呢?

这里进行一些简单的操作,比如我们想让鼠标点击长按一个东西,就需要先定位到这个东西的标签

div = edge.find_element("id", "xxx")

然后让动作链去操作

action.click_and_hold(div)

这样就长按且点击此标签了。然后便是拖动

action.move_by_offset(x, y).perform()

这里x是水平方向移动的距离,y是竖直方向移动的距离,单位都是像素(px)。.perform()方法是让动作链立即执行。

使用完动作链后,再通过

action.release()

来释放动作链对象。

 

五.通过selenium和pillow实现有验证码的登录

因为验证码每次刷新后都不一样,所以单纯通过获取验证码<img>标签中的src地址是不行的。会导致页面的验证码和我们访问src地址获取到的验证码不一致的情况。所以我们做如下方法考虑,对每一次访问的页面进行一次截图,然后再从这个整个页面截图中获取验证码的图片,之后再由专业解码平台返回需要输入的数据,最后登陆成功。

这里将主要方法展现。

获取当前页面截图并保存

edge.save_screenshot("name.png")

参数给你想取的名字,后缀给png或者jpg或者其他都行。

接着我们定位到验证码的标签赋给变量img_ele,之后得到验证码图片左上角的坐标

location = img_ele.location

再获取验证码标签对应的长和宽

# 宽
width = (img_ele.size)["width"]
# 高
height = (img_ele.size)["height"]

然后确定验证码图片左上角和右下角的坐标

rangle = (location["x"], location["y"], location["x"]+width, location["y"]+height)

使用pillow包来操作

创建Image对象

i = Image.open("./name.png")

开始裁剪

# crop根据指定区域进行图片裁剪
frame = i.crop(rangle)
frame.save("code.png")

裁剪下来的验证码图片保存为"code.png",同样,想取什么名字自己取。

之后便是提交验证码图片给平台,然后获取要输入的数据。这里不是本文重点故不展开叙述。注意:有些验证码是输入一些东西,而有些是点击一些图片。点击的操作可不要忘了动作链哟。

验证码输入正确之后就完成登录了。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还有糕手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值