Использование BeautifulSoup
(или, точнее, использование модуля requests
для проверки связи с веб-сайтом) линейным способом, особенно при многократном использовании, может быть медленным и неэффективным. Я немного изменил ваш код, добавил многопоточность для ускорения выполнения и упростил чтение.
import requests
import concurrent.futures
from bs4 import BeautifulSoup
# Parse the initial 'album' website
req = requests.get(url)
html = req.content
soup = BeautifulSoup(html , 'html.parser')
# Find all song's links in 'album' site - these can be found under
# the 'strong' tab, and 'a' tab
links = [tag.a["href"] for tag in soup.find_all('strong')[1:-3]]
def getLyrics(url):
url = HOST + url # songs are found on the HOST website
# Parse 'song' site
req = requests.get(url)
html = req.content
soup = BeautifulSoup(html , 'html.parser')
# Obtain the lyrics, which can be found under the 'pre' tab
return soup.find('pre').text
# Use multi-threading for faster performance - I'll give a small run down:
# max_workers = number of threads - we use an individual thread for each song
with concurrent.futures.ThreadPoolExecutor(max_workers=len(links)) as executor:
# for every song...
for j in range(len(links)):
# run the 'getLyrics' method on an individual thread and get the lyrics
lyrics = executor.submit(getLyrics, links[j]).result()
# do whatever with the lyrics ... I simply printed them
print(lyrics)
Модуль concurrent.futures
предоставляет хороший интерфейс для многопоточности. Подробнее об этом можно прочитать в его документации - здесь
Конечно, вы можете еще больше измените его, сделайте его еще более эффективным и измените его в соответствии с вашими потребностями - но это должно быть базовым c решением вашего вопроса.