Парсинг сайтов в 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 можно сделать парсинг сайта.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.