Как стать автором
Поиск
Написать публикацию
Обновить

Реализация на Python многопоточной обработки данных для парсинга сайтов

Время на прочтение2 мин
Количество просмотров28K
Процесс парсинга усложняется существенными затратами времени на обработку данных. Многопоточность поможет в разы увеличить скорость обработки данных. Сайт для парсинга — «Справочник купюр мира», где получим валюту в соотношении к иным.

Привожу код программы для сокращение времени обработки вдвое.

Импорт


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']) )

Предложенный код может быть широко использован при парсинге (и не только) с учетом особенностей сайтов.
Теги:
Хабы:
Всего голосов 29: ↑16 и ↓13+3
Комментарии16

Публикации

Ближайшие события