Как парсить картинки с сайтов python
Четыре метода загрузки изображений с веб-сайта с помощью Python
Недавно пришлось по работе написать простенький парсер на питоне, который бы скачивал с сайта изображения (по идее тот же самый парсер может качать не только изображения, но и файлы других форматов) и сохранял их на диске. Всего я нашел в интернете четыре метода. В этой статье я их решил собрать все вместе.
1-ый метод
Первый метод использует модуль urllib (или же urllib2). Пусть имеется ссылка на некое изображение img. Метод выглядит следующим образом:
Здесь нужно обратить внимание, что режим записи для изображений — ‘wb’ (бинарный), а не просто ‘w’.
2-ой метод
Второй метод использует тот же самый urllib. В дальнейшем будет показано, что этот метод чуть медленнее первого (отрицательный оттенок фактора скорости парсинга неоднозначен), но достоин внимания из-за своей краткости:
Притом стоит заметить, что функция urlretrieve в библиотеке urllib2 по неизвестным мне причинам (может кто подскажет по каким) отсутствует.
3-ий метод
Третий метод использует модуль requests. Метод имеет одинаковый порядок скорости выгрузки картинок с первыми двумя методами:
При этом при работе с веб в питоне рекомендуется использовать именно requests вместо семейств urllib и httplib из-за его краткости и удобства обращения с ним.
4-ый метод
Четвертый метод по скорости кардинально отличается от предыдущих методов (на целый порядок). Основан на использовании модуля httplib2. Выглядит следующим образом:
Здесь явно используется кэширование. Без кэширования (h = httplib2.Http()) метод работает в 6-9 раза медленнее предыдущих аналогов.
Тестирование скорости проводилось на примере скачивания картинок с расширением *.jpg c сайта новостной ленты lenta.ru. Выбор картинок, подпадающих под этот критерий и измерение времени выполнения программы производились следующим образом:
Постоянно меняющиеся картинки на сайте не повлияли на чистоту измерений, поскольку методы отрабатывали друг за другом. Полученные результаты таковы:
Парсер картинок с сайта
Хочу написать парсер картинок с сайта (любого),
но не знаю с чего начать., так как в python куча библиотек : не пойму что читать и с какой стороны подойти.
Проблемный парсер сайта
Пмогите плизз, давно уже ломаю голову, хотел написать парсер сайта, чтобы выводил все, что.
Парсер сайта и ссылок с сайта
Добрый день. Подскажите, как реализовать парсер сайта, с которого парсятся все URL и в свою.
Парсер сайта
Здравствуйте, нужна помощь с парсером. Нужно спарсить https://bittrex.com/home/markets, допустим.
Парсер закрытого сайта
Нужна помощь с кодом! # coding: utf-8 import requests from bs4 import BeautifulSoup from.
1. Как в нужном языке делать http запросы и получать ответ
2. html, как в нем хранятся картинки и как и какие атрибуты задаются картинкам
3. О том как разбирается (парсится) html. Сразу оговорюсь, регулярки в этом деле очень плохой вариант. Их нужно использовать с понимаем дела и только там где это действительно нужно.
Ну в прицепи и все.
В python я бы запрашивал страницу сайта с помощью requests, парсил html с помощью lxml.html, а загружал картинки с помощью urllib.request.urlretrieve
Посмотрите на youtube видюшки по теме, там правда на английском, но все же.
Для парсинга неплохо было бы подучить XPath, для ваших целей хватит и часочка.
Для хрома есть пара отличных расширений, которые определяют XPath для элементов страницы (как абсолютный адрес, так и относительный). Их потом можно вставить в тело кода.
ПС Все тех. книги я читаю только на английском и только на английском. На русском обычно можно найти косные неинтересные переводы.
Мой английский пока не позволяет читать техническую литературу, к сожалению,. но спасибо
Добавлено через 13 часов 22 минуты
Слушайте,
Я подключил urllib и BeautifulSoup.
Создал объект библиотеки urllib: понял, что он нужен, потому что содержит в себе код страницы.
Затем BeautifulSoup’ом мы парсим объект urllib : ищем картинки.
И По этим ссылкам затем скачиваем файлы с помощью той же urllib.
Как, используя Python, загрузить все изображения с веб-страницы
Для начала нам понадобится довольно много зависимостей, давайте установим их:
Откройте новый файл с именем download_images.py и импортируйте необходимые модули:
Первое, что мы сделаем, создадим валидатор URL‑адреса, который проверяет, является ли переданный URL‑адрес действительным, поскольку есть некоторые веб‑сайты, которые помещают закодированные данные вместо URL‑адреса, поэтому нам нужно пропустить их:
Функция urlparse() разбирает URL‑адрес на шесть составных частей, а нам просто нужно увидеть, есть ли там netloc (имя домена) и scheme (протокол).
Во-вторых, я собираюсь написать основную функцию, которая определет все URL‑адреса изображений на веб‑странице:
Это получит все элементы img в виде списка Python.
Теперь нам нужно убедиться, что URL‑адрес является абсолютным:
Встречаются URL‑адреса, содержащие пары ключ-значение метода GET HTTP‑протокола, которые нам не нравятся (заканчиваются чем-то вроде этого «/image.png?c=3.2.5«), удалим их:
Теперь давайте убедимся, что каждый URL‑адрес действителен и возвращает все URL‑адреса изображений:
Вышеупомянутая функция принимает URL‑адрес файла для загрузки и путь к папке, в которую этот файл будет сохранен.
Наконец, вот основная функция:
Посмотрите код файла download_images.py целиком:
Получение всех URL‑адресов изображений с этой страницы и загрузка каждого из них по одному. Давайте проверим:
Будут загружены все изображения с указанного URL‑адреса и сохранены в папке «waksoft‑susu‑ru», которая будет создана автоматически.
Однако обратите внимание, что есть некоторые веб‑сайты, которые загружают свои данные с помощью Javascript, в этом случае вы должны вместо этого использовать библиотеку requests_html. Я уже сделал другой скрипт, который вносит некоторые изменения в исходный и обрабатывает рендеринг Javascript, и записал его в файл download_images_js.py, посмотрите:
Хорошо, всё на сегодя!
Как парсить картинки с сайтов python
Хочу отметить, что работа над этой статьей ещё не закончена. Если у вас есть замечания или дополнение, добро пожаловать в комментарии.
Важно
Всегда сначала посмотрите предлагает ли сайт собственный API, RSS/Atom фиды также пригодятся.
Требования
Мы будем использовать две дополнительные библиотеки для Python.
Запросы
Мы будем использовать библиотеку requests вместо urllib2, так как она во всех отношениях превосходит urllib2. Я мог бы долго это доказывать, но, как мне кажется, на странице этой библиотеки все сказано в одном абзаце:
Библиотека urllib2 предлагает нам большинство необходимых аспектов для работы с HTTP, но API оставляет желать лучшего. Она была создана в другое время и для другой сети интернет. Она требует невероятного объёма работ даже для простых задач.
Краулинг и Парсинг
Сохранение просмотренных адресов
Просмотренные адреса стоит сохранять, чтобы не парсить их по несколько раз. Для обработки не более 50000 адресов, я бы советовал использовать set (множество, тип данных). Можно просто просмотреть, есть ли адрес уже в наборе перед добавлением его в очередь на парсинг.
Важно: обязательно нормализуйте URL адреса перед добавлением его в фильтр. В зависимости от сайта может потребоваться удаление всех параметров в URL. Вряд ли вы захотите сохранять один и тот же адрес несколько раз.
CSS селекторы
Так же я бы рекомендовал PyQuery, так как это тоже очень распространённое средство.
Извлекаем блок главного содержимого
Иногда приходится делать анализ только основного содержимого страницы, например, посчитать количество слов. В таком случае меню навигации или боковое меню можно исключить.
Параллелизм
Все хотят получить данные как можно быстрее, но запустив 200 параллельных запросов, вы только разозлите владельца хоста. Не стоит так делать. Сделайте одолжение всем, не допускайте более 5 одновременных запросов.
Для запуска одновременных запросов используйте библиотеку grequests. Достаточно всего пары строк для распараллеливания вашего кода.
Robots.txt
Все возможные руководство говорят, что необходимо следовать правилам файла Robots.txt. Но мы попробуем отличиться. Дело в том, что эти правила обычно очень ограничивают и далеко не отражают настоящие ограничения сайта. Чаще всего, этот файл генерирует сам фреймворк по умолчанию или какой-нибудь плагин по поисковой оптимизации.
Обычно исключением является случай, если вы пишите обычный парсер, например как у Google или Bing. В таком случае я бы советовал обращать внимание на файл robots.txt, чтобы избежать лишних задержек парсера. Если владелец хоста не хочет чтобы вы индексировали какое то содержимое, то и не следует этого делать.
Как не быть замеченным?
Не всегда хочется, чтобы ваши действия были замечены. На самом деле этого довольно просто добиться. Для начала следует изменять значения user agent в случайном порядке. Ваш IP адрес не будет изменяться, но такое часто случается в сети. Большинство крупных организаций, например университеты, используют один IP адрес для организации доступа в интернет всей своей локальной сети.
Доходило до того, что к тому времени как прокси сервера, которые я использовал, были заблокированы владельцами хостов, сами сервера уже меняли свои IP адреса на новые.
Наследуем класс Response
Я бы советовал всегда наследовать класс requests.model.Response, так как в нем заключены очень полезные методы.
Частые проблемы
Установка LXML
Довольно часто возникают проблемы при установке Ixml, особенно в линуксе. Просто вначале надо установить зависимости:
а уже после можно выполнять команду pip install lxml в обычном режиме.
Как парсить сайты с Ajax
Обычно Ajax упрощает парсинг. При помощи закладки Сеть в Google Chrome вы сможете просмореть ajax запросы, а также ответы на них, которые обычно приходят в JSON. Получается что страницу даже не надо парсить, вы можете просто отправить запрос напрямую по тому же адресу. Если так сделать не получается, то следует использовать сам браузер. Прочтите раздел “Сайт выдаёт другое содержимое парсеру” для дополнительной информации.
Сайт выдаёт другое содержимое парсеру
Пагинация
Иногда приходится парсить данные разбитые по страницам. К счастью, это тоже довольно легко обойти. Посмотрите внимательно на URL адреса, как правило, там присутствует параметр page или offset, отвечающий за номер страницы. Вот пример управления таким параметром:
Ошибка 403 / ограничения по частоте запросов
Решение простое, просто немного отстаньте от этого сайта. Будьте аккуратны с количеством параллельных запросов. Неужели вам действительно нужны эти данные в течение часа, может стоит немного подождать?
Если все таки это так необходимо, то стоит обратиться к услугам прокси-серверов. Просто создайте обычный прокси менеджер, который будет отслеживать, чтобы каждый прокси-сервер использовался не чаще чем через интервал X. Обратите внимание на разделы “Как не быть замеченным?” и “Параллелизм”
Примеры кода
Следующие примеры сами по себе не представляют большой пользы, но в качестве справки очень подойдут.
Пример простого запроса
Я не собираюсь многого показывать в этом примере. Всё что вам необходимо, вы найдете в документации к соответствующему классу.
Запрос с прокси
Парсинг содержимого ответа
Довольно легко распарсить html код полученный при помощи lxml. Как только мы преобразовали данные в дерево, можно использовать xPath для извлечения данных.
Скачиваем все изображения со страницы
Следующий скрипт скачает все изображения и сохранит их в downloaded_images/. Только сначала не забудьте создать соответствующий каталог.
Парсер на один поток
Этот парсер всего лишь показывает базовый принцип построения. Он использует очередь, чтобы можно было извлекать данные слева из очереди, а парсить страницы по мере их обнаружения. Ничего полезного этот скрипт не делает, он просто выводит заголовок страницы.
Web Scraping с помощью python
Введение
Недавно заглянув на КиноПоиск, я обнаружила, что за долгие годы успела оставить более 1000 оценок и подумала, что было бы интересно поисследовать эти данные подробнее: менялись ли мои вкусы в кино с течением времени? есть ли годовая/недельная сезонность в активности? коррелируют ли мои оценки с рейтингом КиноПоиска, IMDb или кинокритиков?
Но прежде чем анализировать и строить красивые графики, нужно получить данные. К сожалению, многие сервисы (и КиноПоиск не исключение) не имеют публичного API, так что, приходится засучить рукава и парсить html-страницы. Именно о том, как скачать и распарсить web-cайт, я и хочу рассказать в этой статье.
В первую очередь статья предназначена для тех, кто всегда хотел разобраться с Web Scrapping, но не доходили руки или не знал с чего начать.
Off-topic: к слову, Новый Кинопоиск под капотом использует запросы, которые возвращают данные об оценках в виде JSON, так что, задача могла быть решена и другим путем.
Задача
Инструменты
Загрузка данных
Первая попытка
Приступим к выгрузке данных. Для начала, попробуем просто получить страницу по url и сохранить в локальный файл.
Открываем полученный файл и видим, что все не так просто: сайт распознал в нас робота и не спешит показывать данные.
Разберемся, как работает браузер
Однако, у браузера отлично получается получать информацию с сайта. Посмотрим, как именно он отправляет запрос. Для этого воспользуемся панелью «Сеть» в «Инструментах разработчика» в браузере (я использую для этого Firebug), обычно нужный нам запрос — самый продолжительный.
Как мы видим, браузер также передает в headers UserAgent, cookie и еще ряд параметров. Для начала попробуем просто передать в header корректный UserAgent.
На этот раз все получилось, теперь нам отдаются нужные данные. Стоит отметить, что иногда сайт также проверяет корректность cookie, в таком случае помогут sessions в библиотеке Requests.
Скачаем все оценки
Парсинг
Немного про XPath
XPath — это язык запросов к xml и xhtml документов. Мы будем использовать XPath селекторы при работе с библиотекой lxml (документация). Рассмотрим небольшой пример работы с XPath
Подробнее про синтаксис XPath также можно почитать на W3Schools.
Вернемся к нашей задаче
Каждый фильм представлен как
. Рассмотрим, как вытащить русское название фильма и ссылку на страницу фильма (также узнаем, как получить текст и значение атрибута).
Еще небольшой хинт для debug’a: для того, чтобы посмотреть, что внутри выбранной ноды в BeautifulSoup можно просто распечатать ее, а в lxml воспользоваться функцией tostring() модуля etree.
Резюме
В результате, мы научились парсить web-сайты, познакомились с библиотеками Requests, BeautifulSoup и lxml, а также получили пригодные для дальнейшего анализа данные о просмотренных фильмах на КиноПоиске.
Полный код проекта можно найти на github’e.
