你要偷偷的学Python,然后惊呆所有人(第十二天)
Posted python阿喵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你要偷偷的学Python,然后惊呆所有人(第十二天)相关的知识,希望对你有一定的参考价值。
标题无意冒犯,就是觉得这个广告挺好玩的
文章目录
- 前言
- 欢迎来到我们的圈子
- 先上一段代码,云淡风轻
- 代码解释
- 第一个坑:find_element_name
- 第二个坑: switch_to_frame()
- cookies绕过登录验证,绕进了荒漠
- 迎来转机
- 成功路前的磕磕碰碰
前言
前期回顾:你要偷偷学Python(第十一天)
上一篇啊,上一篇说这一篇要带大家玩selenium,那自然是没错的。不过这一篇会不一样一点,这一篇会持续更新。
插播一条推送:(如果是小白的话,可以看一下下面这一段)
欢迎来到我们的圈子
本系列文默认各位有一定的C或C++基础,因为我是学了点C++的皮毛之后入手的Python。
本系列文默认各位会百度,学习‘模块’这个模块的话,还是建议大家有自己的编辑器和编译器的,上一篇已经给大家做了推荐啦?
然后呢,本系列的目录嘛,说实话我个人比较倾向于那两本 Primer Plus,所以就跟着它们的目录结构吧。
本系列也会着重培养各位的自主动手能力,毕竟我不可能把所有知识点都给你讲到,所以自己解决需求的能力就尤为重要,所以我在文中埋得坑请不要把它们看成坑,那是我留给你们的锻炼机会,请各显神通,自行解决。
1234567
先上一段代码,云淡风轻
# 本地Chrome浏览器设置方法
from selenium import webdriver #操作浏览器所需的包
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC #Xpath导航所需的包
import time #延时所需的包
from selenium.webdriver.chrome.options import Options
class golden_data:
def __init__(self):
options = Options()
#chrome_options.add_argument(‘--no-sandbox‘) # 解决DevToolsActivePort文件不存在的报错
#options.add_argument(‘--disable-gpu‘) # 谷歌文档提到需要加上这个属性来规避bug
#options.add_argument(‘blink-settings=imagesEnabled=false‘) # 不加载图片, 提升速度
#options.add_argument(‘--headless‘) # 浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
self.driver = webdriver.Chrome(options=options,executable_path="D:/Python3.9/chromedriver.exe") # 获取谷歌浏览器控制句柄
self.driver.get(‘https://jinshuju.net/login‘) # 打开金数据登录页面
self.wait = WebDriverWait(self.driver, 10) # Xpath导航
time.sleep(2)
#登录金数据
def login_data(self):
# 往账户栏写入内容
name_input = self.wait.until(EC.presence_of_element_located((By.XPATH, ‘//*[@id="auth_key"]‘)))
name_input.clear()
name_input.send_keys(‘18039027069‘) # 在这写入你的姓名
time.sleep(2)
# 点击“下一步”
next_step = self.wait.until(EC.presence_of_element_located((By.XPATH, ‘//*[@id="login_form"]/div/div[3]/button‘)))
next_step.click()
time.sleep(2)
# 往密码栏输入内容
pwd_input = self.wait.until(EC.presence_of_element_located((By.XPATH, ‘//*[@id="password"]‘)))
pwd_input.clear()
pwd_input.send_keys(‘123456.sp‘) # 在这写入你的姓名
time.sleep(2)
# 点击登录
login_click = self.wait.until(EC.presence_of_element_located((By.XPATH, ‘//*[@id="login_form"]/div/div[4]/button‘)))
login_click.click()
time.sleep(2)
#创建表单
#def create_table(self):
#收集表单数据
def collect_data(self):
#点击第一个问卷
first_block = self.wait.until(EC.presence_of_element_located((By.XPATH, ‘//*[@id="5fa54cff61936cdee3121fa5"]/div/a‘)))
first_block.click()
time.sleep(2)
#点击‘数据’
table_click = self.wait.until(EC.presence_of_element_located((By.XPATH, ‘//*[@id="entries_nav"]‘)))
table_click.click()
time.sleep(2)
#数据导出
data_out = self.wait.until(EC.presence_of_element_located((By.XPATH, ‘/html/body/div[3]/div[1]/div[3]/div/div[2]/table/tbody/tr/td[15]‘)))
data_out.click()
time.sleep(60) #这里的等待时间有点不好控制
#数据预下载
data_fore_download = self.wait.until(EC.presence_of_element_located((By.XPATH, ‘//*[@id="export_job_modal"]/div/div/div[3]/div/a[1]‘)))
data_fore_download.click()
time.sleep(10)
#数据下载
data_download = self.wait.until(EC.presence_of_element_located((By.XPATH, ‘/html/body/div[3]/div[1]/div[3]/div/div[2]/table/tbody/tr/td[15]/table/tbody/tr/td/div[1]/span[2]/a[1]‘)))
data_download.click()
self.driver.close()
test = golden_data()
test.login_data()
test.collect_data()
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
别喷,我知道代码健壮性不行,也知道没有什么高可用性。但是这只是我作为一个新手一天的成果而已,又不是学不会,后面慢慢就补上了。
代码解释
还记得多少就解释多少吧。
第一个坑:find_element_name
最开始的时候,我的代码并不是像上面那套写的,是这类的:
···
name_in = driver.find_element_by_name(‘···‘)
teacher.send_keys(‘····‘)
pwd_in = driver.find_element_by_name(‘···‘)
assistant.send_keys(‘····‘)
time.sleep(1)
button = driver.find_element_by_class_name(‘···‘)
time.sleep(1)
button.click()
time.sleep(1)
driver.close()
1234567891011
好家伙,报什么错呢?
NoSuchFrameException: Message: no such frame
好家伙,我虽然没有身经百战,大大小小也数十战了吧,我果断的打开了百度,一大堆的解决方案映入眼帘,我会眼花缭乱?会个球,我一眼就抓出了这堆凌乱的解决方案中的共同点,他们都在重复着一个标签名“ifraem”,哎,不重要,反正就这几个字母的组合排列。
说什么,是由于存在了标签页的切换,所以要先进入到那个标签页,只需要把那页的id或者class提出来做一个引导就好。
呐,像这样:browser.switch_to_frame(‘新iframe‘)
嘿,你还真别说,我还就照做了,这也成了我一晚上崩溃的起点。
第二个坑: switch_to_frame()
哇,这个巨坑。一贴上去这行代码就显示被删掉了,然而我并不这么认为,于是。。。
那么这个是怎么肥四呢?
这个函数确实是被弃用了,在我的不断努力之下,我找到了替代函数:switch_to.frame()
这个解决了就万事大吉了?
请绕回第一个问题。
崩溃吗?当你以为自己正在过关斩将,一路高歌猛进的时候,突然发现自己原来还在原地打转。
绕来绕去绕不出来,都大晚上的一两点了,我就果断的去睡了。
睡之前,我思量再三,明天起来换cookies吧。
cookies绕过登录验证,绕进了荒漠
用cookies怎么绕我就不多说了,不会绕的请回到“第七天”开始。
就直接说我绕过去之后得出了个什么玩意儿吧:
D:pythonProject3Scriptspython.exe C:/Users/asus/PycharmProjects/pythonProject3/main.py
<Response [200]>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8"/>
<title>金数据 - 找不到页面</title>
<meta content="IE=Edge,chrome=1" http-equiv="X-UA-Compatible"/>
<link href="https://gd-assets.jinshujucdn.com/assets/favicon-62fe2f27ea9d532a13fc76ed0e8b5e68bc2f61dde4a7935f54ff5dc3e3a727b2.ico" rel="shortcut icon" type="image/x-icon"/>
<link href="https://gd-assets.jinshujucdn.com/assets/blank-layout-67aac9b8f147aa0bf1d9b85c3683738452c3f41160e169b85e61130171db5992.css" media="screen" rel="stylesheet"/>
</head>
<body>
<div class="main-content blank-container">
<div class="page-alert">
<div class="status-code">404</div>
<h2>对不起,您要找的页面不存在</h2>
<p>您确定是这个网址吗?或者<a href="/">返回首页</a></p>
</div>
</div>
<footer>
<a class="powered-by" data-no-turbolink="true" href="/">
<p><span>Powered By </span><i class="gd-icon-logo powered-logo"></i><span> 金数据</span></p>
</a> </footer>
<script>
var _hmt = _hmt || [];
(function() {
if(document.querySelectorAll("script[src*=‘hm.baidu.com‘]").length === 0){
var hm = document.createElement("script");
hm.src = "//hm.baidu.com/hm.js?47cd03e974df6869353431fe4f4d6b2f";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
}
})();
</script>
</body>
</html>
12345678910111213141516171819202122232425262728293031323334353637
你知道吗?当我绕过了登录验证的时候,我心里还有一阵窃喜,嘿,小样儿,还不是让我过了。
然后,‘pia’
后来想了想,还是回来用selenium了。
为什么呢?首先肯定是有我的考量的。其次还是有我的考量的,最后是因为项目中的其他模块还要用到selenium呢,早晚都要面对,早死晚死都得死。
迎来转机
就在这山穷水尽之时,我抱着试一试的心态,直接搜“selenium操作金数据”。。
死马当活马医了,你们猜怎么着?
果然球都没查到哈哈哈哈哈
最后,迫于无奈,我又去换了套教程,“selenium自动化测试操作Chrome”,哎,翻来覆去翻来覆去,找到一个电科大的学长留给他的学弟们的偷懒脚本,我的天,终于帮我开张了(注意,此前我一步都没迈出去,连UI都摸不到)!!!
于是,就出现了文章开头那段代码。
其实那段代码也不简单,并不是说改一下就完了,那么简单的早就搞好了。
成功路前的磕磕碰碰
其实我刚开始并不是写成这样的,刚开始我是写成C语言格式的,虽然我知道现在这个也是C语言风格的,谁要是跟我说这是面向对象,那我劝你回去学一下设计模式吧。
# 本地Chrome浏览器设置方法
class golden_data:
def __init__(self):
#这几行用于隐藏浏览器,但是会导致文件无法下载,所以暂时搁置
#options = Options()
#chrome_options.add_argument(‘--no-sandbox‘) # 解决DevToolsActivePort文件不存在的报错
#options.add_argument(‘--disable-gpu‘) # 谷歌文档提到需要加上这个属性来规避bug
#options.add_argument(‘blink-settings=imagesEnabled=false‘) # 不加载图片, 提升速度
#options.add_argument(‘--headless‘) # 浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
获取句柄,登录,略过
#收集表单数据
def collect_data(self):
#点击第一个问卷
这里需要提高可拓展性
first_block = self.wait.until(EC.presence_of_element_located((By.XPATH, ‘//*[@id="5fa54cff61936cdee3121fa5"]/div/a‘)))
first_block.click()
time.sleep(2)
#点击‘数据’
table_click = self.wait.until(EC.presence_of_element_located((By.XPATH, ‘//*[@id="entries_nav"]‘)))
table_click.click() 这里曾经死活点不过去,后来发现是由于复制粘贴之后忘记把first_block改成table_click了
time.sleep(2)
#数据导出
data_out = self.wait.until(EC.presence_of_element_located((By.XPATH, ‘/html/body/div[3]/div[1]/div[3]/div/div[2]/table/tbody/tr/td[15]‘))) 这里曾经无法将数据导出,直接copy Xpath已经无法满足业务需求了
注(1)
data_out.click()
time.sleep(60) #这里的等待时间有点不好控制
这里曾经在函数写法改为类写法的时候出现超时,原因在于那时候我就放了10秒
所以这里的速度就非常之受网络影响,此处应该应try···throw···
#数据预下载
data_fore_download = self.wait.until(EC.presence_of_element_located((By.XPATH, ‘//*[@id="export_job_modal"]/div/div/div[3]/div/a[1]‘)))
data_fore_download.click()
time.sleep(10)
#数据下载
data_download = self.wait.until(EC.presence_of_element_located((By.XPATH, ‘/html/body/div[3]/div[1]/div[3]/div/div[2]/table/tbody/tr/td[15]/table/tbody/tr/td/div[1]/span[2]/a[1]‘)))
这里问题和上面一样,无法满足业务需求,不过有了上面做铺垫,所以这里解决起来就很快
data_download.click()
self.driver.close()
test = golden_data()
test.login_data()
test.collect_data()
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
注
在我看来,copy full Xpath比较稳一些,也不知道是不是Xpath比较快一些嘛,毕竟绝对路径和相对路径比起来,相对路径就是快一些的。
先到这里,其实前面的表单自动生成我也写的快OK了,不过保留一些悬念,慢慢加进来,对,就是放在这篇,这篇持续更新!!!
最后多说一句,想学习Python可联系小编,这里有我自己整理的整套python学习资料和路线,想要这些资料的都可以进q裙947618024领取。
本文章素材来源于网络,如有侵权请联系删除。
以上是关于你要偷偷的学Python,然后惊呆所有人(第十二天)的主要内容,如果未能解决你的问题,请参考以下文章