Процесс парсинга усложняется существенными затратами времени на обработку данных. Многопоточность поможет в разы увеличить скорость обработки данных. Сайт для парсинга — «Справочник купюр мира», где получим валюту в соотношении к иным.
Привожу код программы для сокращение времени обработки вдвое.
Импорт
import requests #выполняет HTTP-запросы
from bs4 import BeautifulSoup #работа с HTML
import csv #работа с форматом данных CSV
from multiprocessing import Pool #предоставляет возможность параллельных процессов
Главная процедура
def main():
url = 'http://banknotes.finance.ua/'
links = []
#получение всех ссылок для парсинга с главной страницы
all_links = get_all_links(get_html(url), links)
#обеспечение многопоточности
#функции смотри help
with Pool(2) as p:
p.map(make_all, all_links)
if __name__ == '__main__':
main()
Получение URL
def get_html(url):
r = requests.get(url)
return r.text
Функции многопоточности
def make_all(url):
html = get_html(url)
data = get_page_data(html)
write_csv(data)
Получение URL главной страницы
def get_all_links(html, links):
#очистка содержимого файла - без его удаления
f=open('coin.csv', 'w')
f.close()
#работа с html-кодом, задаются параметры блоков и адрес сайта
soup = BeautifulSoup(html, 'lxml')
href = soup.find_all('div', class_= "wm_countries")
for i in href:
for link in i.find_all('a'):
links += [link['href']]
return links
Парсинг вложенных страниц
def get_page_data(html):
soup = BeautifulSoup(html, 'lxml')
try:
name = soup.find('div', 'pagehdr').find('h1').text
except:
name = ''
try:
massiv_price = [pn.find('b').text for pn in soup.find('div', class_ = 'wm_exchange').find_all('a', class_ = 'button', target = False)]+[pr.text for pr in soup.find('div', class_ = 'wm_exchange').find_all('td', class_ = 'amount')]
if len(massiv_price)==6: massiv_price=massiv_price[0]+massiv_price[3]+massiv_price[1]+massiv_price[4]+massiv_price[2]+massiv_price[5]
elif len(massiv_price)==4:
massiv_price=massiv_price[0]+massiv_price[2]+massiv_price[1]+massiv_price[3]
except:
massiv_price = ''
data = {'name': name, 'price': massiv_price}
return data
Запись файла
def write_csv(data):
with open('coin.csv', 'a') as f:
writer = csv.writer(f)
writer.writerow( (data['name'], data['price']) )
Предложенный код может быть широко использован при парсинге (и не только) с учетом особенностей сайтов.
Автор: SomeOneWhoCares