一、批量下載文件
網頁分析
點擊跳轉到下載頁面
from selenium import webdriver
import timedef get_link_list():# 創建瀏覽器對象driver = webdriver.Chrome(executable_path=r'C:\Users\nlp_1\Desktop\chromedriver\chromedriver-win32\chromedriver.exe')url = 'https://www.tendacn.com/en/service/download-cata-11.html'driver.get(url)# 等待driver.implicitly_wait(10)css_elem = driver.find_elements_by_css_selector('.dr_file > a')link_list = []for link in css_elem:page_link = link.get_attribute('href')print(page_link)link_list.append(page_link)driver.close()driver.quit()return link_listdef get_download_links(link_list):download_link_list = []for i,link in enumerate(link_list):if i == 0:driver = webdriver.Chrome(executable_path=r'C:\Users\nlp_1\Desktop\chromedriver\chromedriver-win32\chromedriver.exe')driver.get(link)else:js = f'window.open("{link}")'driver.execute_script(js)# 每打開一個鏈接切換到該頁面也就是最新的這個driver.switch_to.window(driver.window_handles[-1])download_elem = driver.find_element_by_css_selector('.downbtns > a')download_link = download_elem.get_attribute('href')download_link_list.append(download_link)totals = len(download_link_list)print(f'一共有{totals}個下載鏈接!')driver.quit()return download_link_listdef download_file(download_link_List):for i,doanload_link in enumerate(download_link_List):js = f'window.open("{doanload_link}")'driver.execute_script(js)print(30*'-')print(doanload_link)time.sleep(6)print(f'第{i + 1}個文件正在下載中……')# 程序執行入口
if __name__ == '__main__':link_list = get_link_list()download_link_List = get_download_links(link_list)options = webdriver.ChromeOptions()options.add_argument('--ignore-certificate-errors')driver = webdriver.Chrome(options=options)download_file(download_link_List)
二、網頁自動化點擊上報
# 指定賬戶名和密碼登錄
def login():# 隨機點一下 ,以便顯示登錄頁面driver.find_element_by_id('bodyMain').click()# id=“username”是打開的網址中,賬號登錄的輸入框,輸入字符串“用戶名”username = input('請輸入你的用戶名:')password = input('請輸入你的密碼:')print('登錄中……')driver.find_element_by_id('username').send_keys(username)driver.find_element_by_id('password').send_keys(password)# id="submit"是點擊登錄, click() 是模擬點擊driver.find_element_by_id("submit").click()time.sleep(2)print('登錄成功\n')
# 點擊 風險分級管控driver.implicitly_wait(5)risk_grade_control = driver.find_element_by_link_text("風險分級管控")risk_grade_control.click()time.sleep(2)print('已點擊【風險分級管】\n')
# 點擊 風險點隱患上報driver.implicitly_wait(5)xpth = driver.find_element_by_xpath("//div[@data-tid='e9c7735c77284173a243f8e47999ee8d']")xpth.click()time.sleep(2)print('已點擊【風險點隱患上報】\n')
注意:可能點擊 “風險點隱患上報” 右邊頁面是異步加載的找不到對應的文本按鈕
# 重定向頁面,確保操作的是當前窗口頁面內容driver.switch_to.default_content()frame = driver.find_elements_by_tag_name('iframe')[0]driver.switch_to.frame(frame)time.sleep(1)
完整代碼
# 導入相關庫和模塊
from selenium import webdriver
import time# 指定賬戶名和密碼登錄
def login():# 隨機點一下 ,以便顯示登錄頁面driver.find_element_by_id('bodyMain').click()# id=“username”是打開的網址中,賬號登錄的輸入框,輸入字符串“用戶名”username = input('請輸入你的用戶名:')password = input('請輸入你的密碼:')print('登錄中……')driver.find_element_by_id('username').send_keys(username)driver.find_element_by_id('password').send_keys(password)# id="submit"是點擊登錄, click() 是模擬點擊driver.find_element_by_id("submit").click()time.sleep(2)print('登錄成功\n')# 免輸入密碼和賬戶名登錄
def vip_login():# 蘇州五合汽車部件制造有限公司# 張家港市友成高新材料有限公司print('這是vip直接登錄模式(免輸戶名和密碼),登錄中……')driver.find_element_by_id('bodyMain').click()driver.find_element_by_id('username').send_keys('蘇州五合汽車部件制造有限公司')driver.find_element_by_id('password').send_keys('ghj@18zXX')driver.find_element_by_id("submit").click()time.sleep(2)print('vip免輸入模式,登錄成功!\n')# 到達要處理的頁面
def to_page():# 點擊 風險分級管控driver.implicitly_wait(5)risk_grade_control = driver.find_element_by_link_text("風險分級管控")risk_grade_control.click()time.sleep(2)print('已點擊【風險分級管】\n')# 點擊 風險點隱患上報driver.implicitly_wait(5)xpth = driver.find_element_by_xpath("//div[@data-tid='e9c7735c77284173a243f8e47999ee8d']")xpth.click()time.sleep(2)print('已點擊【風險點隱患上報】\n')# 重定向頁面,確保操作的是當前窗口頁面內容driver.switch_to.default_content()frame = driver.find_elements_by_tag_name('iframe')[0]driver.switch_to.frame(frame)time.sleep(1)# 點擊 無隱患,處理一個頁面
def deal_one_page(index=0):time.sleep(2)print()print(30 * '-')print()for i in range(20):if index == totals // 20 and i == totals % 20:print(f'總共{20 * index + i}條,已經全部點擊完成!')driver.close()breakprint(f'第{20 * index + i + 1}條開始點擊處理……')if i == 0:driver.find_elements_by_partial_link_text('無隱患')[i].click()driver.find_elements_by_partial_link_text('無隱患')[i].click()print('等待彈窗出現,并準備點擊【確定】……')time.sleep(2)try:driver.implicitly_wait(5) # secondselem_yes = driver.find_element_by_partial_link_text('確定')elem_yes.click()except:print('稍等,正在處理……') # 再次重點擊‘無隱患’driver.find_elements_by_partial_link_text('無隱患')[i].click()time.sleep(3) # 之前5秒合適driver.implicitly_wait(5) # secondselem_yes = driver.find_element_by_partial_link_text('確定')elem_yes.click()print('已經點擊【確定】,彈窗正在退出……')print(f'第{20 * index + i + 1}條無隱患已經上報!')print()print(30 * '-')print()time.sleep(1)# 點擊 無隱患,翻頁并處理全部頁面
def deal_all_page(totals):for index in range(totals // 20 + 1):time.sleep(3)deal_one_page(index)print()print(f'-----第{index + 1}頁已經完成-----')print(f'--------------------------------')print()try:driver.find_element_by_id('mini-25').click()except:driver.find_element_by_id('mini-25').click()time.sleep(2)def get_totals():driver.implicitly_wait(10) # secondsdriver.find_element_by_id('mini-26').click()driver.implicitly_wait(10)end_page_elem = driver.find_elements_by_xpath(".//span[@class='mini-pager-index']/span")[0]end_page = end_page_elem.text.strip('/')time.sleep(3)end_page_count = driver.find_elements_by_partial_link_text('無隱患')totals = (int(end_page) - 1) * 20 + len(end_page_count)print(f'一共{totals}條記錄待點擊處理')driver.implicitly_wait(10) # secondsdriver.find_element_by_id('mini-23').click()time.sleep(3)return totalsdef main():# vip_login()login()to_page()time.sleep(3)global totalstotals = get_totals()deal_all_page(totals)if __name__ == "__main__":totals = None# 調用環境變量指定的 Chrome 瀏覽器創建瀏覽器對象driver = webdriver.Chrome()# get 方法會一直等到頁面被完全加載,然后才會繼續程序,通常測試會在這里選擇print('正在啟動網頁自動化辦公程序……\n')time.sleep(2)driver.get("http://221.224.155.68:9090/cas/login?service=http%3A%2F%2F221.224.155.68%3A9090%2Flesweb3%2F")print('正在打開目標網站……\n')time.sleep(2)main()