Как я могу скачать файл, используя pyQt 5 webengine с кодом скрипта python? - PullRequest
0 голосов
/ 30 апреля 2018

так что я хочу сделать автоматическую загрузку, когда получу какую-нибудь ссылку, скажем, ссылка: http://test.com/somefile.avi

import os
import sys
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget, QWidgetAction
from PyQt5.QtCore import QUrl, QEventLoop
from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEngineProfile, QWebEngineDownloadItem, QWebEnginePage


class WebPage(QWebEngineView):
    def __init__(self):
        QWebEngineView.__init__(self)
        self.load(QUrl("http://test.com"))
        self.loadFinished.connect(self._on_load_finished)
        self.n = 0

    def _on_load_finished(self):
        print("Finished Loading")
        self.page().toHtml(self.Callable)

    def Callable(self, html_str):
        self.html = html_str
        self.load(QUrl(userInput))

if __name__ == "__main__":
    userInput = input()
    app = QApplication(sys.argv)
    web = WebPage()

, за исключением того, что у меня есть только страница 'test.com', но я не могу получить файл 'somefile.avi', возможно ли сделать его автозагрузкой после ввода 'http://test.com/somefile.avi' в консоль?

Спасибо

1 Ответ

0 голосов
/ 30 апреля 2018

Ниже приведен фрагмент кода, как это сделать с библиотекой requests

ОТКАЗ

Этот пример был сделан с requests, сторонней библиотекой Python и , а не с PyQt, как изначально предполагалось для asker.

import requests
import shutil

def download(url):

    # gets the filename from the url, and
    # creates the download file absolute path
    filename = url.split("/")[-1]
    path = "downloads/" + filename

    # Defines relevant proxies, see `requests` docs
    proxies = {
      'http': 'http://10.10.1.10:3128',
      'https': 'http://10.10.1.10:1080',
    }

    # Add proxies, and leave `stream=True` for file downloads
    r = requests.get(url, stream=True, proxies=proxies)
    if r.status_code == 200:
        with open(path, 'wb') as f:
            r.raw.decode_content = True
            shutil.copyfileobj(r.raw, f)
    else:
        # Manually raise if status code is anything other than 200
        r.raise_for_status()


download('http://test.com/somefile.avi')

Edit:

pac файлы не работают "из коробки" ни с одной из распространенных библиотек веб-запросов python, однако пользователь SO @CarsonLam предоставил ответ здесь , который пытается решить эту проблему.

Библиотека pypac предоставляет поддержку для этого, и, поскольку она наследует от requests объектов, она будет работать с нашим существующим кодом. Некоторые дополнительные примеры можно найти здесь здесь .

С pac-файлом прокси, я думаю, что-то вроде этого было бы подходящим способом;

from pypac import PACSession, get_pac
import shutil

def download(url):

    # gets the filename from the url, and
    # creates the download file absolute path
    filename = url.split("/")[-1]
    path = "downloads/" + filename

    # looks for a pac file at the specified url, and creates a session
    # this session inherits from requests.Session
    pac = get_pac(url='http://foo.corp.local/proxy.pac')
    session = PACSession(pac)

    # Add proxies, and leave `stream=True` for file downloads
    session = requests.get(url, stream=True)
    if r.status_code == 200:
        with open(path, 'wb') as f:
            r.raw.decode_content = True
            shutil.copyfileobj(r.raw, f)
    else:
        # Manually raise if status code is anython other than 200
        r.raise_for_status()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...