Python實現自動操作網頁匯出資料(不是爬蟲)
阿新 • • 發佈:2021-06-22
前言:如題,此教程不是爬蟲,因為我遇到的這個情況爬蟲好像做不了,因為匯出的資料有部分不在網頁內,是從資料庫取的值;
場景說明:在系統內有多個列表(見下圖左邊紅框),每個列表下有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,需要重新設定引數!")
最後就是將匯出來的檔案合成為一個檔案: