欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

一起学爬虫(Python) — 23 自动化详解2

程序员文章站 2022-06-23 09:59:33
上一篇: 一起学爬虫(Python) — 22 自动化详解主要部分: 一起学爬虫(Python) — 19 年轻人,进来学自动化如果小可爱是刚来的呢,不妨先点开上面的康一康,有好东西哦~继续深入Selenium前言浅出深入Selenium梅开二度の干饭前言各位小可爱,早上好鸭~我在早晨9点,听着说好不哭。然后喝了一杯红豆奶茶。接着,又做了几十个俯卧撑(10个),感觉又瘦了不少。啊,生活就是如此枯燥,却又惬意。其实我是很不想跑来更新的。但是呢,马上就是那个,什么…懂吧…所...

上一篇: 一起学爬虫(Python) — 22 自动化详解

主要部分: 一起学爬虫(Python) — 19 年轻人,进来学自动化

如果小可爱是刚来的呢,不妨先点开上面的康一康,有好东西哦~

前言

一起学爬虫(Python) — 23 自动化详解2
各位小可爱,早上好鸭~

一起学爬虫(Python) — 23 自动化详解2
我在早晨9点,听着说好不哭。

一起学爬虫(Python) — 23 自动化详解2
然后喝了一杯红豆奶茶。
一起学爬虫(Python) — 23 自动化详解2
接着,又做了几十个俯卧撑(10个),感觉又瘦了不少。

啊,生活就是如此枯燥,却又惬意。

其实我是很不想跑来更新的。

一起学爬虫(Python) — 23 自动化详解2
但是呢,马上就是那个,什么…

一起学爬虫(Python) — 23 自动化详解2

懂吧…

所以呢,这段时间还是要装装样子,多水几篇,万一弄了个小勋章啥的,对吧,嘿嘿。

一起学爬虫(Python) — 23 自动化详解2
一起学爬虫(Python) — 23 自动化详解2
像这三个呢,我想都不用想了,也许明年可以争一争吧,毕竟虽然一个月有了一千粉丝,但是白嫖的绝对有不少于950个哦,白嫖率高达95%!

泪目T-T

一起学爬虫(Python) — 23 自动化详解2
一起学爬虫(Python) — 23 自动化详解2
这两个呢,也不用想了,毕竟那么多白嫖的…

咳咳,不是阴阳怪气哦,毕竟才写了一个月嘛,要知足!

一起学爬虫(Python) — 23 自动化详解2
应该也不可以吧…

一起学爬虫(Python) — 23 自动化详解2
我找了又找,好像没有参与奖诶。

这么过分的吗???

来个谢谢参与奖也好啊,对吧。

一起学爬虫(Python) — 23 自动化详解2
咳咳,虽然说跟本站其他文章有深度,有内涵,有干货,而且很勤奋,不拖更,人又帅,说话又好听,重要的是有些还是妹纸,那就更不能比啦,也就是说我肯定肯定肯定是没希望的,但是但是但是还是,希望大家到时候可以投一投,求求啦…(卑微)

如果啊,如果说拿个前50吧,也不说前50了,就前20,或者前30,女装好吧,毕竟也是一千粉了嘛,虽然说这个一千粉水分很大吧,但是也有很多假粉丝跟我说想看女装,我是拒绝的,非常拒绝。

大家都知道我是猛男的鸭。

一起学爬虫(Python) — 23 自动化详解2
但是偶尔女装一下也是阔以的,当然前提是拿奖哈。

但是机会很小的啦,不太可能的啦,所以大家可能要失望啦~

水了好多字数哦…

看到这里如果你觉得,能看下去,就说明我的文笔还是阔以的,当然如果你已经看不下去了,也可以私信我,或者留言,对我进行教育。

大家有什么好的意见,想法都可以私信或者加qq群,要知道小泽是为大家服务的,前提当然是知道大家的需求啦,不要觉得博主就就很厉害呀,其实反而是更底下的,希望各位能,多多提意见,一起参与到这个一起学爬虫系列里面,大家一起进步,一起女装 奥利给!

一起学爬虫(Python) — 23 自动化详解2

浅出深入Selenium

昨天呢,我们讲到了click,也就是点击,当然如果你是直接看的这里的话,还是需要去前面的一篇看看。

还有就是,我们打开一个新窗口的话,想关闭就需要用到close()。

# 拿小本本记好这个方法,只需要改动一下url就可以了
driver.execute_script("window.open('https://www.baidu.com')")
# 想关闭新打开的页面
driver.close()

当然你也可以通过窗口句柄进行指定窗口的关闭,那么什么是窗口句柄呢?

举个例子,我们在学校的食堂,或者公司的食堂,或者工地的食堂,当然大多数人可能是最后者哈,打工人打工魂,我们要悄悄的打工,然后帮老板赚够所有钱!

当我们打饭的时候,每个人都有一个工号,或者学号,这个呢就是我们的窗口句柄,管理者可以通过这个窗口句柄,对我们进行卡的充值,扣费等等。

相对应的,电脑的每一个窗口也有她的窗口句柄,我们可以对指定窗口句柄的窗口进行一系列嘿嘿嘿的操作,放大放小鸭之类的。

浏览器里面的每个页面也是有窗口句柄的,所以呢,我们也可以通过找到所有页面的窗口句柄,然后对其进行羞辱 操作。

# 获取当前窗口句柄(返回的是一个列表)
handles = driver.window_handles

不要忘了,driver是我们自己设置的,也可以起别的名字!

当然,我们也可以或者当前页面的句柄:

# 获得当前页面句柄
now_handle = driver.current_window_handle

那么,上面的这些有什么用呢?

先知道一件事,窗口句柄只是一个窗口的句柄哦,这个窗口里面的内容是不影响这个句柄的吧。

还有就是,只靠打开第几个页面,长久也不是事对吧,因为有可能突然就蹦出来一个广告页面鸭什么的,那我们如果可以打开指定页面的话,是不是就非常方便的,来回摩擦!

那我们每打开一个我们后面需要继续操作的面,就把她的窗口句柄存一下,留到后面用,不就ok了。

那就是说,我们还需要一个可以打开指定窗口句柄的命令!

# 切换到窗口句柄为now_handle的窗口
driver.switch_to.window(now_handle)

当然,上面的now_handle也是我们自己设置的。

当然也会有时候莫名其妙就弹到别的窗口了,你可能保存的不是你想要的那个窗口的句柄,这个时候我们就需要对我们的网址进行一个判断吧,如果这个网址确定是我们需要的,那再进行一个窗口句柄的保存,就更加严谨了,对吧。

# 取的目前的url
now_url = driver.current_url
# 判断是否登陆成功
if now_url == 'https://www.csdn.net/':
    print('登陆成功!')
    sleep(1)
    break
else:
    print('登陆失败!')

上面这样写是因为,如果我们对csdn进行一个模拟登陆的话,登陆成功后是会跳转到 https://www.csdn.net 这个网站的,所以小泽就对这个网站进行了一个判断,如果是就说明我们登录成功了,如果不是就说明密码错了,或者需要进行一个手机号的验证。

当然功能是要自己写的,你也可以改成别的。

user_number = input('输入你滴账号:')
pass_word = input('输入你滴密码:')
# 找到账号框
input_num = driver.find_element_by_xpath('//*[@id="all"]')
# 找到密码框
password = driver.find_element_by_id('password-number')
# 清空输入框
input_num.clear()
password.clear()
# 把账号放进账号框
input_num.send_keys(user_number)
# 把密码放进密码框
password.send_keys(pass_word)

像上面的,find_element_by_xpath还有find_element_by_id等等,有很多查找的方式,是根据我们页面的标签进行定位的吧,也就是元素嘛,如果你需要查找的标签是有很多的,比如li标签,你需要全部拿过来,那就用find_elements_by_tag_name()

里面放的就是标签的名字,input鸭,li鸭,div鸭之类的,当然你也可以用xpath去定位标签对吧,很多选择,如果一种不行,就换另一种嘛~

至于clear()呢,是对数据的一个清除,就比如说我们需要进行反复的登录,因为有可能会输入错误的密码嘛,这个时候就需要把之前输的密码给清除掉。

还有就是有一些网站的分页,第一页第二页第三页…第几页这样的,是会有一个输入框,里面输的是数字嘛,这个时候也是需要先进行一个清除,然后再进行输入吧。

然后clear有的时候也会无效,比如说有的标签需要先点击才能进行数据的删除,就是有的框框会有默认的一句话嘛,这个时候我们就需要对框框进行模拟的双击,为什么是双击呢,选中数据呗。

from selenium.webdriver.common.action_chains import ActionChains

# 找到账号框
input_num = driver.find_element_by_xpath('//*[@id="all"]')

# 双击,pia pia
ActionChains(driver).double_click(input_num).perform()

# 进行输入
input_num.send_keys()

这里也许你会问,clear呢???

你是不是sha,我们都双击了,直接输入不就完事了。

不要忘了,我们是自动化,不是requests这种找接口的请求。

自动化,就是类似于脚本,还是要明面上干事的。

一起学爬虫(Python) — 23 自动化详解2
上面只是一种如果clear行不通的时候,我们的另外一种处理方法。

至于send_keys呢,就是往指定的框框里放东西,里面放的是字符串哦。

你以为只能放字符串嘛,从某种意义上来说确实是的哦,但是也是可以上传东西的。

就比如我们需要上传头像,也是用到send_keys,只不过里面放的是图片的绝对路径,注意注意,是绝对路径!

一起学爬虫(Python) — 23 自动化详解2
这里感谢一下我的合作伙伴,百度兄弟。

当然如果你懒得写,也可以用下面的方式进行一个绝对路径的获取:

import os
# 获取绝对路径
path = os.path.abspath('./4399.html')
print(path)

返回的是这个东西哦:

一起学爬虫(Python) — 23 自动化详解2
当然如果你写这种 \ 啊,在python报错的话,就在斜杠的前面再加一个\。

基础类的,不解释,高冷。

一起学爬虫(Python) — 23 自动化详解2

# 退出调试
driver.quit()

看了下,基本19天那一篇牵扯到的代码都讲了一遍,就剩个退出调试,不多bb了吧,hh

当然如果你想让浏览器不显示的话,就是无可视化界面嘛,可以加上下面的代码:

# 实现无可视化界面
from selenium.webdriver.chrome.options import Options
# 实现无可视化界面的操作
options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
# 这里指定自己的谷歌引擎目录,在后面加个options=
driver = webdriver.Chrome(executable_path='./chromedriver.exe',options=options)

我们只需要在初始化的时候加一个options=的参数就阔以了。

当然你可能还需要对浏览器进行一个最大化…

# 最大化
driver.maximize_window()

这里教大家一个高级的写法,来获取当前浏览器的宽和高!

# 获取当前窗口大小,返回的是字典类型
width,height = [driver.get_window_size()[key] for key in driver.get_window_size()]
# 打印浏览器的宽和高
print("当前浏览器的宽:", width)
print("当前浏览器的高:", height)

先看中括号里面的!

先看这句:for key in driver.get_window_size()

先说好哦,driver.get_window_size()返回的是一个字典的类型,里面是这样的:

一起学爬虫(Python) — 23 自动化详解2
既然说python是比较高效的语言嘛,那就用高效的方法喽。

for key,就是遍历字典的每一个key值哦,比如说第一个就是width,第二是height。

当然这个key是我们自己起的名字,你也可以自己改!

后面这句就是一个循环嘛,只不过不需要进行到下一行了。

再看前面!

driver.get_window_size()[key]

这个的意思就是说,返回的字典里每一个键对应的值嘛,既然后面是一个循环,返回的肯定是多个键,我们得到也就是多个值!

这里如果我们不用两个变量来接的话,那返回的就是一个列表了嘛,需要循环多少次,就返回一个长度为多少的列表嘛。

但是如果使用变量接一下的话,就可以直接给变量赋值,因为我们已经提前知道返回的字典是有两个键的,所以直接用width和height接一下,这里的两个变量也是我们自己设的!

这样的话原本要写三四行,甚至四五行的代码,一行就ok啦!

是不是很方便鸭。

怎么感觉像是老营销号了…

一起学爬虫(Python) — 23 自动化详解2
既然知道了宽和高,那么如果我们要改变浏览器的宽和高,要怎么办呢…

# 设置浏览器的大小
driver.set_window_size(width=500, height=500)

就这么办!

也有可能说你设置的宽度,和你得到的宽度是不一样的,这是为什么呢?

因为浏览器的边框也是有宽度的啦~

所以如果以后需要根据坐标来进行操作,如果数据不够准确可以试试带上这个边框的宽度!

好啦,今天就码到这里好了,水的也差不多了,还是希望大家能学到一点东西的。

另外,关于那个点赞的事…还有到时候投票的事…拜托啦~(试图py交易)

梅开二度の干饭

干饭了,干饭了!
一起学爬虫(Python) — 23 自动化详解2
如果你有好的建议或者想法,都可以私信跟小泽说哦~

886!

本文地址:https://blog.csdn.net/BcXbHello/article/details/111941413