Я создаю веб-браузер, который загружает рецепты с веб-сайта. Я сделал это синхронно, и он работает не так быстро, как ожидалось. Поэтому я хотел бы делать асинхронные загрузки. Веб-сайт имеет древовидную структуру. Поэтому я написал функцию, которая итеративно переходит в подпапку, пока в ответе не будет найдена ссылка 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)