一起学爬虫(Python) — 23 自动化详解2
主要部分: 一起学爬虫(Python) — 19 年轻人,进来学自动化
如果小可爱是刚来的呢,不妨先点开上面的康一康,有好东西哦~
继续深入Selenium
前言
各位小可爱,早上好鸭~
我在早晨9点,听着说好不哭。
然后喝了一杯红豆奶茶。
接着,又做了几十个俯卧撑(10个),感觉又瘦了不少。
啊,生活就是如此枯燥,却又惬意。
其实我是很不想跑来更新的。
但是呢,马上就是那个,什么…
懂吧…
所以呢,这段时间还是要装装样子,多水几篇,万一弄了个小勋章啥的,对吧,嘿嘿。
像这三个呢,我想都不用想了,也许明年可以争一争吧,毕竟虽然一个月有了一千粉丝,但是白嫖的绝对有不少于950个哦,白嫖率高达95%!
泪目T-T
这两个呢,也不用想了,毕竟那么多白嫖的…
咳咳,不是阴阳怪气哦,毕竟才写了一个月嘛,要知足!
应该也不可以吧…
我找了又找,好像没有参与奖诶。
这么过分的吗???
来个谢谢参与奖也好啊,对吧。
咳咳,虽然说跟本站其他文章有深度,有内涵,有干货,而且很勤奋,不拖更,人又帅,说话又好听,重要的是有些还是妹纸,那就更不能比啦,也就是说我肯定肯定肯定是没希望的,但是但是但是还是,希望大家到时候可以投一投,求求啦…(卑微)
如果啊,如果说拿个前50吧,也不说前50了,就前20,或者前30,女装好吧,毕竟也是一千粉了嘛,虽然说这个一千粉水分很大吧,但是也有很多假粉丝跟我说想看女装,我是拒绝的,非常拒绝。
大家都知道我是猛男的鸭。
但是偶尔女装一下也是阔以的,当然前提是拿奖哈。
但是机会很小的啦,不太可能的啦,所以大家可能要失望啦~
水了好多字数哦…
看到这里如果你觉得,能看下去,就说明我的文笔还是阔以的,当然如果你已经看不下去了,也可以私信我,或者留言,对我进行教育。
大家有什么好的意见,想法都可以私信或者加qq群,要知道小泽是为大家服务的,前提当然是知道大家的需求啦,不要觉得博主就就很厉害呀,其实反而是更底下的,希望各位能,多多提意见,一起参与到这个一起学爬虫系列里面,大家一起进步,一起女装 奥利给!
浅出深入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这种找接口的请求。
自动化,就是类似于脚本,还是要明面上干事的。
上面只是一种如果clear行不通的时候,我们的另外一种处理方法。
至于send_keys呢,就是往指定的框框里放东西,里面放的是字符串哦。
你以为只能放字符串嘛,从某种意义上来说确实是的哦,但是也是可以上传东西的。
就比如我们需要上传头像,也是用到send_keys,只不过里面放的是图片的绝对路径,注意注意,是绝对路径!
这里感谢一下我的合作伙伴,百度兄弟。
当然如果你懒得写,也可以用下面的方式进行一个绝对路径的获取:
import os
# 获取绝对路径
path = os.path.abspath('./4399.html')
print(path)
返回的是这个东西哦:
当然如果你写这种 \ 啊,在python报错的话,就在斜杠的前面再加一个\。
基础类的,不解释,高冷。
# 退出调试
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是比较高效的语言嘛,那就用高效的方法喽。
for key,就是遍历字典的每一个key值哦,比如说第一个就是width,第二是height。
当然这个key是我们自己起的名字,你也可以自己改!
后面这句就是一个循环嘛,只不过不需要进行到下一行了。
再看前面!
driver.get_window_size()[key]
这个的意思就是说,返回的字典里每一个键对应的值嘛,既然后面是一个循环,返回的肯定是多个键,我们得到也就是多个值!
这里如果我们不用两个变量来接的话,那返回的就是一个列表了嘛,需要循环多少次,就返回一个长度为多少的列表嘛。
但是如果使用变量接一下的话,就可以直接给变量赋值,因为我们已经提前知道返回的字典是有两个键的,所以直接用width和height接一下,这里的两个变量也是我们自己设的!
这样的话原本要写三四行,甚至四五行的代码,一行就ok啦!
是不是很方便鸭。
怎么感觉像是老营销号了…
既然知道了宽和高,那么如果我们要改变浏览器的宽和高,要怎么办呢…
# 设置浏览器的大小
driver.set_window_size(width=500, height=500)
就这么办!
也有可能说你设置的宽度,和你得到的宽度是不一样的,这是为什么呢?
因为浏览器的边框也是有宽度的啦~
所以如果以后需要根据坐标来进行操作,如果数据不够准确可以试试带上这个边框的宽度!
好啦,今天就码到这里好了,水的也差不多了,还是希望大家能学到一点东西的。
另外,关于那个点赞的事…还有到时候投票的事…拜托啦~(试图py交易)
梅开二度の干饭
干饭了,干饭了!
如果你有好的建议或者想法,都可以私信跟小泽说哦~
886!
本文地址:https://blog.csdn.net/BcXbHello/article/details/111941413