"Javascript: __ doPostBack ('LeaderBoard1 $ cmdCSV',") "düğmesini tıklayarak Selenium'u kullanarak dosya indirin
Otomasyon yoluyla indirmek istediğim bir sürü CSV beyzbol istatistikleri dosyası var, bunları şu adreste bulabilirsiniz: https://www.fangraphs.com/leaders.aspx?pos=all&stats=bat&lg=all&qual=0&type=0&season=2020&month=0&season1=2020&ind=0&team=0&rost=0&age=0&filter=&players=0&startdate=2020-01-01&enddate=2020-12-31. Tabloyu CSV olarak indirme düğmesi "Verileri Dışa Aktar" olarak etiketlenmiştir.
HTML:
<div class="br_dby">
<span style="float: left">
<a href="javascript:ShowHide();">Show Filters</a>
|
<a href="#custom">Custom Reports</a>
</span>
<a href="javascript:__doPostBack('LeaderBoard1$cmdCSV','')" id="LeaderBoard1_cmdCSV">Export Data</a>
</div>
Anlayabileceğiniz gibi, düğme bir indirme sayfasına yönlendirme değil (bu durumda requestsdosyayı indirmek için kullanılabilir), ancak bir işlemdir.
Kod:
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
binary = r'C:\Program Files\Mozilla Firefox\firefox.exe'
options = Options()
options.headless = True
options.binary = binary
options.set_preference("browser.download.folderList",2)
options.set_preference("browser.download.manager.showWhenStarting", True)
options.set_preference("browser.download.dir", r"C:\Users\jlpyt\Downloads")
driver = webdriver.Firefox(options=options, executable_path=r"C:\Users\jlpyt\geckodriver-v0.27.0-win32\geckodriver.exe")
driver.get('https://www.fangraphs.com/leaders.aspx?pos=all&stats=bat&lg=all&qual=0&type=0&season=2020&month=0&season1=2020&ind=0&team=0&rost=0&age=0&filter=&players=0&startdate=2020-01-01&enddate=2020-12-31')
elem = driver.find_element_by_id('LeaderBoard1_cmdCSV')
elem.click()
Selenium bu kodu kullanarak düğmeye tıklayabilir, ancak indirme başlatılmaz. Selenium'u düğmeyi tıklayıp dosyayı indirmek için kullanabileceğim bir yol var mı ? Ya da aklıma gelmeyen alternatif bir yöntem var mı?
Yanıtlar
Eleman olduğu __doPostBackböylece eleman tıklayın Eğer ikna etmek gerekmez üzere, eleman etkin WebDriverWait için element_to_be_clickable()ve aşağıdakilerden birini kullanabilirsiniz Bulucu Stratejileri :
Kullanarak
ID:WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, "LeaderBoard1_cmdCSV"))).click()Kullanarak
LINK_TEXT:WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.LINK_TEXT, "Export Data"))).click()Kullanarak
CSS_SELECTOR:WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a#LeaderBoard1_cmdCSV"))).click()Kullanarak
XPATH:WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@id='LeaderBoard1_cmdCSV']"))).click()Not : Aşağıdaki içe aktarmaları eklemeniz gerekir:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as ECTarayıcı Anlık Görüntüsü:
Referanslar
Birkaç alakalı tartışmayı şurada bulabilirsiniz:
- javascript __doPostBack için web hurdaya çıkarma td'de bir herf içerir
- Href javascript içerdiğinde sayfa numaralarına nasıl sayfalandırılır: __ doPostBack ()