Python利用selenium+Beautifulsoup破解动态class/id并提取相应文本的方法

最近小白掌柜接了领导一项任务,要全程自动化的注册一个网站并登录网站后逗留一段时间再离开,起初觉得这个应该难度不会太大,就欣然接受了。谁知,拿到具体需求后一分析纳尼??在这里插入图片描述这个里面其实有好多难点,but本着我就是进阶的小白在这里插入图片描述还是决定挑战下去!今天先不说其他的难点,只说关于如何提取动态class/id里面的文本(就是注册后网站一般都会给邮箱发一个验证码,要提取的就是它在这里插入图片描述)的问题!!!

进入正题,因为项目领导给的验证邮箱是雅虎的,所以我就按照之前的方法进行自动登录并查看邮件再提取验证码这个思路。自动登录没有问题,查看邮件也没有问题,重点来了!!!当打开邮件到提取验证码标签的时候发现无法定位的问题!因为每刷新一次页面,验证码前面p标签的class属性值就变化一次。。。然后细看这段HTML代码,发现他是字母+数字的组合形式,而且不止是验证码这里是动态class,连上面的父元素都是动态的id。。。:在这里插入图片描述
顿时觉得雅虎的技术人员此刻是这样的表情在这里插入图片描述
但是这怎么能难倒我们这样的技术宅,马上谷歌起来,经过一番查找,终于让我找到了解决的办法,感谢这位大佬的指点 。解决动态id/class有四种方法:
在这里插入图片描述
发现雅虎邮件这里不适合第一种方法,第二种貌似可以,第三种不稳定,第四种对浏览器的支持情况不一样;所以综上就选择了第二种:使用相对关系定位。回到雅虎邮件的页面,发现就算是使用相对关系来定位好像也不太可行在这里,因为验证码的父元素也是动态id,父元素的父元素也是在这里插入图片描述。。。
在这里插入图片描述
so,如何解决呢???于是小白掌柜又再去看了一下大佬的另一篇对父节点跟子节点定位的详解的文章,突然看到这里的:
在这里插入图片描述
灵光一闪,nth-child?咦,何不找一下p标签总共有多少个,再看含有验证码的p标签是第几个。为了验证这个猜想,小白掌柜又回到雅虎邮件这个页面,打开F12,并按下Ctrl+F来查找p标签,如图:
p标签总数
幸运的是,整个页面居然只有7个p标签,而我要提取的含有验证码的p标签在第四个:
在这里插入图片描述
因此决定采用selenium+Beautifulsoup的方法来提取这个验证码文本,具体的代码如下:

# -*- coding: utf-8 -*-
from selenium import webdriver
import time
import bs4
from bs4 import BeautifulSoup

driver = webdriver.Chrome()
driver.maximize_window()
#将浏览器最大化
driver.get('https://login.yahoo.com/?.src=ym&.lang=en-US&.intl=us&authMechanism=primary&done=https%3A%2F%2Fmail.yahoo.com%2Fd&eid=100&add=1')
time.sleep(4)
driver.find_element_by_id('login-username').send_keys('your yahoo email')
#输入你的邮箱
driver.find_element_by_id('login-signin').click()
time.sleep(3)
driver.find_element_by_css_selector('input#login-passwd').send_keys('your password')
#输入你的密码
driver.find_element_by_id('login-signin').click()
time.sleep(5)
driver.find_element_by_css_selector('span.o_h.G_e.J_x.en_N').click()
#点击验证码邮件
time.sleep(4)
soup = BeautifulSoup(driver.page_source, "html.parser")
#解析打开的邮件页面
p_selectors = soup.find_all('p')[4]
#定位到验证码的p标签,是第四个
code = p_selectors.text
print(code)
driver.quit()

至此我们再运行一下,就可以成功提取到邮件里面的验证码文本了!!!
在这里插入图片描述
这里要感谢这位大佬的文章所带来的思路,当然这只是这次项目中的一个难点,其他的等做完再一一记录下来。

参考:
Python selenium —— 父子、兄弟、相邻节点定位方式详解
Python selenium —— 动态id、class怎么定位

发布了30 篇原创文章 · 获赞 29 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_41013322/article/details/89641205
今日推荐