Я использую BeautifulSoup, чтобы очистить некоторую основную информацию от множества страниц Википедии. Программа работает, но медленно (около 20 минут на 650 страниц). Я пытаюсь использовать многопроцессорность, чтобы ускорить это, но это не работает, как ожидалось. Кажется, что он либо задерживается и ничего не делает, либо выполняет только первые буквы имени каждой страницы.
Используемый код очистки:
#dict where key is person's name and value is proper wikipedia url formatting
all_wikis = { 'Adam Ferrara': 'Adam_Ferrara',
'Adam Hartle': 'Adam_Hartle',
'Adam Ray': 'Adam_Ray_(comedian)',
'Adam Sandler': 'Adam_Sandler',
'Adele Givens': 'Adele_Givens'}
bios = {}
def scrape(dictionary):
for key in dictionary:
#search each page
page = requests.get(("https://en.wikipedia.org/wiki/" + str(key)))
data = page.text
soup = BeautifulSoup(data, "html.parser")
#get data
try:
bday = soup.find('span', attrs={'class' : 'bday'}).text
except:
bday = 'Birthday Unknown'
try:
birthplace = soup.find('div', attrs={'class' : 'birthplace'}).text
except:
birthplace = 'Birthplace Unknown'
try:
death_date = (soup.find('span', attrs={'style' : "display:none"}).text
.replace("(", "")
.replace(")", ""))
living_status = 'Deceased'
except:
living_status = 'Alive'
try:
summary = wikipedia.summary(dictionary[key].replace("_", " "))
except:
summary = "No Summary"
bios[key] = {}
bios[key]['birthday'] = bday
bios[key]['home_town'] = birthplace
bios[key]['summary'] = summary
bios[key]['living_status'] = living_status
bios[key]['passed_away'] = death_date
IЯ пытался добавить обработку в конец сценария, используя приведенный ниже код, но он не работает или вытягивает только первую букву каждой страницы (например, если я ищу страницу Брюса Ли, вместо этогооткройте страницу Википедии, чтобы найти букву B, а затем выдавите кучу ошибок).
from multiprocessing import Pool, cpu_count
if __name__ == '__main__':
pool = Pool(cpu_count())
results = pool.map(func=scrape, iterable=all_wiki)
pool.close()
pool.join()
Есть ли лучший способ структурировать мой сценарий для многопроцессорной обработки?