码迷,mamicode.com
首页 > 编程语言 > 详细

你要偷偷的学Python,然后惊呆所有人(第十二天)

时间:2020-11-19 12:45:23      阅读:8      评论:0      收藏:0      [点我收藏+]

标签:prim   XML   ===   webdriver   frame   绝对路径   重要   编译器   isa   

技术图片

 

标题无意冒犯,就是觉得这个广告挺好玩的

文章目录

  • 前言
  • 欢迎来到我们的圈子
  • 先上一段代码,云淡风轻
  • 代码解释
  • 第一个坑:find_element_name
  • 第二个坑: switch_to_frame()
  • cookies绕过登录验证,绕进了荒漠
  • 迎来转机
  • 成功路前的磕磕碰碰

前言

前期回顾:你要偷偷学Python(第十一天)

上一篇啊,上一篇说这一篇要带大家玩selenium,那自然是没错的。不过这一篇会不一样一点,这一篇会持续更新。

插播一条推送:(如果是小白的话,可以看一下下面这一段)

欢迎来到我们的圈子

技术图片

 我建了一个Python学习答疑群,有兴趣的朋友可以了解一下:如果大家在学习中遇到困难,想找一个python学习交流环境,可以加入我们的python圈,裙号947618024,可领取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

别喷,我知道代码健壮性不行,也知道没有什么高可用性。但是这只是我作为一个新手一天的成果而已,又不是学不会,后面慢慢就补上了。

代码解释

还记得多少就解释多少吧。

第一个坑: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:\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领取。

本文章素材来源于网络,如有侵权请联系删除。

你要偷偷的学Python,然后惊呆所有人(第十二天)

标签:prim   XML   ===   webdriver   frame   绝对路径   重要   编译器   isa   

原文地址:https://www.cnblogs.com/python-miao/p/13972415.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!