标题无心冒犯,就是以为这个广告挺好玩的javascript
前期回顾:你要偷偷学Python(第十一天)css
上一篇啊,上一篇说这一篇要带你们玩selenium,那天然是没错的。不过这一篇会不同一点,这一篇会持续更新。html
插播一条推送:(若是是小白的话,能够看一下下面这一段)java
我建了一个Python学习答疑群,有兴趣的朋友能够了解一下:若是你们在学习中遇到困难,想找一个python学习交流环境,能够加入咱们的python圈,裙号947618024,可领取python学习资料,会节约不少时间,减小不少遇到的难题。python
本系列文默认各位有必定的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
别喷,我知道代码健壮性不行,也知道没有什么高可用性。可是这只是我做为一个新手一天的成果而已,又不是学不会,后面慢慢就补上了。linux
还记得多少就解释多少吧。web
最开始的时候,个人代码并非像上面那套写的,是这类的:chrome
···
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()
这个解决了就万事大吉了?
请绕回第一个问题。
崩溃吗?当你觉得本身正在过关斩将,一路高歌猛进的时候,忽然发现本身原来还在原地打转。
绕来绕去绕不出来,都大晚上的一两点了,我就果断的去睡了。
睡以前,我思量再三,明天起来换cookies吧。
用cookies怎么绕我就很少说了,不会绕的请回到“第七天”开始。
就直接说我绕过去以后得出了个什么玩意儿吧:
D:\pythonProject3\Scripts\python.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领取。
本文章素材来源于网络,若有侵权请联系删除。