복붙노트

[PYTHON] Python과 PhantomJS에서 Selenium을 사용하여 파일 시스템에 파일 다운로드

PYTHON

Python과 PhantomJS에서 Selenium을 사용하여 파일 시스템에 파일 다운로드

필자는 PhantomJS / Selenium / python-selenium을 사용하여 파일 시스템에 파일을 다운로드하려고합니다. 나는 쉽게 DOM을 탐색하고 클릭 등을 할 수 있습니다. 그러나 파일을 다운로드하는 것은 상당히 번거로운 것으로 증명됩니다. 파이어 폭스와 pyvirtualdisplay와 헤드리스 접근 방식을 시도했지만 잘 작동하지 않았으며 믿을 수 없을 정도로 느린했다. CasperJS가 파일 다운로드를 허용한다는 것을 알고 있습니다. 누구든지 CasperJS를 Python과 통합하거나 PhantomJS를 사용하여 파일을 다운로드하는 방법을 알고 있습니까? 매우 감사.

해결법

  1. ==============================

    1.이 질문이 꽤 오래되었지만 PhantomJS를 통해 파일을 다운로드하는 것은 여전히 ​​문제입니다. 그러나 우리는 PhantomJS를 사용하여 다운로드 링크를 얻고 csrf 토큰과 같은 모든 필요한 쿠키를 가져올 수 있습니다. 그리고 요청을 실제로 다운로드 할 수 있습니다.

    이 질문이 꽤 오래되었지만 PhantomJS를 통해 파일을 다운로드하는 것은 여전히 ​​문제입니다. 그러나 우리는 PhantomJS를 사용하여 다운로드 링크를 얻고 csrf 토큰과 같은 모든 필요한 쿠키를 가져올 수 있습니다. 그리고 요청을 실제로 다운로드 할 수 있습니다.

    import requests
    from selenium import webdriver
    
    driver = webdriver.PhantomJS()
    driver.get('page_with_download_link')
    download_link = driver.find_element_by_id('download_link')
    session = requests.Session()
    cookies = driver.get_cookies()
    
    for cookie in cookies: 
        session.cookies.set(cookie['name'], cookie['value'])
    response = session.get(download_link)
    

    그리고 지금 응답 .content 실제 파일 내용이 나타나야합니다. 우리는 다음에 그것을 공개적으로 쓰거나 우리가 원하는대로 할 수 있습니다.

  2. ==============================

    2.PhantomJS는 현재 파일 다운로드를 지원하지 않습니다. 대안 관련 문제 :

    PhantomJS는 현재 파일 다운로드를 지원하지 않습니다. 대안 관련 문제 :

    내가 아는 한 적어도 3 가지 옵션이 있습니다.

    다음과 같은 링크도 있습니다.

  3. ==============================

    3.필자의 유스 케이스에서는 파일을 가져 오기 위해 양식을 제출해야했습니다. 드라이버의 execute_async_script () 함수를 사용하여이 작업을 수행 할 수있었습니다.

    필자의 유스 케이스에서는 파일을 가져 오기 위해 양식을 제출해야했습니다. 드라이버의 execute_async_script () 함수를 사용하여이 작업을 수행 할 수있었습니다.

     js = '''
        var callback = arguments[0];
        var theForm = document.forms['theFormId'];
        data = new FormData();
        data.append('eventTarget', "''' + target + '''"); // this is the id of the file clicked
        data.append('otherFormField', theForm.otherFormField.value);
    
        var xhr = new XMLHttpRequest();
        xhr.open('POST', theForm.action, true);
    '''
    
    for cookie in driver.get_cookies():
        js += ' xhr.setRequestHeader("' + cookie['name'] + '", "' + cookie['value'] + '"); '
    
    js += '''
        xhr.onload = function () {
            callback(this.responseText);
        };
        xhr.send(data);
    '''
    
    driver.set_script_timeout(30)
    file = driver.execute_async_script(js)
    
  4. ==============================

    4.그런 식으로는 불가능합니다. 다른 대안을 사용하여 wget o curl과 같은 파일을 다운로드 할 수 있습니다.

    그런 식으로는 불가능합니다. 다른 대안을 사용하여 wget o curl과 같은 파일을 다운로드 할 수 있습니다.

    파이어 폭스를 사용하여 적절한 요청과 셀레늄을 찾아 그 값을 얻고 마침내 상자를 사용하여 파일을 다운로드하십시오.

    curlCall=" curl 'http://www_sitex_org/descarga.jsf' -H '...allCurlRequest....' > file.xml"
    subprocess.call(curlCall, shell=True)
    
  5. from https://stackoverflow.com/questions/25755713/using-selenium-with-python-and-phantomjs-to-download-file-to-filesystem by cc-by-sa and MIT license