python - 헤드리스 모드에서 Chrome을 통해 파일 다운로드




selenium google-chrome (2)

Cromedrive에서 '정상'모드로 코딩하고 제대로 작동합니다. 헤드리스 모드로 변경하면 파일이 다운로드되지 않습니다. 인터넷에서 찾은 코드를 이미 시도했지만 작동하지 않았습니다.

chrome_options = Options()
chrome_options.add_argument("--headless")
self.driver = webdriver.Chrome(chrome_options=chrome_options, executable_path=r'{}/chromedriver'.format(os.getcwd()))
self.driver.set_window_size(1024, 768)
self.driver.command_executor._commands["send_command"] = ("POST", '/session/$sessionId/chromium/send_command')

params = {'cmd': 'Page.setDownloadBehavior', 'params': {'behavior': 'allow', 'downloadPath': os.getcwd()}}
self.driver.execute("send_command", params)

누구나이 문제를 어떻게 해결할 수 있는지 알고 있습니까? 추신 : Chomedrive를 반드시 사용할 필요는 없습니다. 다른 드라이브에서 작동하면 괜찮습니다.


먼저 해결책

최소 전제 조건 :

이 웹 사이트 에서 텍스트가 데이터 다운로드 인 요소를 클릭하여 파일을 다운로드하려면 다음 솔루션을 사용할 수 있습니다.

  • 코드 블록 :

    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
    from selenium.webdriver.chrome.options import Options
    
    options = Options()
    options.add_argument("--headless")
    options.add_argument("--window-size=1920,1080")
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe', service_args=["--log-path=./Logs/DubiousDan.log"])
    print ("Headless Chrome Initialized")
    params = {'behavior': 'allow', 'downloadPath': r'C:\Users\Debanjan.B\Downloads'}
    driver.execute_cdp_cmd('Page.setDownloadBehavior', params)
    driver.get("https://www.mockaroo.com/")
    driver.execute_script("scroll(0, 250)"); 
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button#download"))).click()
    print ("Download button clicked")
    #driver.quit()
  • 콘솔 출력 :

    Headless Chrome Initialized
    Download button clicked
  • 파일 다운로드 스냅 샷 :

세부

Headless Chromium 을 통한 파일 다운로드는 Headless Chrome 이 도입 된 이후 가장 많이 찾는 기능 중 하나입니다.

그 이후로 다른 기고자들이 발표 한 다른 해결 방법이 있었고 그 중 일부는 다음과 같습니다.

좋은 소식은 Chromium 팀이 Headless Chromium 통해 파일 다운로드 기능의 도착을 공식적으로 발표 한 것입니다.

토론에서 헤드리스 모드는 @eseckler 언급 한 파일 다운로드를 저장하지 않습니다 .

헤드리스의 다운로드는 약간 다르게 작동합니다. 다운로드 폴더를 설정하는 Page.setDownloadBehavior devtools 명령이 있습니다. 우리는 DevTools 네트워크 차단을 사용하여 DevTools를 통해 다운로드 한 파일을 스트리밍하는 방법을 연구하고 있습니다.

자세한 내용은 이슈 696481 : 헤드리스 모드에서 파일 다운로드를 저장하지 않습니다

마지막으로 @bugdroid 개정이 문제를 해결 한 것으로 보입니다.

[ChromeDriver] 파일을 다운로드 할 수있는 헤드리스 모드 지원 추가

이전에는 헤드리스 모드로 실행중인 Chromedriver가 기본 설정 파일을 드물게 구문 분석하기 때문에 파일을 제대로 다운로드하지 못했습니다. 헤드리스 크롬 팀의 엔지니어는 DevTools의 "Page.setDownloadBehavior"를 사용하여이 문제를 해결하도록 권장했습니다. 이 변경 목록은이 수정 사항을 구현합니다. 다운로드 한 파일은 현재 디렉토리로 기본 설정되며 chromedriver 인스턴스를 인스턴스화 할 때 download_dir을 사용하여 설정할 수 있습니다. 또한 적절한 다운로드 기능을 보장하기위한 테스트가 추가되었습니다.

여기 revisioncommit

ChromeDriver v77.0.3865.40 (2019-08-20) 릴리스 정보 :

Resolved issue 2454: Headless mode doesn't save file downloads [Pri-2]

해결책

아우트로

그러나 Mac OSX 사용자는 Chromedriver 로 파이를 기다립니다. MacOSX에서 Page.setDownloadBehavior를 전송하면 헤드리스 크롬이 충돌 합니다.


콘텐츠를 다운로드하기 위해 브라우저를 사용해야한다고 생각하지 않으며 Chrome 개발자 / 테스터에게 맡기십시오.

다운로드하려는 요소의 href 속성 을 가져 와서 요청 라이브러리를 사용하여 가져 와야한다고 생각합니다.

사이트에 인증이 필요한 경우 브라우저 인스턴스에서 cookies 를 가져와 requests.Session 전달할 수 있습니다.





google-chrome-headless