Как посмотреть код сайта в браузере через пайтон
Он официально поддерживается как Python 2.7, так и 3.5+. Дополнительные функции, такие как Сохранение активности, объединение соединений, сеансы с постоянными файлами cookie, проверка SSL в стиле браузера, делают его идеальным выбором для разработчиков.
В этой статье мы узнаем больше о некоторых из этих функций и о том, как вы можете начать использовать модуль запросов Python для создания веб-запросов.
Как установить запросы в Python?
Установка requests в Python проста и понятна. У вас может быть несколько подходов к установке модуля в Python. Но в этой статье мы покажем вам, как использовать его с модулем pip .
Откройте терминал или командную строку (если вы являетесь пользователем Windows) и введите следующую команду.
Он должен успешно установить модуль запросов на вашем устройстве.
Использование запросов в Python
Чтобы понять, как работает модуль запросов, нам нужно знать основы того, что происходит, когда мы просматриваем веб-страницы, и как он мгновенно показывает вам контент, который вы надеялись увидеть.
В следующем разделе мы узнаем, как использовать эти методы с библиотекой запросов. Но сначала нам нужно импортировать его в ваш скрипт или интерпретатор.
1. ПОЛУЧИТЬ запрос
Введите следующую строку.
Экземпляр нашего объекта ответа дополнительно классифицирует сохраненные данные и сохраняет их в соответствующих атрибутах. Вот пример ниже
2. Передача параметров с помощью метода GET
Часто один метод GET не позволяет нам найти всю информацию, к которой нам нужен доступ, поэтому нам нужно передать дополнительные параметры с нашим исходным запросом get.
См.Синтаксис, чтобы следовать дальше.
3. Запрос на публикацию
Взгляните на синтаксис:
Некоторые дополнительные функции запросов в Python
Одной из ключевых причин, по которой модуль “запросы” так известен среди разработчиков, являются такие дополнительные функции, как:
- Объект сеансов: Он в основном используется для хранения одних и тех же файлов cookie между различными запросами, обеспечивая более быстрый ответ.
- Поддержка прокси-серверов SOCKS: Хотя вам необходимо установить отдельную зависимость (называемую ” запросы[socks]”), она может значительно повысить производительность для нескольких запросов, особенно если скорость сервера ограничивает ваш IP-адрес.
- Проверка SSL: Вы можете принудительно проверить, правильно ли веб-сайт поддерживает SSL с помощью запросов, предоставив дополнительный аргумент” в методе get (). Если веб – сайт не показывает надлежащей поддержки SSL, скрипт выдаст ошибку.
Вывод
Единственное, в чем модуль запросов не справляется, – это обработка динамических изменений в исходном коде страницы, поскольку модуль не предназначен для выполнения команд javascript.
Надеюсь, эта статья дала вам базовое представление о том, что делает модуль.
В ходе работы над курсачом для универа столкнулся со стандартным модулем Python — WebBrowser. Через этот модуль я хотел реализовать работу голосового помощника — Lora с дефолтным браузером, но всё пошло не так гладко как ожидалось. Давайте для начала расскажу вам что это за модуль и как он вообще работает.
WebBrowser — это вшитый в Python модуль, который предоставляет собой высокоуровневый интерфейс, позволяющий просматривать веб-документы.
Для начала работы импортируйте модуль командой:
Теперь возникает выбор как открыть ссылку. Есть два стула:
1. Написать через одну строчку:
Если new = 0, URL-адрес открывается, если это возможно, в том же окне браузера. Если переменная new = 1, открывается новое окно браузера, если это возможно. Если new = 2, открывается новая страница браузера («вкладка»), если это возможно.
Значение autoraise можно смело пропускать, ибо оно открывает браузер поверх всех окон, а большинство современных браузеров плюёт на эту переменную даже в значении False.
2. Не мучиться с запоминанием параметров new и писать по-человечески:
Данная конструкция открывает URL-адрес в новом ОКНЕ браузера по умолчанию, если это возможно, в противном случае откроет URL-адрес в единственном окне браузера.
В этом случае URL-адрес откроется на новой странице (”tab") браузера по умолчанию, если это возможно, в противном случае эквивалентно open_new ().
Предположим, что вам не нужен браузер по умолчанию. Для выбора браузера существует классная команда .get()
Грубо говоря, вы просто указываете какой браузер вам использовать.
Например, открытие новой вкладки в Google Chrome:
Таблица названий браузеров:
Type Name | Class Name |
---|---|
'mozilla' | Mozilla('mozilla') |
'firefox' | Mozilla('mozilla') |
'netscape' | Mozilla('netscape') |
'galeon' | Galeon('galeon') |
'epiphany'' | Galeon('epiphany') |
'skipstone' | BackgroundBrowser('skipstone') |
'kfmclient' | Konqueror() |
'konqueror'' | Konqueror() |
'kfm' | Konqueror() |
'mosaic' | BackgroundBrowser('mosaic') |
'opera' | Opera() |
'grail' | Grail() |
'links' | GenericBrowser('links') |
'elinks' | Elinks('elinks') |
'lynx' | GenericBrowser('lynx') |
'w3m' | GenericBrowser('w3m') |
'windows-default' | WindowsDefault |
'macosx' | MacOSX('default') |
'safari' | MacOSX('safari') |
'google-chrome' | Chrome('google-chrome') |
'chrome'' | Chrome('chrome') |
'chromium'' | Chromium('chromium') |
'chromium-browser' | Chromium('chromium-browser') |
Но не всегда получается обойтись одним только .get() и в этом случае на помощь приходит функция .register(), например:
Мы указали путь к Google Chrome, назвали его и теперь все ссылки открываются только в нём. Надеюсь немного разобрались с модулем WebBrowser и теперь перейдём к моей маленькой проблеме.
Как говорилось ранее, для курсового проекта я выбрал создание голосового ассистента. Хотелось его научить переходить по ссылкам и искать информацию в поисковике. Конечно можно было бы «напиповать» множество библиотек для этого, но принципиально хотелось реализовать это через стандартный модуль WebBrowser.
Так как у большинства современных браузеров строка ввода ссылки и поисковая строка это одно и то же, то, казалось бы, можно просто передать запрос туда же, куда передаётся ссылка.
По логике этого кода должны открыться две вкладки:
Раз нам позволяют открывать только ссылки в дефолтном браузере, так и будем открывать только ссылки.
Шаги решения
Следовательно, мы будем искать точку и пробел в том, что ввёл пользователь. Реализовать мы сможем это благодаря модулю re, который также изначально встроен в Python. Python предлагает две разные примитивные операции, основанные на регулярных выражениях: match выполняет поиск паттерна в начале строки, тогда как search выполняет поиск по всей строке. Мы воспользуемся операцией search.
Немного объясню код.
Пользователь вводит ссылку или текст запроса в переменную call.
Первое условие проверяет переменную call на точку внутри неё. Символ '\' обязателен, иначе модуль не понимает, что перед ним символ точка.
В этом условии всё тоже самое что и в первом, но проверка ведётся уже на пробел. А пробел говорит о том, что перед нами поисковой запрос.
А else, в свою очередь, присваивает всё что написал пользователь без пробелов и точек в поисковый запрос.
Проверка на пробел является обязательной, иначе WebBrowser открывает Internet Explorer.
Недавно заглянув на КиноПоиск, я обнаружила, что за долгие годы успела оставить более 1000 оценок и подумала, что было бы интересно поисследовать эти данные подробнее: менялись ли мои вкусы в кино с течением времени? есть ли годовая/недельная сезонность в активности? коррелируют ли мои оценки с рейтингом КиноПоиска, IMDb или кинокритиков?
Но прежде чем анализировать и строить красивые графики, нужно получить данные. К сожалению, многие сервисы (и КиноПоиск не исключение) не имеют публичного API, так что, приходится засучить рукава и парсить html-страницы. Именно о том, как скачать и распарсить web-cайт, я и хочу рассказать в этой статье.
В первую очередь статья предназначена для тех, кто всегда хотел разобраться с Web Scrapping, но не доходили руки или не знал с чего начать.
Off-topic: к слову, Новый Кинопоиск под капотом использует запросы, которые возвращают данные об оценках в виде JSON, так что, задача могла быть решена и другим путем.
Задача
- Этап 1: выгрузить и сохранить html-страницы
- Этап 2: распарсить html в удобный для дальнейшего анализа формат (csv, json, pandas dataframe etc.)
Инструменты
Регулярные выражения, конечно, нам пригодятся, но использовать только их, на мой взгляд, слишком хардкорный путь, и они немного не для этого. Были придуманы более удобные инструменты для разбора html, так что перейдем к ним. , lxml
Это две наиболее популярные библиотеки для парсинга html и выбор одной из них, скорее, обусловлен личными предпочтениями. Более того, эти библиотеки тесно переплелись: BeautifulSoup стал использовать lxml в качестве внутреннего парсера для ускорения, а в lxml был добавлен модуль soupparser. Подробнее про плюсы и минусы этих библиотек можно почитать в обсуждении. Для сравнения подходов я буду парсить данные с помощью BeautifulSoup и используя XPath селекторы в модуле lxml.html.
Это уже не просто библиотека, а целый open-source framework для получения данных с веб-страниц. В нем есть множество полезных функций: асинхронные запросы, возможность использовать XPath и CSS селекторы для обработки данных, удобная работа с кодировками и многое другое (подробнее можно почитать тут). Если бы моя задача была не разовой выгрузкой, а production процессом, то я бы выбрала его. В текущей постановке это overkill.
Загрузка данных
Первая попытка
Приступим к выгрузке данных. Для начала, попробуем просто получить страницу по url и сохранить в локальный файл.
Открываем полученный файл и видим, что все не так просто: сайт распознал в нас робота и не спешит показывать данные.
Разберемся, как работает браузер
Однако, у браузера отлично получается получать информацию с сайта. Посмотрим, как именно он отправляет запрос. Для этого воспользуемся панелью "Сеть" в "Инструментах разработчика" в браузере (я использую для этого Firebug), обычно нужный нам запрос — самый продолжительный.
Как мы видим, браузер также передает в headers UserAgent, cookie и еще ряд параметров. Для начала попробуем просто передать в header корректный UserAgent.
На этот раз все получилось, теперь нам отдаются нужные данные. Стоит отметить, что иногда сайт также проверяет корректность cookie, в таком случае помогут sessions в библиотеке Requests.
Скачаем все оценки
Теперь мы умеем сохранять одну страницу с оценками. Но обычно у пользователя достаточно много оценок и нужно проитерироваться по всем страницам. Интересующий нас номер страницы легко передать непосредственно в url. Остается только вопрос: "Как понять сколько всего страниц с оценками?" Я решила эту проблему следующим образом: если указать слишком большой номер страницы, то нам вернется вот такая страница без таблицы с фильмами. Таким образом мы можем итерироваться по страницам до тех, пор пока находится блок с оценками фильмов ( ).
Парсинг
Немного про XPath
XPath — это язык запросов к xml и xhtml документов. Мы будем использовать XPath селекторы при работе с библиотекой lxml (документация). Рассмотрим небольшой пример работы с XPath
Подробнее про синтаксис XPath также можно почитать на W3Schools.
Вернемся к нашей задаче
Теперь перейдем непосредственно к получению данных из html. Проще всего понять как устроена html-страница используя функцию "Инспектировать элемент" в браузере. В данном случае все довольно просто: вся таблица с оценками заключена в теге . Выделим эту ноду:
Каждый фильм представлен как или . Рассмотрим, как вытащить русское название фильма и ссылку на страницу фильма (также узнаем, как получить текст и значение атрибута).
Еще небольшой хинт для debug'a: для того, чтобы посмотреть, что внутри выбранной ноды в BeautifulSoup можно просто распечатать ее, а в lxml воспользоваться функцией tostring() модуля etree.
Резюме
В результате, мы научились парсить web-сайты, познакомились с библиотеками Requests, BeautifulSoup и lxml, а также получили пригодные для дальнейшего анализа данные о просмотренных фильмах на КиноПоиске.
Полный код проекта можно найти на github'e.
Вы когда-нибудь задумывались, как получить исходный код страницы в Selenium WebDriver с помощью Python? В этом блоге мы рассмотрим, как сделать Selenium WebDriver getpagesource и продемонстрируем, как Selenium получает источник XML-страницы в виде…
Получение источника страницы исследуемого веб-сайта является повседневной задачей для большинства инженеров по автоматизации тестирования. Анализ источника страницы помогает устранить ошибки, выявленные в ходе регулярного тестирования пользовательского интерфейса веб-сайта, функционального тестирования или тестирования безопасности. В чрезвычайно сложном процессе тестирования приложений сценарии тестирования автоматизации могут быть написаны таким образом, что если в программе обнаруживаются ошибки, то это происходит автоматически.
- сохраняет исходный код этой конкретной страницы.
- уведомляет лицо, ответственное за URL-адрес страницы.
- извлекает HTML-источник определенного элемента или блока кода и делегирует его ответственным органам, если ошибка произошла в одном конкретном независимом HTML-веб-элементе или блоке кода.
Это простой способ отслеживать, исправлять логические и синтаксические ошибки в интерфейсном коде. В этой статье мы сначала разберемся в терминологии, а затем рассмотрим, как получить исходный код страницы в Selenium WebDriver с помощью Python.
В нетехнической терминологии это набор инструкций для браузеров по отображению информации на экране в эстетическом виде. Браузеры интерпретируют эти инструкции по-своему для создания экранов браузера на стороне клиента. Они обычно пишутся с использованием Языка разметки гипертекста (HTML), Каскадных таблиц стилей (CSS) и Javascript.
Весь этот набор HTML-инструкций, которые создают веб-страницу, называется источником страницы или источником HTML, или просто исходным кодом. Исходный код веб-сайта-это набор исходного кода с отдельных веб-страниц.
Вот пример исходного кода для базовой страницы с заголовком, формой, изображением и кнопкой отправки.
Что Такое Веб-Элемент HTML?
Проще всего описать веб-элемент HTML следующим образом: “Любой HTML-тег, составляющий исходный код HTML-страницы, является веб-элементом.” Это может быть блок HTML – кода, независимый HTML-тег, такой как , медиа-объект на веб-странице-изображение, аудио, видео, функция JS или даже объект JSON, завернутый в теги .
В приведенном выше примере – является веб-элементом HTML, поэтому
и дочерними элементами тегов body также являются веб-элементы HTML, т. Е. , и т. Д.
Selenium WebDriver является надежным инструментом тестирования автоматизации и предоставляет инженерам по тестированию автоматизации широкий набор готовых к использованию API. И чтобы сделать Selenium WebDriver getpagesource, привязки Selenium Python предоставляют нам функцию драйвера под названием page_source для получения HTML-источника текущего активного URL-адреса в браузере.
Кроме того, мы также можем использовать функцию “GET” библиотеки запросов Python для загрузки источника страницы. Другой способ – выполнить javascript с помощью функции драйвера execute_script и заставить Selenium WebDriver получить исходный код страницы на Python. Не рекомендуется использовать XPath в тандеме с URL-адресом “view-source:”. Давайте рассмотрим примеры этих четырех способов получения исходного кода страницы в Selenium WebDriver с помощью Python –
Мы будем использовать образец небольшой веб-страницы , размещенной на GitHub для всех четырех примеров. Эта страница была создана для демонстрации тестирования перетаскивания в Selenium Python с использованием лямбда-теста.
Мы принесем “pynishant.github.io” в ChromeDriver и сохраните его содержимое в файл с именем “page_source.html.” Это имя файла может быть любым по вашему выбору. Затем мы читаем содержимое файла и печатаем его на терминале, прежде чем закрыть драйвер.
При успешном выполнении приведенного выше сценария на выходе вашего терминала появится следующий источник страницы.
В предыдущем примере мы должны закомментировать (или заменить) строку “driver.page_source” и добавить следующую строку. “driver.execute_script-это API веб-драйвера Selenium Python для выполнения JS в среде Selenium. Здесь мы выполняем сценарий JS, который возвращает элемент тела HTML.
Выходной код выглядит следующим образом-
Как вы можете заметить, он возвращает только innerHTML элемента body. Как и в последнем выводе, мы не получаем весь источник страницы. Чтобы получить весь документ, мы выполняем “document.documentElement.outerHTML”. Строка execute_script теперь выглядит следующим образом-
Это дает нам именно тот результат, который мы получили с помощью “driver.page_source.”
Этот метод можно использовать для быстрого хранения исходного кода веб-страницы без загрузки страницы в браузере, управляемом Selenium. Аналогично, мы можем использовать библиотеку Python urllib для извлечения источника HTML-страницы.
Это редко требуется, но вы можете добавить целевой URL-адрес с “view-source” и загрузить его в окно браузера, чтобы загрузить исходный код и сохранить его в ручном тестировании.
Программно, чтобы взять исходный код скриншотов в Python Selenium (при необходимости), вы можете загрузить страницу с помощью –
Четвертый способ заставить Selenium WebDriver получить источник страницы-использовать XPath для его сохранения. Здесь вместо page_source или выполнения JavaScript мы идентифицируем исходный элемент, т. Е. , и извлекаем его. Закомментируйте логику извлечения источника предыдущей страницы и замените ее следующей-
В приведенном выше сценарии мы используем метод драйвера “find_element_by_xpath”, чтобы найти HTML-элемент веб-страницы. Мы вводим документ с помощью исходного узла– "//*" и получите его “внешний HTML”, который является самим документом. Вывод выглядит так же, как мы получили ранее с помощью driver.page_source.
Как Получить HTML-Источник WebElement В Selenium?
Чтобы получить HTML-источник веб-элемента в Selenium WebDriver, мы можем использовать метод get_attribute Selenium Python WebDriver . Во-первых, мы захватываем веб-элемент HTML, используя методы локатора элементов драйвера, такие как (find_element_by_xpath или find_element_by_css_selector). Затем мы применяем метод get_attribute() к этому захваченному элементу, чтобы получить его HTML-источник.
Предположим, из punishment.github.io, и мы хотим захватить и распечатать исходный код div с идентификатором “div1”. Код для этого выглядит следующим образом-
Аналогично, чтобы получить дочерние элементы или innerHTML веб-элемента –
Существует альтернативный способ сделать это и достичь того же результата –
Мы будем использовать Лямбда-тест для этой демонстрации-
Выходные данные содержат источник logoURL и WebElement –
Следующие три строки импортируют необходимые библиотеки: Selenium WebDriver, JSON Python и библиотеку re для обработки объектов JSON и использования регулярных выражений.
Затем мы настраиваем наш скрипт для его успешного запуска в облаке LambdaTest, что довольно быстро и плавно. Мне потребовалось менее 30 секунд, чтобы начать работу (возможно, потому, что у меня был предыдущий опыт работы с платформой). Но даже если вы новичок, это займет менее 1 минуты. Зарегистрируйтесь и войдите в систему с помощью Google и нажмите на Профиль , чтобы скопировать свое имя пользователя и токен доступа.
Мы запускаем драйвер в полноэкранном режиме и загружаем домашнюю страницу cntraveller со следующей строкой кода –
Теперь мы находим объекты JSON, содержащие скрипт, с помощью XPath locator и удаляем ненужные точки с запятой, чтобы правильно загрузить строку в формате JSON.
А затем мы проверяем, присутствует ли URL-адрес логотипа. Если он присутствует, мы его печатаем.
Кроме того, мы проверяем, присутствует ли телефонная информация. Если нет, мы печатаем исходный код веб-элемента.
Наконец, мы бросили водителя.
Если вы загружаете веб-сайт, отображаемый в формате XML, вам может потребоваться сохранить XML-ответ. Вот рабочее решение для создания источника XML-страницы Selenium get –
Вывод
Вы можете использовать любой из продемонстрированных выше методов и использовать гибкость и масштабируемость лямбда-теста Selenium Grid cloud для автоматизации процессов тестирования. Он позволяет выполнять тестовые случаи в более чем 2000 браузерах, операционных системах и их версиях. Кроме того, вы можете интегрировать поток автоматизированного тестирования с современными инструментами CI/CD и придерживаться лучших методов непрерывного тестирования.
Итак, начните автоматизировать свои повседневные задачи и сразу же облегчите свою жизнь с помощью лямбда-теста.
В этом руководстве для начинающих по веб-скребку Python мы рассмотрим, как извлекать данные с веб-сайтов. От интерпретации исходного кода HTML веб-сайта до загрузки его с помощью Python и извлечения интересных элементов это руководство поможет вам начать создавать свои собственные автоматические веб-скребки.
Примечание: этот учебник является выдержкой из Код с Reply.it: Проекты на Python для начинающих , книга и набор учебных пособий для начинающих, чтобы получить практический опыт программирования на Python.
В этом руководстве мы рассмотрим, как автоматически захватывать данные с веб-сайтов. Большинство веб – сайтов создаются с учетом человеческой аудитории-вы используете поисковую систему или вводите URL-адрес в свой веб-браузер и видите информацию, отображаемую на странице. Иногда мы можем захотеть автоматически извлекать и обрабатывать эти данные, и именно здесь веб-скребок может спасти нас от скучного повторяющегося труда. Мы можем создать специальную компьютерную программу для посещения веб-сайтов, извлечения определенных данных и обработки этих данных определенным образом.
Есть много причин, по которым вы можете использовать веб-скребок. Например, вам может понадобиться:
- извлеките цифры из отчета, который выходит еженедельно и публикуется в Интернете
- захватите расписание для вашей любимой спортивной команды, как только оно будет выпущено
- найдите даты выхода предстоящих фильмов в вашем любимом жанре
- получать автоматическое уведомление при изменении веб-сайта
Существует много других вариантов использования веб-скребка. Однако вы также должны отметить, что закон об авторском праве и законы о веб-скребке сложны и различаются в зависимости от страны. До тех пор, пока вы не будете откровенно копировать их контент или делать веб-скребок для коммерческой выгоды, люди, как правило, не возражают против веб-скейпинга. Однако было несколько судебных дел, связанных с соскабливанием данных из LinkedIn и вниманием СМИ из соскабливанием данных из OkCupid . Веб – скребок может нарушать закон, идти вразрез с условиями обслуживания конкретного веб-сайта или нарушать этические принципы-поэтому будьте осторожны с тем, где вы применяете этот навык.
С отказом от ответственности покончено, давайте научимся скрести!
Обзор и требования
В частности, в этом уроке мы рассмотрим:
- Что такое веб-сайт на самом деле и как работает HTML
- Просмотр HTML-кода в вашем веб-браузере
- Использование Python для загрузки веб-страниц
- Использование BeautifulSoup для извлечения частей очищенных данных
Мы будем использовать онлайн-среду программирования Reply.it таким образом, вам не нужно будет устанавливать какое-либо программное обеспечение локально, чтобы следовать шаг за шагом. Если вы хотите адаптировать это руководство к своим собственным потребностям, вам следует создать бесплатную учетную запись, перейдя по ссылке reply.it и следить за их процессом регистрации.
Было бы полезно, если бы у вас было базовое знакомство с Python или другим языком программирования высокого уровня, но мы будем подробно объяснять каждую строку кода, которую мы пишем, так что вы должны быть в состоянии идти в ногу или, по крайней мере, копировать результат, даже если вы этого не делаете.
Веб-страницы: красавица и чудовище
Вы, без сомнения, посещали веб-страницы с помощью веб-браузера раньше. Веб-сайты существуют в двух формах:
- Тот, к которому вы привыкли, где вы можете видеть текст, изображения и другие носители. Различные шрифты, размеры и цвета используются для отображения информации полезным и (как правило) эстетическим способом.
- “Источник” веб – страницы. Это компьютерный код, который сообщает вашему веб-браузеру (например, Mozilla Firefox или Google Chrome), что и как отображать.
Веб-сайты создаются с помощью комбинации трех компьютерных языков: HTML, CSS и JavaScript. Это само по себе огромная и сложная область с запутанной историей, но иметь базовое понимание того, как некоторые из них работают, необходимо для эффективной автоматизации очистки веб-страниц. Если вы откроете любой веб-сайт в своем браузере и щелкните правой кнопкой мыши где-нибудь на странице, вы увидите меню, которое должно включать опцию “просмотр источника страницы” – чтобы проверить кодовую форму веб-сайта, прежде чем ваш веб-браузер интерпретирует его.
Это показано на рисунке ниже: обычная веб-страница слева, с открытым меню (отображается при щелчке правой кнопкой мыши на странице). Нажатие кнопки “Просмотр источника страницы” в этом меню приводит к результату справа-мы видим код, содержащий все данные и вспомогательную информацию, необходимую веб-браузеру для отображения полной страницы. В то время как страница слева легко читается, используется и выглядит хорошо, та, что справа, – это чудовище. Требуется некоторое усилие и опыт, чтобы понять это, но это возможно и необходимо, если мы хотим написать пользовательские веб-скребки.
Навигация по исходному коду с помощью функции Поиска
Первое, что нужно сделать, – это выяснить, как соотносятся две страницы: какие части обычно отображаемого веб-сайта соответствуют каким частям кода. Вы можете использовать “найти” Ctrl + F) в представлении исходного кода, чтобы найти определенные фрагменты текста, которые видны в обычном представлении, чтобы помочь в этом. На веб – странице слева мы видим, что история начинается с фразы “Получение работы на телевидении”. Если мы ищем эту фразу в представлении кода, мы можем найти соответствующий текст внутри кода, в строке 805.
непосредственно перед выделенным разделом находится HTML-код, указывающий, что абзац ( в HTML) начинается здесь и что это особый вид абзаца (введение в историю). Абзац продолжается до символа . Вам не нужно беспокоиться о полном понимании HTML, но вы должны знать, что он содержит как текстовые данные, составляющие новостную статью, так и дополнительные данные о том, как ее отображать.
Большая часть веб-скрейпинга-это просмотр таких страниц, чтобы а) идентифицировать интересующие нас данные и б) отделить их от разметки и другого кода, с которым они смешиваются. Даже до того, как мы начнем писать свой собственный код, все еще может быть сложно сначала понять чужой.
На большинстве страниц есть много кода для определения структуры, макета, интерактивности и других функциональных возможностей веб-страницы, и относительно мало того, что содержит фактический текст и изображения, которые мы обычно просматриваем. Для особо сложных страниц бывает довольно сложно, даже с помощью функции find, найти код, отвечающий за ту или иную часть страницы. По этой причине большинство веб-браузеров поставляются с так называемыми “инструментами разработчика”, которые предназначены в первую очередь для программистов, чтобы помочь в создании и обслуживании веб-сайтов, хотя эти инструменты также удобны для выполнения веб-скребка.
Навигация по исходному коду с помощью инструментов разработчика
Вы можете открыть инструменты разработчика для вашего браузера из главного меню, с Google Chrome, показанным слева, и Mozilla Firefox справа ниже. Если вы используете другой веб-браузер, вы должны быть в состоянии найти аналогичную настройку.
Активация инструмента открывает новую панель в вашем веб-браузере, обычно внизу или справа. Инструмент содержит панель “Инспектор” и инструмент селектора, который можно выбрать, нажав на значок, выделенный красным цветом ниже. Как только инструмент селектора активен, вы можете щелкнуть по частям веб-страницы, чтобы просмотреть соответствующий исходный код. На изображении ниже мы выбрали тот же самый первый абзац в обычном представлении, и мы снова видим код на панели ниже.
Инструменты разработчика значительно мощнее, чем простой инструмент поиска, но они также более сложны. Вы должны выбрать метод, основанный на вашем опыте и сложности страницы, которую вы пытаетесь проанализировать.
Загрузка веб-страницы с помощью Python
Теперь, когда мы немного больше узнали о том, как строятся веб-страницы в нашем браузере, мы можем начать извлекать их и манипулировать ими с помощью Python. Поскольку Python не является веб-браузером, мы сможем только извлекать и манипулировать исходным кодом HTML, а не просматривать “нормальное” представление веб-страницы.
Мы сделаем это через Python Repl, используя библиотеку requests . Открыть reply.it и выберите создать новый Python Repl.
Это приведет вас к рабочей среде кодирования Python, где вы можете писать и запускать код Python. Для начала мы загрузим контент с главной страницы BBC News и распечатаем первые 1000 символов исходного кода HTML.
Вы можете сделать это со следующими четырьмя строками Python:
Поместите этот код в main.py файл, который Ответ автоматически создает для вас, и нажмите кнопку “Выполнить”. После небольшой задержки вы должны увидеть вывод в области вывода – начало исходного кода HTML, аналогичного тому, что мы видели в нашем веб-браузере выше.
Давайте разберем каждую из этих линий.
- В строке 1 мы импортируем библиотеку Python requests , которая позволяет нам делать веб-запросы.
- В строке 3 мы определяем переменную, содержащую URL-адрес основного новостного сайта BBC. Вы можете посетить этот URL-адрес в своем веб-браузере, чтобы увидеть домашнюю страницу BBC News.
- В строке 4 мы передаем URL-адрес, который мы определили, функции requests.get , которая посетит веб-страницу, на которую указывает URL-адрес, и получит исходный код HTML. Мы загружаем это в новую переменную под названием response .
- В строке 5 мы получаем доступ к атрибуту text нашего объекта response , который содержит весь исходный код HTML. Мы берем только первые 1000 символов этого текста и передаем их функции print , которая просто сбрасывает полученный текст в нашу панель вывода.
Теперь мы автоматически извлекли веб-страницу и можем отображать часть содержимого. Нас вряд ли заинтересует полный дамп исходного кода веб-страницы (если только мы не храним его по архивным причинам), поэтому давайте извлекем некоторые интересные части страницы, а не только первые 1000 символов.
Использование BeautifulSoup для извлечения всех URL-адресов
Всемирная паутина построена из страниц, которые ссылаются друг на друга с помощью гиперссылок, ссылок или URL-адресов. (Все эти термины используются более или менее взаимозаменяемо).
Мы могли бы попытаться использовать встроенные функции текстового поиска Python, такие как find() или регулярные выражения, чтобы извлечь все URL-адреса со страницы BBC, но на самом деле это невозможно сделать надежно. HTML-это сложный язык, который позволяет веб-разработчикам делать много необычных вещей. Забавный взгляд на то, почему мы должны избегать “наивного” метода поиска ссылок, см. в этом очень известном вопросе StackOverflow и первом ответе.
К счастью, существует мощная и простая в использовании библиотека синтаксического анализа HTML под названием BeautifulSoup , которая поможет нам извлечь все ссылки из данного фрагмента HTML. Мы можем использовать его, изменив код в нашем ответе, чтобы он выглядел следующим образом.
Если вы запустите этот код, вы увидите, что он выводит десятки URL-адресов, по одному на строку. Вы, вероятно, заметите, что теперь код выполняется гораздо дольше, чем раньше-BeautifulSoup не встроен в Python, это сторонний модуль. Это означает, что перед запуском кода Reply должен пойти и принести эту библиотеку и установить ее для вас. Последующие запуски будут быстрее.
Код похож на тот, что был у нас раньше, с несколькими дополнениями.
- В строке 2 мы импортируем библиотеку BeautifulSoup, которая используется для синтаксического анализа и обработки HTML.
- Одна строка 9, мы превращаем наш HTML в “суп”. Это красивое представление веб-страницы, которое содержит кучу полезных программных функций для поиска и изменения данных на странице. Мы используем опцию “html.parser” для разбора HTML, которая включена по умолчанию-BeautifulSoup также позволяет вам указать здесь пользовательский HTML-парсер. Например, вы можете установить и указать более быстрый парсер, который может быть полезен, если вам нужно обработать много HTML-данных.
- В строке 10 мы находим все элементы a в нашем HTML-файле и извлекаем их в список. Помните, когда мы просматривали URL-адреса с помощью нашего веб-браузера (рис. 7), мы заметили, что элемент в HTML используется для определения ссылок, а атрибут href используется для указания того, куда должна идти ссылка. Эта строка находит все элементы HTML .
- В строке 11 мы перебираем все имеющиеся у нас ссылки, а в строке 12 выводим раздел href .
Эти последние две строки показывают, почему BeautifulSoup полезен. Попытаться найти и извлечь эти элементы без него было бы удивительно трудно, но теперь мы можем сделать это в двух строках читаемого кода!
Опять же, метод проб и ошибок-лучший способ сделать это. Если мы перейдем на главную страницу BBC News и с помощью инструментов разработчика проверим ссылки на новостные статьи, то обнаружим, что все они имеют одинаковую структуру. Это относительные URL-адреса, которые начинаются с “/news” и заканчиваются длинным номером, например /news/newsbeat-45705989
Мы можем внести небольшое изменение в наш код, чтобы выводить только те URL-адреса, которые соответствуют этому шаблону. Замените последние две строки нашего кода Python следующими четырьмя строками:
Здесь мы все еще перебираем все ссылки, которые BeautifulSoup нашел для нас, но теперь мы извлекаем href в свою собственную переменную сразу после этого. Затем мы проверяем эту переменную, чтобы убедиться, что она соответствует нашим условиям (начинается с “/news” и заканчивается цифрой), и только если это так, то мы распечатываем ее.
Извлечение всех статей с главной страницы
Теперь, когда у нас есть ссылка на каждую статью на главной странице BBC News, мы можем получить данные для каждой из этих отдельных статей. В качестве игрушечного проекта давайте извлекем имена собственные (люди, места и т. Д.) Из каждой статьи и распечатаем наиболее распространенные, чтобы понять, о чем сегодня говорят.
Адаптируйте свой код так, чтобы он выглядел следующим образом:
Этот код довольно сложен, чем то, что мы писали ранее, поэтому не волнуйтесь, если вы не понимаете всего этого. Основные изменения заключаются в следующем:
Facebook и Facebook появляются в большинстве статей из-за ссылок на социальные сети в нижней части каждой статьи, поэтому их присутствие не означает, что Facebook и Twitter сами по себе находятся в новостях сегодня. Точно так же такие слова, как “От”, не являются существительными, и другие слова, такие как “Би-би-си” и “Бизнес”, также включены, потому что они появляются на каждой странице вне основного текста статьи.
Куда дальше?
Мы прошли через очень гибкий метод соскабливания паутины, но это “быстрый и грязный” способ. Если Би-би-си обновит свой веб-сайт и некоторые из наших предположений (например, что новостные URL-адреса будут заканчиваться цифрой) сломаются, наш веб-скребок тоже сломается.
Как только вы немного поскребете паутину, вы заметите, что одни и те же шаблоны и проблемы возникают снова и снова. Из-за этого существует множество фреймворков и других инструментов, которые решают эти общие проблемы (поиск всех URL-адресов на странице, извлечение текста из другого кода, работа с изменяющимися веб-сайтами и т. Д.), И для любого большого проекта веб-скребка вы определенно захотите использовать их вместо того, чтобы начинать с нуля.
Некоторые из лучших инструментов веб-скребка Python:
-
: Фреймворк, используемый людьми, которые хотят очистить миллионы или даже миллиарды веб-страниц. Scrapy позволяет создавать “пауков” – программных роботов, которые перемещаются по Сети с высокой скоростью, собирая данные на основе заданных вами правил. : мы коснулись того, как трудно отделить основной текст новостной онлайн-статьи от всего остального контента на странице (колонтитулы, объявления и т. Д.). Эта проблема невероятно трудна для решения. Газета использует комбинацию вручную заданных правил и некоторых хитроумных алгоритмов для удаления “шаблонного” или непрофильного текста из каждой статьи. : мы очистили некоторые базовые материалы без использования веб-браузера, и это прекрасно работает для изображений и текста. Однако многие части современного Интернета динамичны-например, они загружаются только тогда, когда вы прокручиваете страницу вниз достаточно далеко или нажимаете на кнопку, чтобы открыть больше контента. Эти динамические сайты сложно очистить, но Selenium позволяет вам запускать реальный веб-браузер и управлять им так же, как человек (но автоматически), и это позволяет вам получить доступ к такому динамическому контенту.
Нет недостатка в других инструментах, и многое можно сделать, просто используя их в сочетании друг с другом. Веб-скребок-это огромный мир, которого мы только что коснулись , но в следующем уроке мы рассмотрим еще несколько вариантов использования веб-скребка, в частности, создание облаков новостных слов.
Читайте также: