Web scraping with Python

Published by @zverok on 2020-02-07

То что тебя интересует, называется примерно web scraping. Проще и быстрее всего его начать делать на Питоне — потому что он везде, и по нему куча готовых рецептов, библиотек и туториалов, и сам язык легко подобрать по крайней мере для базового использования.

Disclaimer: я не даю никаких конкретных названий библиотек и ссылок — во-первых потому что Питон не мой основной язык, и мои знания могут быть неполны/устарели; во-вторых потому что инфы полный интернет, и как правило открыв пару страниц из гугла по очевидным кейвордам ты подберёшь намного более приятные и подходящие лично тебе объяснения чем «вот по этой ссылке которую дал знакомый».

Короче, базово, то что «пойдёт куда-то (в Интернет), вытащит оттуда инфу и сложит её локально (чтобы потом её обработать)» будет выглядеть как-то типа

Запрос данных

```python page = some_http_library.get(‘http://some.address/in/internet’) # 2 # самый тупой и часто неудобный вариант — просто текстовый поиск в коде страницы: title = re.search(r’BOOK TITLE: .*’, page.body) # 3

в большинстве случаев код страницы чем-то парсят, чтобы можно было делать так:

structured = Parse(page.body) for link in structured.find_all(‘a’, class_=’chapter’): # 4 print link.title

потом найденное надо куда-то сложить, но об этом чуть позже

```

С чем здесь придётся разобраться (поначалу — минимально, «самый необходимый минимум чтобы делать то что тебя интересует», но держать в уме что постепенно придётся погружаться):

  1. Сам Питон. Есть много разных туториалов и книжек, возможно хватит буквально нескольких блог-постов; в любом случае полезно держать под рукой его официальный референс чтобы уточнять «что это за херня». Там же кстати есть и официальный туториал, длинный но вполне приличный. Грубо говоря, тебе поначалу не нужен «весь язык и все его особенности», а базовые понятия чтобы структурировать свой код: переменные-условия-циклы-функции; плюс кое-какое преставление (можно чисто теоретическое) о классах и модулях, чтобы узнавать то что написано в краткой справке «как использовать эту либу»
  2. Как делать запросы в интернете. В очень многих базовых случаях достаточно some_http_library.get(url), но в разные моменты там будут встречаться усложнения типа (отсортировано по мере усложнения/маловероятности что это сходу понадобится): * нужно забрать несколько адресов заканчивающихся на ?foo=<1,2,3,...> — представлять как это называется (разные части URL) и как их аккуратно собирать * многие страницы могут быть доступны только после отправки какой-то формы, это означает что запрос не GET, а POST, и в нём надо правильно передать данные… * где-то надо залогиниться перед тем как получать данные, это значит — отправить какую-то форму с данными логина, сохранить в переменной полученный контекст, и передавать его с каждым следующим запросом * где-то сайт устроен сложно, и то что ты видишь в браузере — это НЕ то что вернёт get(адрес), и возможно придётся научиться в инспекторе браузера смотреть откуда оно реально грузит данные * какие-то сайты вообще не получится обработать ничем кроме реального полноценного браузера — для этого тоже есть решения (из питона запускается копия Chrome, и ему передаются команды «пойди на тот сайт, кликни ту кнопку, а теперь выделить и скопировать вот эту часть страницы»)
  3. «Регулярные выражения» — это маленькая, но запутанная тема, незаменимая при обработке текста. Грубо говоря, всякие паттерны вида Title: .+ (\d)? — это читается: соответствует любая строка, в которой сначала буквально Title: , потом любой символ (.), повторённый 1 или более раз (+), а потом цифра (\d), но необязательно (?), запомнить эту цифру (()) :)
  4. Как выглядит код веб-страниц изнутри, и как по нему структурировано навигировать (скоре всего частично ты это уже знаешь, все эти теги и аттрибуты), и как в браузере посмотреть на код страницы и предположить как найти на ней нужную штуку.

Сохранение и обработка данных

То что вытащено из интернетов для дальнейшей обработки сохраняют просто в текстовые файлы — или в свободной форме (просто каждая строчка это твои данные), или в CSV (таблица, в каждой строчке одинаковое количество ячеек с одинаковым смыслом), или YAML/JSON (структурированные данные вида {ключ: значение}, могут иметь любую вложенность).

Для бОльшей части того что ты захочешь делать в первые несколько месяцев, этого (текстовых файлов) и базового Питона (фильтрация/сортировка/преобразование массивов) хватит с головой, и будет хорош и прельстиво.

В перспективе — у Питона есть огромные экосистемы для а) работы со сложными табличными данными (типа загрузить таблицу на миллион строк и сотню колонок, и посчитать/сравнить/отобрать какую-то нужную часть) и б) всякой ~магии~ интеллектуальной и нечёткой обработки данных, в т.ч. лингвистических (типа загрузить большой текст и посчитать в нём все формы какого-нибудь слова, или выделить все названия городов)…

Как-то так!