Парсинг сайтов в Python
			Одной из самых частых задач в Python, да и не только в нем, является парсинг какого-либо сайта. Сделать средствами Python это достаточно просто и удобно и далее я Вам покажу как.
Код:
# файл site_parser.py
import requests               # библиотека для работы с http запросами
from bs4 import BeautifulSoup # разбор html
import time                   # работа со временем
import logging                # логирование
# шаблон URL у которого меняется идентификатор
URL = 'https:/example.com/post/%d'
# заголовки запроса, представляемся браузером Firefox/45 на Mac OS
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:45.0) Gecko/20100101 Firefox/45.0'
}
# файл, куда будут сохраняться логи
logging.basicConfig(filename="parser.log")
def parse(start=1, limit=10):
    """
        Данная функция непосредственно предназначена для парсинга.
        Параметр start и limit - идентификаторы запроса - от и до.
    """
    # делим больую выгрузку на меньшие части
    # и записываем в файл
    f = open('parsed/parsed_{start}_{limit}.csv'.format(start=start, limit=limit), 'a', encoding='utf-8')
    # генерируем id из заданного диапазона
    for counter in range(start, limit):
        try:
            # отправляем запрос на сервер
            req = requests.get(URL % counter, headers=headers)
        
        # логируем ошибки с помощью встроенного модуля
        # и переходим на следующую итерацию
        except requests.ConnectionError as e:
            logging.error('Id={id}; message={message}'.format(id=counter, message=str(e)))
            continue
        except requests.Timeout as e:
            logging.error('Id={id}; message={message}'.format(id=counter, message=str(e)))
            continue
        except requests.RequestException as e:
            logging.error('Id={id}; message={message}'.format(id=counter, message=str(e)))
            continue
    
        # если статус не равен 404, т.е. страница найдена
        if req.status_code != 404:
            
            # создаем объект html парсера
            soup = BeautifulSoup(req.text, 'lxml')
            
            # и получаем нужный div блок с контентом
            info = soup.find('div', {'class': 'block_cont'})
            
            # форматируем строку по желанию
            text = 'ID' + str(counter) + '; ' + info.text.replace('  ', '').strip().replace('\n', ';')
            
            # выводим в консоль
            print(text)
            
            # записываем в файл
            f.write(text + '\n')
            
            # останавливаем поток на 10мс
            time.sleep(0.1)
    f.close()
# создает диапазоны id
def create_ranges(start, stop, step):
    return [[i, i + step - 1] for i in range(start, stop, step)]
    
    Файл main.py
from site_parser import parse, create_ranges # импортируем наши функции
from threading import Thread                 # импортируем класс Thread для работы с потоками
# создаем поток 
def create_thread(start, limit):
    # параметр target - наша функция для парсинга, args - кортеж аргументов для нее
    thread = Thread(target=parse, args=(start, limit))
    thread.start() # запускаем поток
    # thread.join()
def execute():
    
    # создаем диапазоны идентификаторов
    ranges = create_ranges(1, 100000, 10000)
    for rng in ranges:
        # запускаем поток
        create_thread(*rng)
# запускаем программу
if __name__ == '__main__':
    execute()
    
    Запускаем так:
C:\> python main.py
    
    Программа начинает выгружать информацию в несколько потоков и отображать вывод в консоль.
Вот так просто на Python можно сделать парсинг сайта.
- 
					Создано 14.04.2020 13:33:57
					 - 
					
					Михаил Русаков				 
			
		
			
				
				
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.