农房一体脚本的心得记录

本文详细记录了一位开发者在使用Python和Selenium操作农房一体系统过程中遇到的问题与解决方案,包括环境搭建、浏览器选择(360与IE)、iframe操作、异步等待、文件上传等,以及对后续优化的思考和安装包管理的注意事项。
摘要由CSDN通过智能技术生成

第一天

首先查看了环境,发现整个工作环境是搭载在浏览器上面的,感觉用爬虫上手挺简单的

尝试用谷歌来打开,结果发现不行,有一个嵌套网页显示不出来,只能用iE旧版或者360浏览器来打开,但是360运用的是chrome内核,所以先用360(后来发现其实360还是不行)

技术栈方向,考虑直接http请求或者自动化selenium来操作。网页用的是aspx来渲染的,抓包查看后发现图片被神奇的加密了,用的是T:0.314578…,所以没法直接http请求完成(应该是自己菜没看的懂,后来想其实可以去静态资源那里的工具类中拿去加密的方法)

然后先尝试的webdriver用360,查看360的chrome内核,注意360要重新导入options以及路径选择

结果发现360有如下的问题

  1. 打开页面有广告(即使调整设置之后还是没有办法解决,可能每次打开的时候都会初始化一下?)
  2. 直接卡在driver启动程序,打开页面之后就无响应,莫名其妙,且debug不出来,也不报错

于是换用IE浏览器

  1. ie的版本的chromedriver是根据selenium版本来选择的,而不是根据浏览器的版号来确定
  2. 要把ie的不信任证书关掉,四个页面的不信任证书都要关闭(重点)
  3. 有的ie会很慢,有的ie打开会很快(应该是版本问题,没想再比较)
  4. 记住要用win32版本而不是x86版本

第二天

熟悉selenium的操作,完成代码的主体部分

有几个注意点

  1. iframe的操作,记住要进去一个iframe操作完成后要退出,用简单的属性去定位iframe更方便一些
  2. 有一个input框输入要谨慎小心,输入其实不是表面看到的input,下面还藏着其他几个input,真真传的值在后面被转化了
  3. 异步等待,有三种操作,搜索有一大堆资料,在此不再叙述(https://www.jianshu.com/p/02005ec29d94)
  4. 左击,要用actions().contextclick().perform()来操作

第三天

还是想换回chrome浏览器

查询网上可能有两种错误

  1. 第一种是因为ie的内核支持activeX来进行浏览,用ietab的谷歌插件来解决
  2. 第二种是关闭iframe访问的,chrome在80系列以上关闭阻止了iframe的src的跨域请求

我做的操作

  1. chrome的ietab插件打包,用开发者模式下即可打包,然后打包完的crx文件如果直接拖入,会出现需要修复的bug,所以安全的方法是直接解压然后导入解压后的安装包就可以了,但是没有作用
  2. 直接上网查,要关闭两个东西,在chrome的extensition里,但是没有作用,接着降版本号,先降到78,再70,都没有用

放弃,还是改用ie来操作

第二天已经把基本的点击进入操作全部完成,下面是上传图片的操作资料

  1. 通过os.listdir操作可以获取到该目录下的所有文件的名字
  2. 先准备用sendkeys这个包,结果只能用python2的版本,所以放弃这个方法
  3. 接着使用pywin32的包,这个包的操作要配合spy++来使用,spy++要有一个visualstudio的2011版本注意安装,或者安装一个2011的小补丁操作就可以,spy++来获取当前窗口的名字和id,然后用pywin32进行input和submit操作,上传的时候只要将文件的绝对路径输入进去就可以访问到了

第四天

  1. 用pandas导入excel表并作筛选,循环的操作,封装完即可

  2. 注意要str一下文件类的数据,否则输出到框内会有问题(记不清了,有这问题吗)

  3. 做一个进度条的框,用的是progressbar这个插件,然后具体的操作看文档,但是必须改成for循环,无法用while来显示进度,理所当然,while的终止条件没法很好的知道啊

  4. 在进行操作前对文件进行预处理,如文件命名规范和查询空文件夹之类

后续的一些想法

想继续进行一些优化,如文字识别直接来生成excel表来进行,准备的是paddleocr

padddleocr的安装教程

但是我的电脑是商务本无法承担大量的计算任务,而且扫描的图片无法准确拿到,因为编号是乱码的,最终放弃了这个想法

关于安装包的一些小说明

包的安装方法

要记得安装对应版本py38,而不是py37之类

有whlpip install xxx和tagpython setup.py install两种,推荐whl

有的时候安装一个包要用另外一个包的情况,所以最好先在有网的情况下安装看一下还要哪些依赖

  1. whl 直接在对应目录下pip install 对应whl文件
  2. tag要解压后再安装 用python setup.py install即可

包的需求部分

用代码pip install -r requirements.txt

urllib3
selenium
six
xlrd
python_utils
python_dateutil
pytz
pywin32
numpy
pandas

代码部分

正文代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import ActionChains
from selenium.webdriver.support import expected_conditions as Ec

import win32gui
import win32con
import pandas as pd
import progressbar

import time
import os, sys
import datetime
import logging

options = webdriver.IeOptions()
driver = webdriver.Ie(options=options,executable_path=r"C:\Users\hp\Desktop\IEDriverServer.exe")

# chrome浏览器的操作
# options = webdriver.ChromeOptions()
# driver = webdriver.Chrome(options=options,executable_path=r"C:\Users\hp4\Desktop\chromedriver.exe")

driver.implicitly_wait(20)
wait = WebDriverWait(driver,20,0.2)

progressbar.streams.wrap_stderr()
# logging.basicConfig(level=logging.NOTSET)
logging.basicConfig()

def open():
    driver.get('http://10.12.4.71:8080/DL.aspx')
    driver.find_element_by_id("txtPwd").send_keys("123")
    username = driver.find_element_by_id("comEmpTxt")
    username.clear()
    # username.send_keys('nongfang4-1hao')#丁
    # username.send_keys('nongfangyiti1hao')#金
    # username.send_keys('nongfang5hao')#董
    # username.send_keys('nongfang2hao')# 菜
    # username.send_keys('nongfang3hao')#薛
    driver.find_element_by_id("btnlogin").click()

    # time.sleep(20)
    driver.find_element_by_xpath("//div[@class='acc_main_0'][5]/div/div[@class='box-open']/a").click()
    # xitongguanli = wait.until(Ec.presence_of_all_elements_located(By.XPATH,"//div[@class='acc_main_0'][5]/div/div[@class='box-open']/a"))
    # xitongguanli.click()

    driver.find_element_by_id("tree_5_2_span").click()
    # shiliguanli = wait.until(Ec.presence_of_all_elements_located(By.ID,"tree_5_2_span"))
    # shiliguanli.click()


def work(shoulihao,path):
    # shoulihao = str(shoulihao)

    # onreadystatechange = "top.frm_OnReadyStateChange(this);"
    iframe = driver.find_element_by_xpath('//iframe[@onreadystatechange="top.frm_OnReadyStateChange(this);"]')
    # iframe = driver.find_element_by_xpath('//div[@class="tabbody_0 tabbody_1"]/iframe')
    driver.switch_to.frame(iframe)

    # chkPrjId
    # driver.find_element_by_id("chkPrjId").click()
    if(i == 0):
        driver.find_element_by_xpath('//span[@name="chkPrjId"]').click()

    # txtPrjId
    query = driver.find_element_by_id('txtPrjId')
    query.clear()
    query.send_keys(shoulihao)
    query.send_keys(Keys.ENTER)

    driver.find_element_by_xpath('//a[@title=' + shoulihao + ']').click()

    # driver.switch_to.frame(iframe)
    # tabbody_0 tabbody_1
    driver.switch_to.default_content()
    # driver.find_element_by_id("frmMain")
    # driver.find_element_by_id("tab_BodyContent")

    #iframe = driver.find_element_by_xpath('//iframe[@onreadystatechange="top.frm_OnReadyStateChange(this);"]')
    iframe = driver.find_element_by_xpath('//div[@class="tabbody_0 tabbody_1"]/iframe')
    driver.switch_to.frame(iframe)

    # time.sleep(3)
    driver.find_element_by_id("worklayout")

    # title = "展开工作区"
    driver.find_element_by_xpath('//img[@title = "展开工作区"]').click();

    # title = "附件"
    driver.find_element_by_xpath('//img[@title = "附件"]').click();

    # id = "divAttachTree_2_a"
    youji = driver.find_element_by_id("divAttachTree_2_a")
    ActionChains(driver).context_click(youji).perform()

    #m_AttachList_addAttach添加节点的id名称
    driver.find_element_by_id("m_AttachList_addAttach").click()

    # path = r"C:\Users\hp\Desktop\古庄\00180"

    #图片的文件夹位置
    # listpath = exactpath + "\\" + path
    exactpath = "C:\\Users\\hp\\Desktop\\海南镇莫顾村2\\" + path
    os.listdir(exactpath)
    str = ""
    for file in os.listdir(exactpath):
        # str += file.split('.')[0] + " "
        str += '"'
        str += exactpath
        str += "\\"
        str += file
        str += '" '

    # print(str)

    dialog = win32gui.FindWindow("#32770","打开")
    ComboBoxEx32 = win32gui.FindWindowEx(dialog,0,'ComboBoxEx32',None)
    ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, 'ComboBox', None)
    Edit = win32gui.FindWindowEx(ComboBox, 0, 'Edit', None)
    button = win32gui.FindWindowEx(dialog, 0, 'Button', None)

    win32gui.SendMessage(Edit,win32con.WM_SETTEXT,None,str)
    win32gui.SendMessage(dialog,win32con.WM_COMMAND,1,button)

    driver.switch_to.default_content()

    driver.find_element_by_xpath('//li[@class="tabtitle_0"]/span/a').click()
    # time.sleep(2)


if __name__ == '__main__':
    # excel表的行数减去2
    # excel表的第2行对应的是x的第0号
    inital = 0
    x = inital
    # exactpath = r"C:\Users\hp\Desktop\海南镇张联村02"

    #excel表的位置
    io = r"C:\Users\hp\Desktop\海南镇(莫顾)高俊.xls"

    open()

    data = pd.read_excel(io, sheet_name=0)
    shoulibianhao = data["受理编号"]
    total = len(shoulibianhao)

    # 这是宗地号的位置,14到19是最后五位,同理16:19是后三位,这是文件夹命名的位置
    zongzhutongyibianma = data["宗地统一编码"].map(lambda x: x[14:19])

    # 这是结束的地方,同开始要-2

    for i in progressbar.progressbar(range(total-inital)):
    # for i in progressbar.progressbar(range(14)):
        logging.error('受理号: %d', shoulibianhao[x])
        # print()
        work(str(shoulibianhao[x]), str(zongzhutongyibianma[x]))

        x = x + 1

查询预处理部分

import pandas as pd
import os

io = r"C:\Users\hp\Desktop\兴化市张郭镇刘纪村曹郭致.xls"
data = pd.read_excel(io,sheet_name=0)
data = data[["受理编号","宗地统一编码","ZL"]]
shoulibianhao = data["受理编号"]
zongzhutongyibianma = data["宗地统一编码"].map(lambda x: x[14:19])

os.chdir(r'C:\Users\HP\Desktop\张郭刘纪村')

for i in zongzhutongyibianma:
    f = str('C:\\Users\\HP\\Desktop\\张郭刘纪村'+'\\'+i)
    if(os.path.isdir(i)):
        if not os.listdir(f):            
            print("%s,该文件夹无图片"%f)
    else:
        print("%d,此文件夹不存在"%(str(i)))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值