1. 程式人生 > >關於需要selenium自動登入下載檔案的網站,暫時不知如何其他登入方式,歡迎代價解惑,提供其他登入方式下載檔案

關於需要selenium自動登入下載檔案的網站,暫時不知如何其他登入方式,歡迎代價解惑,提供其他登入方式下載檔案

這是魔盾網上下載檔案的一個爬蟲指令碼,題主想了很久沒能通過攜帶cookie登入來下載,最終選擇selenium自動化方式來登入,但是這種方式爬去速率有限,僅作為一個參考,也希望大家能夠提供其他解決方式,互相學習:

直接上程式碼

# -*- coding:utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By  # 查詢元素的方法,此次用於搜尋框查詢
from selenium.webdriver.support.ui import WebDriverWait  # 顯示等待,設定最長等待時間,此次用於開啟連結的最長等待時間
from selenium.webdriver.support import expected_conditions as EC # EC.presence_of_element_lovated()是確認元素是否已經出現了或者可點選等 from selenium.common.exceptions import TimeoutException # 超出指定的等待時間報異常 import time import json import re from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.keys import
Keys from selenium.webdriver.chrome.options import Options options = webdriver.ChromeOptions() options.add_argument('--headless') options.add_argument('--disable-gpu') prefs = {'profile.default_content_settings.popups': 0, 'download.default_directory': 'E:\\test'} options.add_experimental_option('prefs'
, prefs) driver = webdriver.Chrome(options=options) # driver = webdriver.PhantomJS() # WebDriverdriver = new HtmlUnitDriver() wait = WebDriverWait(driver, 10) # 設定最長10秒的等待時間 # driver = webdriver.Chrome(executable_path=(r'C:\Python27\chromedriver.exe'), # chrome_options=chrome_options) # add missing support for chrome "send_command" to selenium webdriver driver.command_executor._commands["send_command"] = ("POST", '/session/$sessionId/chromium/send_command') params = {'cmd': 'Page.setDownloadBehavior', 'params': {'behavior': 'allow', 'downloadPath': "E:\\test"}} command_result = driver.execute("send_command", params) def denglu(url, x): driver.get(url) # 請求訪問的URL # driver.save_screenshot('modunyemian.png') if x == 0: submit = driver.find_element_by_xpath('//*[@id="navbar-collapse"]/ul/li[1]/a') # 定位安全分析入口按鈕 submit.click() # 模擬提交按鈕 submit = driver.find_element_by_xpath('/html/body/header/nav/nav/ul[2]/li[1]/a') # 定位登入按鈕 submit.click() # 模擬提交按鈕 input_one = driver.find_element_by_xpath('/html/body/div[1]/div/div/div[2]/div/form/fieldset/div[1]/input') # 定位使用者名稱輸入框 input_one.send_keys('xxxx') # 輸入使用者名稱 input_two = driver.find_element_by_xpath('/html/body/div[1]/div/div/div[2]/div/form/fieldset/div[3]/input') # 定位密碼輸入框 input_two.send_keys('xxxxx') # 輸入密碼 submit = driver.find_element_by_xpath('/html/body/div[1]/div/div/div[2]/div/form/fieldset/p[1]/button') # 定位登入按鈕 submit.click() # 模擬點選提交按鈕 else: pass def md5_data(): md5_list = driver.find_elements_by_xpath('//*[@id="files"]/div/table/tbody/tr') # 定位md5的連結 data_list = [] # 建立列表儲存md5 for i in md5_list: # 遍歷md5列表 temp = {} # print(i) temp['md5'] = i.find_element_by_xpath('./td[3]/a').get_attribute('href') # 定位連結屬性 data_list.append(temp) for url in data_list: driver.get(url.get('md5')) html = driver.page_source # print(html) # submit = driver.find_element_by_xpath('//*[@id="file"]/div/table/tbody/tr[11]/td/a') # 定位樣本下載按鈕 if re.compile('樣本下載').search(html): submit = wait.until( EC.element_to_be_clickable((By.CSS_SELECTOR, '#file > div > table > tbody > tr:nth-child(11) > td > a'))) # 定位樣本下載按鈕 submit.click() # 模擬點選按鈕 print('點選按鈕成功') else: print('此檔案沒有下載按鈕') return data_list # 返回列表 # def save_data(data_list): # 儲存md5資料 # with open('md5.txt', 'a+') as f: # for data in data_list: # str_data = json.dumps(data, ensure_ascii=False) + ',\n' # f.write(str_data) # 寫入資料 # print(data_list) # 列印下載儲存的資料 def run(): # 執行執行 for x in range(0, 2): # 遍歷翻頁列表 url = 'https://www.maldun.com/analysis/page/' + str(x) + '/' # 翻頁連結 if x == 0: url = 'https://www.maldun.com' # 如果首頁為0,則訪問主域名 denglu(url, x) md5_data() else: # 如果不是主域名,則訪問翻頁連結 denglu(url, x) md5_data() # save_data(md5_data()) if __name__ == '__main__': run()