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

в 11:50, , рубрики: python, многопоточность, парсинг

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

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

Импорт

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

Источник

Поделиться

* - обязательные к заполнению поля