Парсинг сайтов на Python: подробный видеокурс и программный код

8
46558
Добавить в избранное

В видеокурсе из семи уроков описывается парсинг сайтов с различной структурой при помощи Python третьей версии, библиотек requests и BeautifulSoup.

Парсинг сайтов на Python

В этом видеокурсе Олег Молчанов подробно, не торопясь, рассказывает про парсинг сайтов при помощи Python 3. Раскрываются особенности парсинга многостраничных ресурсов, использования прокси с различными User-Agent, сохранения изображений и распознавания простого текста, а также быстрый мультипроцессорный парсинг сайтов.

В ряде случаев предлагаемые автором программные решения несколько устарели из-за изменения структуры страниц, подвергаемых парсингу. Автор курса не преследует цели создать идеальный парсер, а лишь излагает определенные концепции и иллюстрирует их примерами. Для облегчения вашей работы, мы привели исходные коды программ, набранные нами во время прохождения курса, с некоторыми поправками.

1. Мультипроцессорный парсинг страницы сайта с экспортом данных в csv

В уроке рассматривается мультипроцессорный парсинг на примере сайта CoinMarketCap.com. Сначала приводится пример однопоточного парсинга. Затем рассматривается, как модифицировать программу для реализации мультипроцессорного подхода при помощи библиотеки multiprocessing. Сравниваются временные интервалы, необходимые для парсинга в один и несколько потоков. Попутно рассказывается об экспорте данных в csv-файл.

Обратите внимание: для установки BeautifulSoup для Python 3 в видео указана неправильная команда. Правильный вариант: pip install beautifulsoup4 (либо для систем с двумя версиями Python: pip3 install beautifulsoup4).

Программный код при однопоточном парсинге:

Программный код при использовании мультипроцессорного парсинга с 40 процессами:

Характерные времена могут разниться в зависимости от оборудования и текущего состояния сайта.

2. Парсинг многостраничных сайтов

Во втором уроке рассматривается извлечение информации с многостраничного сайта по типу Avito.ru. В качестве примера берется задача поиска телефона по названию фирмы изготовителя с выводом названия товара, цены, ближайшей станции метро и ссылки объявления. Показывается простейший способ фильтрации нерелевантных блоков.

Обратите внимание: при многостраничном парсинге таких сайтов, как Avito.ru, ваш IP может быть временно забанен на совершение парсинга.

3. Извлечение информации из генерируемых сайтом изображений

Во второй части видео о парсинге Avito внимание фокусируется на совмещении парсинга с извлечением информации из изображений. Для этой задачи вместо библиотеки BeautifulSoup используется библиотека Selenium, работающая непосредственно с браузером на вашем компьютере. Для совместной работы может потребоваться файл драйвера браузера. Захват изображений и преобразование в текстовые строки осуществляется при помощи библиотек pillow и pytesseract.

4. Приемы работы с библиотекой BeautifulSoup

В этом видео на более абстрактном примере локальной страницы даны дополнительные примеры работы методов find и find_all библиотеки BeautifulSoup. Показывается, как находить включающие информацию блоки при помощи методов parentfind_parent и find_parents. Описаны особенности работы методов next_element и next_sibling, упрощающих поиск данных в пределах одного раздела. В конце видео рассматривается, как сочетать поиск в BeautifulSoup с регулярными выражениями.

5. Использование прокси и изменение User-Agent

В пятом видео анализируется основной прием, помогающий избежать при парсинге бана или появления капчи посредством использования прокси-сервера с меняющимся адресом и изменения параметра User-Agent. Демонстрируется пример использования метода find_next_sibling. Рассмотрена передача IP и User-Agent при запросе библиотеки requests. Для использования актуального списка доступных прокси-серверов мы рекомендуем дополнить код парсером соответствующего сайта (в видео используются заранее подготовленные файлы со списками прокси и браузерных агентов).

6. Парсинг сайтов с «ненормальной» структурой

В этом видеоуроке на примере двух сайтов объясняется, как обрабатывать сайты с ошибками или сайты, сделанные непрофессионалами. Первый ресурс https://us-proxy.org/ представляет пример сайта, который выглядит как многостраничный, но это лишь видимость – все данные загружаются на главную страницу при первом обращении к сайту. Во втором примере в структуре блога http://startapy.ru/ используется три вертикальных списка с необычным горизонтальным смещением размещаемых блоков при добавлении новых публикаций. В видеоуроке показано, как средства анализа браузеров в связи с некорректной версткой могут вводить нас в заблуждение, при том что BeautifulSoup отображает и использует исправленный вариант.

7. Скачивание изображений и других файлов

На примере сайта со свободными изображениями для фона рабочего стола https://www.hdwallpapers.in/ показывается процедура загрузки изображений с сайта – каждого в отдельную папку. Используются только библиотеки os (для работы с заданием пути сохранения файла) и requests. Показывается работа с блочной загрузкой файлов посредством метода iter_content.

Другие материалы по теме:

Интересуетесь программированием на Python?

Подпишитесь на нашу рассылку, чтобы получать больше интересных материалов:

И не беспокойтесь, мы тоже не любим спам. Отписаться можно в любое время.




Комментариев: 8

  1. Большое спасибо за видео! Подскажите, пожалуйста, могут ли возникать проблемы при записи в CSV файл в режиме мультипоточности. Где-то в 2% случаев в файл попал какой-то «мусор», который точно не должен был получиться в результате парсинга страницы (т.к. в том числе пишу туда просто переменные из цикла).

    И еще вопрос. Можно ли создать переменную-счетчик, значения которой будет увеличиваться на 1 при выполнении условия в каком-либо из потоков? (то есть чтобы она собиралась из всех потоков и одновременно выводилась на экран) Спасибо.

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

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

      1. Спасибо за ответ.
        Первый вопрос скорее теоретический. Могут ли возникать конфликты при записи в один и тот же файл в несколько потоков (100)? То есть что происходит если файл находится в процессе записи из одного потока и в тоже время пытается пойти запись из другого потока?
        Я пишу данные в виде N атрибутов с сайта, ссылка (которая в map передавалась), прокси. В некоторых случаях в файл попала только часть ссылки + прокси, или даже только часть прокси. То есть эти данные не сайта берутся.

        По второму вопросу.
        Подскажите, пожалуйста, как можно сделать внешнюю переменную? Если по аналогии с вашим примером вставляю х = 0 перед Pool, а потом ссылаюсь на неё x += 1 в функции make_all() то выдается ошибка local variable ‘x’ referenced before assignment

        1. По второму вопросу. Попробовал через Global, код заработал, но переменная внутри каждого потока считается своя..

  2. Привет! Спасибо за статью — очень познавательно!
    Такой вопрос: подскажите, как скопировать ссылки на фотографии в массив и сохранить их в файл?

    1. Спасибо за отзыв. Если стоит задача сохранить ссылки на фотографии построчно, то при помощи cтандартной функции записи в файл:

      f = open(‘url_file.txt’, ‘w’)
      f.write(«\n».join(url_list))

      Здесь url_list соответственно список всех строк с url.

      Если файл не для чтения людьми, а для хранения, то можно воспользоваться модулем pickle.

Добавить комментарий