Python实现自动操作网页导出数据(不是爬虫)

时间:2024-03-05 15:32:05

前言:如题,此教程不是爬虫,因为我遇到的这个情况爬虫好像做不了,因为导出的数据有部分不在网页内,是从数据库取的值;

场景说明:在系统内有多个列表(见下图左边红框),每个列表下有N条数据,此时要每个列表点开,然后点击“导出”按钮,将数据导出来;

     人工手动点击太麻烦,我们要做的就是把这部分完全重复的工作让代码来自动执行;

实现逻辑:主要原理就是模拟鼠标点击及键盘输入,实现自动导出;

 

 

 

1.首先需要引入两个包,本来只需要引入pynput包的,由于这个包内的函数无法操作点击浏览器弹出的下载框,所以改用了PyAutoGUI包;

 

 

 

 

2.先把刚刚安装的包引进来,然后开始获取电脑屏幕的分辨率;

from pynput.mouse import Button, Controller
import time
import pyautogui
import tkinter

#获取当前屏幕分辨率
winpx = tkinter.Tk()
winx = winpx.winfo_screenwidth()#获取屏幕X轴像素
winy = winpx.winfo_screenheight()#获取屏幕y轴像素

 

3.获取你每次需要点击的坐标值;举例:我完成一套流程需要点击的地方:

  1.点击楼栋列表;2.点击导出;3.跳转下载页面点击下载链接;4.弹出下载框点击保存>>选择另存为;5.弹出保存框,点击文件名;6.点击确定;7.点击关闭浏览器下载页签;

以上这些需要点击的地方,都是需要给定一个坐标来控制;

mouse = Controller()#键鼠控制器
#楼栋坐标
x1 = 340
y1 = 590
#导出按钮坐标
x2 = 1772
y2 = 553
#下载链接坐标
x3 = 1000
y3 = 170
#保存按钮坐标
x4 = 1310
y4 = 1020
#保存文件名称坐标
x5 = 1105
y5 = 670
#弹窗确定按钮坐标
x6 = 1666
y6 = 740
#关闭页面按钮坐标
x7 = 590
y7 = 66
#控制循环
i = 1

 

 

4.定义每次点击需要调用的函数;

 

#获取当前指针位置
def getcursor():
    #mouse = Controller()
    # print(mouse.position)
    #time.sleep(1)  # 等待1秒继续往下执行
    print(\'当前指针位置:{0}\'.format(mouse.position))

#指针移动到第一个楼栋并点击,点击下一楼栋每次下移20px
def clickBuilding(x1,y1):
    if(y1 > 1010):
        pyautogui.moveTo(454, 999, 1)
        pyautogui.click(button=\'left\',clicks=3, interval=0.1)#点击三次滚动条
        y1 = y1 - 100#滚动之后重新定位坐标,滚动条每隐藏一条数据就-20px
        pyautogui.moveTo(x1,y1,1)
        pyautogui.click(button=\'left\')
        print(\'点击楼栋信息:{0}\'.format(mouse.position))
        time.sleep(1)
    else:
        pyautogui.moveTo(x1, y1, 1)
        pyautogui.click(button=\'left\')
        print(\'点击楼栋信息:{0}\'.format(mouse.position))
        time.sleep(1)

#指针移动到导出按钮上并点击导出
def clickExport(x2,y2):
    pyautogui.moveTo(x2,y2,1)
    pyautogui.click(button=\'left\')
    print(\'点击导出按钮:{0}\'.format(mouse.position))
    time.sleep(3)

#点击下载核算辅助文件
def clickDownloadLink(x3,y3):
    pyautogui.moveTo(x3,y3,1)
    pyautogui.click(button=\'left\')
    print(\'点击下载链接:{0}\'.format(mouse.position))
    mouse.click(Button.left,1)
    time.sleep(3)

#点击保存按钮选择另存为
def saveAs(x4,y4):
    pyautogui.moveTo(x4,y4,1)
    pyautogui.click(button=\'left\')
    #相对于当前位置移动(x,y)个距离
    pyautogui.move(90,-21,0.3)
    pyautogui.click(button=\'left\')
    print(\'现已移动到:{0}\'.format(mouse.position))
    #mouse.click(Button.left, 1)
    time.sleep(1)

#调整文件名点击保存
def adjustmentFileName(x5,y5,x6,y6,i):
    pyautogui.moveTo(x5,y5,1)
    pyautogui.click(button=\'left\')
    pyautogui.write(str(i))#interval=0.1,此参数用于输入多个字符时控制时间间隔
    print(\'文件名称:辅助核算对照信息1.xls\')
    time.sleep(1)
    pyautogui.moveTo(x6,y6,0.5)
    pyautogui.click(button=\'left\')

def closePage(x7,y7):
    pyautogui.moveTo(x7, y7, 1)
    pyautogui.click(button=\'left\')
    print(\'页面已关闭!\')

 

 

 

5.用if先判断是否满足条件,满足条件就执行for循环开始自动导出吧;

#开始
if (winx == 1920 and winy == 1080):
    print(\'当前屏幕分辨率为:\' + str(winx) + \',\' + str(winy))
    getcursor()
    # 循环调用函数
    for i in range(1, 9):  # 有多少要导的楼栋range()内就填1,n+1
        clickBuilding(x1, y1)
        clickExport(x2, y2)
        clickDownloadLink(x3, y3)
        saveAs(x4, y4)
        adjustmentFileName(x5, y5, x6, y6, i)
        closePage(x7, y7)
        y1 = y1 + 20 #每循环一次,y1就增加20像素,鼠标就会下移20像素点击列表内下一个楼栋
        ++i
else:
    print("当前电脑分辨率不为1920*1080,需要重新设置参数!")

 

 

下面是总的代码:

from pynput.mouse import Button, Controller
import time
import pyautogui
import tkinter

#获取当前屏幕分辨率
winpx = tkinter.Tk()
winx = winpx.winfo_screenwidth()#获取屏幕X轴像素
winy = winpx.winfo_screenheight()#获取屏幕y轴像素

mouse = Controller()#键鼠控制器
#楼栋坐标
x1 = 340
y1 = 590
#导出按钮坐标
x2 = 1772
y2 = 553
#下载链接坐标
x3 = 1000
y3 = 170
#保存按钮坐标
x4 = 1310
y4 = 1020
#保存文件名称坐标
x5 = 1105
y5 = 670
#弹窗确定按钮坐标
x6 = 1666
y6 = 740
#关闭页面按钮坐标
x7 = 590
y7 = 66
#控制循环
i = 1

#获取当前指针位置
def getcursor():
    #mouse = Controller()
    # print(mouse.position)
    #time.sleep(1)  # 等待1秒继续往下执行
    print(\'当前指针位置:{0}\'.format(mouse.position))

#指针移动到第一个楼栋并点击,点击下一楼栋每次下移20px
def clickBuilding(x1,y1):
    if(y1 > 1010):
        pyautogui.moveTo(454, 999, 1)
        pyautogui.click(button=\'left\',clicks=3, interval=0.1)#点击三次滚动条
        y1 = y1 - 100#滚动之后重新定位坐标,滚动条每隐藏一条数据就-20px
        pyautogui.moveTo(x1,y1,1)
        pyautogui.click(button=\'left\')
        print(\'点击楼栋信息:{0}\'.format(mouse.position))
        time.sleep(1)
    else:
        pyautogui.moveTo(x1, y1, 1)
        pyautogui.click(button=\'left\')
        print(\'点击楼栋信息:{0}\'.format(mouse.position))
        time.sleep(1)

#指针移动到导出按钮上并点击导出
def clickExport(x2,y2):
    pyautogui.moveTo(x2,y2,1)
    pyautogui.click(button=\'left\')
    print(\'点击导出按钮:{0}\'.format(mouse.position))
    time.sleep(3)

#点击下载核算辅助文件
def clickDownloadLink(x3,y3):
    pyautogui.moveTo(x3,y3,1)
    pyautogui.click(button=\'left\')
    print(\'点击下载链接:{0}\'.format(mouse.position))
    mouse.click(Button.left,1)
    time.sleep(3)

#点击保存按钮选择另存为
def saveAs(x4,y4):
    pyautogui.moveTo(x4,y4,1)
    pyautogui.click(button=\'left\')
    #相对于当前位置移动(x,y)个距离
    pyautogui.move(90,-21,0.3)
    pyautogui.click(button=\'left\')
    print(\'现已移动到:{0}\'.format(mouse.position))
    #mouse.click(Button.left, 1)
    time.sleep(1)

#调整文件名点击保存
def adjustmentFileName(x5,y5,x6,y6,i):
    pyautogui.moveTo(x5,y5,1)
    pyautogui.click(button=\'left\')
    pyautogui.write(str(i))#interval=0.1,此参数用于输入多个字符时控制时间间隔
    print(\'文件名称:辅助核算对照信息1.xls\')
    time.sleep(1)
    pyautogui.moveTo(x6,y6,0.5)
    pyautogui.click(button=\'left\')

def closePage(x7,y7):
    pyautogui.moveTo(x7, y7, 1)
    pyautogui.click(button=\'left\')
    print(\'页面已关闭!\')

#开始
if (winx == 1920 and winy == 1080):
    print(\'当前屏幕分辨率为:\' + str(winx) + \',\' + str(winy))
    getcursor()
    # 循环调用函数
    for i in range(1, 9):  # 有多少要导的楼栋range()内就填1,n+1
        clickBuilding(x1, y1)
        clickExport(x2, y2)
        clickDownloadLink(x3, y3)
        saveAs(x4, y4)
        adjustmentFileName(x5, y5, x6, y6, i)
        closePage(x7, y7)
        y1 = y1 + 20 #每循环一次,y1就增加20像素,鼠标就会下移20像素点击列表内下一个楼栋
        ++i
else:
    print("当前电脑分辨率不为1920*1080,需要重新设置参数!")

 

最后就是将导出来的文件合成为一个文件,方法见链接:https://www.cnblogs.com/zhou0910/p/14919759.html