Files
ipars/README.md
T

226 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Библиотека для работы с файлами во время парсинга
Во время парсинга часто приходится скачивать html-страницы, работать с json- и csv-файлами. Эта библиотека призвана облегчить написание кода для такого рода задач. Библиотека создавалась для удобства работы во время парсинга, но ничто не мешает использовать её просто для работы с json, csv и прогресс-барами.
В библиотеке есть три класса для отдельных работ: Pars для работы с запросами и bs4, JsonManager для работы с json и CsvManager для работы с csv. Так же есть один класс для улучшения пользовательского опыта — ProgressBarManager, который создаёт прогресс-бар
Установить библиотеку:
```bash
pip install ipars
```
## Работа с Pars
Класс Pars не принимает никаких данных для конструкторов.
```python
from ipars import Pars
p = Pars()
```
### Коротко о методах:
1. Метод **getStaticPage** принимает url страницы, путь, по которому сохранится страница, метод записи и заголовки запроса. Метод записи «wb» используется для сохранения картинок, по умолчанию writeMethod установлен как «w», что используется для html-страниц. Если заголовки запросов не указаны, то будут использоваться заголовки со случайным user-agent. Метод возвращает статус ответа сайта, что должно использоваться для введения проверок
2. Метод **getDynamicPage** с помощью библиотеки Selenium получает динамически обновляемую страницу. Это помогает, когда контент на странице подгружается динамически. Принимает url страницы, путь сохранения, closeWindow и timeSleep. По умолчанию браузер Selenium открывается в фоновом режиме, и работу браузера не видно, но если closeWindow указать как False, то будет виден процесс выполнения кода. С помощью timeSleep можно увеличить время загрузки страницы если контент на ней долго подгружается
3. Метод **gpsa** (get page semi-automatically) похож на метод getDynamicPage, но работает в полуавтоматическом режиме. Он открывает страницу сайта и ждёт пока не будет нажат Enter в терминале. В этот момент можно зарегистрироваться на сайте и/или перейти на нужную вкладку сайта, после чего нажать Enter и метод спарсит страницу. Подходит для лент соцсетей, где неавторизованным пользователям контент ограничен. Принисает такие же аргументы для таких же целей, что и getDynamicPage, за исключением closeWindow
4. Метод **returnBs4Object** возвращает объект beautifulsoup4. Принимает путь до html-страницы, содержимое которой преобразует в объект beautifulsoup, кодировку открытия файла (по умолчанию UTF-8) и тип парсера (по умолчанию lxml).
5. Метод **getAttributes** нужена чтобы получить список атрибутов из списка объектов bs4. Принимает список объектов bs4 и название атрибута который будет извлекаться из элементов списка
6. Метод **getTexts** нужена чтобы получить список текста из списка объектов bs4. Принимает список объектов bs4 и параметр needFix. Если этот параметр установлен как True, то из текста будут удалены \n, \t и пробелы с концов
7. Метод **pprint** используется для вывода значений переменных у которых большая вложеность. Например, если у Вас есть массив объектов, где в качестве значения ключа используется другой массив объектов
8. Метод **mkdir** используется для создания папки с именем _nameDir_ если она ещё не существует
Пример парсера с использованием ipars:
```py
# О классе ProgressBarManager читай ниже
from ipars import Pars, ProgressBarManager
p = Pars()
nameFile = 'index.html'
# Получаем html страницу
p.getDinamicPage(nameFile, 'https://duckduckgo.com/?q=теплица+социальных+технологий+youtube&iar=videos&atb=v454-1', closeWindow=0)
# Получаем объект BautifullSoup
soup = p.returnBs4Object(nameFile)
# Находим все карточки ответов
# Первые результаты выдачи те что хотелось получить, а остальные нет. Поэтому нам желательно получить первые 84 элемента
allCards = soup.find_all(class_='b_NgmZrVnRtV8MZMEjLs')[:84]
# Получаем все изображения
allImg = [card.find('img') for card in allCards]
# Получаем все ссылки
allSrc = p.getAttributes(allImg, 'src')
# Создаём папку img если её ещё нет
nameFolder = 'img'
p.mkdir(nameFolder)
# Создаём объект ProgressBarManager
bar = ProgressBarManager(len(allSrc))
# Скачиваем картинки
for index, url in enumerate(allSrc):
url = 'https:' + url
p.getStaticPage(f'./{nameFolder}/img{index}.png', url, writeMethod='wb')
bar.next()
bar.finish()
```
Пример использование методов _getAttributes_ и _getTexts_
```py
from ipars import Pars
p = Pars()
p.getStaticPage('./index.html', 'https://google.com')
soup = p.returnBs4Object('./index.html')
allTegA = soup.find_all('a')
a1 = p.getTexts(allTegA, needFix=1)
p.pprint(a1)
a2 = p.getAttributes(allTegA, 'href')
p.pprint(a2)
```
## Работа с JsonManager
JsonManager принимает принимает только один аргумент — кодировку в которой будут читаться файлы. По умолчанию это UTF-8
```py
from ipars import JsonManager
j = JsonManager()
```
### Коротко о методах
1. Метод **load** используется для получения данных из json-файла по указанному пути
2. Метод **dump** используется для записи данных в json-файл. Принимает путь до файла и данные для записи
3. Метод **pprint** такой же как и у Pars
```py
from ipars import JsonManager
j = JsonManager()
# Записываем данные
j.dump('./data.json', [1, 2, 3, 4, 5, 6, 7])
# Получаем данные
data = j.load('./data.json')
j.pprint(data) # [1, 2, 3, 4, 5, 6, 7]
```
## Работа с CsvManager
Класс CsvManager принимает три аргумента: символ переноса на новую строку _newline_ (по умолчанию — это пустая строка), кодировку открываемых файлов _encoding_ (по умолчанию UTF-8) и разделитель который используется в csv файле _delimiter_ (по умолчанию ";")
```py
from ipars import CsvManager
c = CsvManager()
```
### Коротко о методах
1. Метод **writerow** записывает строку с csv файл. Метод принимает путь до csv файла, метод записи и список данных которые будут записанн в строку файла
2. Метод **writerows** принимает теже самые аргументы что и writerow, только row должен быть двойным списком с данными для записи. Разница между этими методами в том что writerow записывает одну, а writerows столько сколько есть в двойном списке
3. Метод **getRows** используется для получения списка строк в csv файле. Метод принимает путь до файла откуда будут получены строки
4. Метод **pprint** такой же как и у Pars
```py
from ipars import CsvManager
c = CsvManager()
# записываем заголовки
writer = c.writerow('./data.csv', 'w', ['Количество', 'Цена', 'Итог'])
# записываем данные
writer = c.writerows('./data.csv', 'a', [
["5", "5", "25"],
["6", "6", "36"],
["7", "7", "49"],
])
# получаем строки из таблицы
rows = c.getRows('./data.csv')
# выводим строки таблицы
c.pprint(rows)
```
## Работа с ProgressBarManager
Класс создаёт прогресс-бар для лучшей видимости выполнения кода. Принимает пять аргументов:
1. **max**: обязательный параметр, который указывает максимальное значение итераций в прогресс-баре
2. **message**: сообщение перед прогресс-баром
3. **color**: цвет прогресс-бара
4. **fill**: заполнитель для сделанной части
5. **width**: размер прогресс-бара в символах
```py
from ipars import ProgressBarManager
bar = ProgressBarManager(100) # Здесь max установлен как 100
```
### Коротко о методах
1. Метод **next** запускает следущую итерацию прогресс-бара
2. Метод **finish** завершает работу прогресс-бара
```py
# Импортируем библиотеки
from ipars import ProgressBarManager
from time import sleep
maxValue = 300
# Создаём прогресс-бар по умолчанию
bar = ProgressBarManager(maxValue)
# Имитируем работу
for _ in range(maxValue//2):
sleep(0.1)
bar.next()
# Выключаем прогресс-бар
bar.finish()
# Создаём более кастомизированный прогресс-бар
bar = ProgressBarManager(
maxValue,
message='Процесс скачивания',
color='red',
width=50
)
# Имитируем работу
for _ in range(maxValue):
sleep(0.1)
bar.next()
# Выключаем прогресс-бар
bar.finish()
```