Selenium을 사용하여 "javascript : __ doPostBack ( 'LeaderBoard1 $ cmdCSV', '')"을 클릭하여 파일을 다운로드하십시오.

Sep 12 2020

자동화를 통해 다운로드하고 싶은 야구 통계의 CSV 파일이 많이 있습니다. 다음 위치에서 찾을 수 있습니다. 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. 테이블을 CSV로 다운로드하는 버튼은 '데이터 내보내기'라는 레이블이 지정됩니다.

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>

아시다시피 버튼은 다운로드 페이지로 리디렉션되는 것이 아니라 (이 경우 requests파일을 다운로드하는 데 사용될 수 있음) 프로세스입니다.

암호:

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 은 버튼을 클릭 할 수 있지만 다운로드가 시작되지 않습니다. Selenium 을 사용 하여 버튼을 클릭하고 파일을 다운로드 할 수있는 방법이 있습니까? 아니면 내가 생각하지 못한 대체 방법이 있습니까?

답변

1 DebanjanB Sep 12 2020 at 21:01

요소입니다 __doPostBack그래서 요소를 클릭하면 유도 할 필요가하는 요소를 활성화 WebDriverWait을 을 위해 element_to_be_clickable()당신은 다음 중 하나를 사용할 수 있습니다 로케이터 전략 :

  • 사용 ID:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, "LeaderBoard1_cmdCSV"))).click()
    
  • 사용 LINK_TEXT:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.LINK_TEXT, "Export Data"))).click()
    
  • 사용 CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a#LeaderBoard1_cmdCSV"))).click()
    
  • 사용 XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@id='LeaderBoard1_cmdCSV']"))).click()
    
  • 참고 : 다음 가져 오기를 추가해야합니다.

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
  • 브라우저 스냅 샷 :


참고 문헌

다음에서 몇 가지 관련 토론을 찾을 수 있습니다.

  • 자바 스크립트에 대한 웹 스크랩 __doPostBack은 td에 herf를 포함합니다.
  • href에 javascript : __ doPostBack ()이 포함되어있을 때 페이지 번호를 페이지 매김하는 방법