Используйте python для асинхронной загрузки файлов, не зная заранее URL - PullRequest
0 голосов
/ 04 октября 2019

Я создаю веб-браузер, который загружает рецепты с веб-сайта. Я сделал это синхронно, и он работает не так быстро, как ожидалось. Поэтому я хотел бы делать асинхронные загрузки. Веб-сайт имеет древовидную структуру. Поэтому я написал функцию, которая итеративно переходит в подпапку, пока в ответе не будет найдена ссылка pdf. Затем вызывается download_pdf (pdflink) , который загружает PDF и сохраняет его в той же древовидной структуре на моем рабочем столе. Я хотел бы сделать эту функцию неблокирующей / асинхронной. Я обнаружил, что существует grequest для выполнения асинхронных запросов, но я понятия не имею, как применить это здесь, где я заранее не знаю URL.

Упрощенный код:

def iterative_link_search(url, path=""):

    response = get_request(url)

    if "<th class=\"col-5\">PDF</th>" in response:
        download_pdf(response, path)

    else:
        soup = BeautifulSoup(response, 'html.parser')
        div = soup.find('div', {'class': 'section'})

        links = []
        for a in div.find_all('a'):
            links.append(Link(a.contents[0], a.get('href')))

        for link in links:
            iterative_link_search(link.href, path + "\\" + link.name)

def download_pdf(pdf_link, path):

    if not os.path.exists(path):
        os.makedirs(path)

    recipe = get_request(pdf_link, True)
    open(path + '/' + name + '.pdf', 'wb').write(recipe.content)
...