Câu hỏi Sử dụng Selenium với Python và PhantomJS để tải tệp xuống hệ thống tệp


Tôi đã vật lộn với việc sử dụng PhantomJS / Selenium / python-selenium để tải tệp xuống hệ thống tệp. Tôi có thể dễ dàng điều hướng thông qua DOM và nhấp chuột, di chuột vv Tải xuống tệp là, tuy nhiên, chứng minh là khá phiền hà. Tôi đã thử một cách tiếp cận không đầu với Firefox và pyvirtualdisplay nhưng điều đó cũng không hoạt động tốt và chậm đáng kinh ngạc. Tôi biết rằng CasperJS cho phép tải xuống tệp. Có ai biết làm thế nào để tích hợp CasperJS với Python hoặc làm thế nào để sử dụng PhantomJS để tải các tập tin. Nhiều đánh giá cao.


19
2017-09-10 00:49


gốc




Các câu trả lời:


Mặc dù câu hỏi này khá cũ, tải xuống tệp thông qua PhantomJS vẫn là một vấn đề. Nhưng chúng tôi có thể sử dụng PhantomJS để tải xuống liên kết và tìm nạp tất cả các cookie cần thiết như thẻ csrf và v.v. Và sau đó chúng ta có thể sử dụng requests để tải xuống thực tế:

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)

Và bây giờ trong response.content nội dung tệp thực tế sẽ xuất hiện. Chúng ta có thể viết tiếp với open hoặc làm bất cứ điều gì chúng ta muốn.


15
2018-02-27 04:56





PhantomJS hiện không hỗ trợ tải xuống tệp. Các vấn đề có liên quan với cách giải quyết:

Theo tôi hiểu, bạn có ít nhất 3 tùy chọn:

  • chuyển sang casperjs (và bạn nên để lại python ở đây)
  • thử với không đầu xvfb
  • chuyển sang trình duyệt thông thường không có đầu

Đây cũng là một số liên kết có thể giúp bạn:


11
2017-09-10 03:43



Có vẻ như khả năng tải xuống tệp đã được thêm vào PhantomJS (bao gồm các nhận xét về hiệu ứng đó trong chuỗi bạn đã liên kết với). Tuy nhiên, tôi không chắc chắn điều này được tiếp xúc trong một cách dễ dàng sử dụng trong Selenium. - John Y


Trường hợp sử dụng của tôi yêu cầu gửi biểu mẫu để truy xuất tệp. Tôi đã có thể thực hiện điều này bằng cách sử dụng execute_async_script() chức năng.

 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)

3
2017-12-20 15:06





Không phải là posible theo cách đó. Bạn có thể sử dụng các lựa chọn thay thế khác để tải xuống các tệp như wget o curl.

Sử dụng firefox để tìm đúng yêu cầu và selen để lấy các giá trị cho điều đó và cuối cùng sử dụng ra khỏi hộp để tải xuống tệp

curlCall=" curl 'http://www_sitex_org/descarga.jsf' -H '...allCurlRequest....' > file.xml"
subprocess.call(curlCall, shell=True)

-1
2018-02-28 17:14