Python實現自動操作網頁導出數據(不是爬蟲)


前言:如題,此教程不是爬蟲,因為我遇到的這個情況爬蟲好像做不了,因為導出的數據有部分不在網頁內,是從數據庫取的值;

場景說明:在系統內有多個列表(見下圖左邊紅框),每個列表下有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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM