Эта статья является второй частью серии - Освоение веб-парсинга с помощью Python. Если вы не читали первую часть, можете начать снизу.



Серийный антракт

  • Освоение веб-парсинга с помощью Python - Введение, часть 1
  • Освоение веб-парсинга с помощью Python - Введение, часть 2 (вы здесь)
  • Освоение веб-парсинга с помощью Python - промежуточная часть 1
  • Освоение веб-парсинга с помощью Python - промежуточная часть 2
  • Освоение веб-парсинга с помощью Python - расширенная часть 1
  • Освоение веб-парсинга с помощью Python - расширенная часть 2

Ранее на веб-парсинге…

В предыдущем антракте мы узнали о различных библиотеках, таких как beautiful soup, request, lxml и pandas, которые используются при парсинге веб-страниц.

Предпосылка

Я предполагаю, что у вас есть базовые навыки программирования и опыт работы на любом языке. Я также предполагаю, что вы успешно настроили среду Python (Jupyter Notebook, PyCharm и т. Д.) На своем ПК. Если нет, скачайте Anaconda Distribution. Дистрибутив Anaconda - это самый простой способ выполнять науку о данных и машинное обучение Python / R в Linux, Windows и Mac OS X. Кроме того, он поставляется с предустановленными пакетами Python и, конечно же, с Jupyter Notebook :).

В этом антракте я в основном цитировал
сообщение Вика Паручури (Учебник по веб-парсингу Python с использованием BeautifulSoup)

Индекс антракта

  • Национальная служба погоды.
  • Скачивание данных о погоде
  • Изучение структуры страницы с помощью инструментов разработчика Chrome
  • Извлечение информации со страницы
  • Извлечение всей информации со страницы
  • Объединение наших данных в фреймворк pandas

Национальная служба погоды

В этом антракте мы будем собирать прогнозы погоды в Национальной метеорологической службе. А затем анализируя их с помощью библиотеки Pandas, конвертируя данные в объект Python и представляя этот объект в фреймворке данных.

Скачивание данных о погоде

Теперь мы знаем достаточно, чтобы приступить к извлечению информации о местной погоде с веб-сайта Национальной метеорологической службы. Первый шаг - найти страницу, которую мы хотим очистить. Мы будем извлекать информацию о погоде в центре Сан-Франциско с этой страницы.

Извлечем данные о расширенном прогнозе.

Как видно из изображения, на странице представлена ​​информация о расширенном прогнозе на следующую неделю, включая время суток, температуру и краткое описание условий.

Изучение структуры страницы с помощью инструментов разработчика Chrome

Первое, что нам нужно сделать, это проверить страницу с помощью Chrome Devtools. Если вы используете другой браузер, у Firefox и Safari есть эквиваленты. Однако рекомендуется использовать Chrome.

Вы можете запустить инструменты разработчика в Chrome, нажав View -> Developer -> Developer Tools. У вас должна получиться панель в нижней части браузера, подобная той, что вы видите ниже. Убедитесь, что панель Elements выделена:

Инструменты разработчика Chrome.

Панель элементов покажет вам все теги HTML на странице и позволит вам перемещаться по ним. Это действительно удобная функция!

Щелкнув правой кнопкой мыши на странице рядом с надписью «Расширенный прогноз», а затем нажав «Проверить», мы откроем тег, содержащий текст «Расширенный прогноз» на панели элементов:

Расширенный текст прогноза.

Затем мы можем прокрутить вверх на панели элементов, чтобы найти «самый внешний» элемент, который содержит весь текст, соответствующий расширенным прогнозам. В данном случае это тег div с идентификатором seven-day-forecast:

Div, содержащий расширенные элементы прогноза.

Если вы щелкнете по консоли и исследуете div, вы обнаружите, что каждый элемент прогноза (например, «Сегодня вечером», «Четверг» и «Вечер четверга») содержится в div с классом tombstone-container.

Теперь мы знаем достаточно, чтобы загрузить страницу и начать ее анализ. В приведенном ниже коде мы:

  • Загрузите веб-страницу с прогнозом.
  • Создайте класс BeautifulSoup для анализа страницы.
  • Найдите div с идентификатором seven-day-forecast и назначьте seven_day
  • Внутри seven_day найдите каждый отдельный элемент прогноза.
  • Извлеките и распечатайте первый элемент прогноза.
page = requests.get("http://forecast.weather.gov/MapClick.php?lat=37.7772&lon=-122.4168")
soup = BeautifulSoup(page.content, 'html.parser')
seven_day = soup.find(id="seven-day-forecast")
forecast_items = seven_day.find_all(class_="tombstone-container")
tonight = forecast_items[0]
print(tonight.prettify())

Полученный результат:

<div class="tombstone-container">
 <p class="period-name">
  Tonight
  <br>
   <br/>
  </br>
 </p>
 <p>
  <img alt="Tonight: Mostly clear, with a low around 49. West northwest wind 12 to 17 mph decreasing to 6 to 11 mph after midnight. Winds could gust as high as 23 mph. " class="forecast-icon" src="newimages/medium/nfew.png" title="Tonight: Mostly clear, with a low around 49. West northwest wind 12 to 17 mph decreasing to 6 to 11 mph after midnight. Winds could gust as high as 23 mph. "/>
 </p>
 <p class="short-desc">
  Mostly Clear
 </p>
 <p class="temp temp-low">
  Low: 49 °F
 </p>
</div>

Извлечение информации со страницы

Как видите, внутри элемента прогноза tonight находится вся необходимая нам информация. Мы можем извлечь 4 частей информации:

  • Имя элемента прогноза - в данном случае Tonight.
  • Описание условий - хранится в свойстве title img.
  • Краткое описание условий - в данном случае Mostly Clear.
  • Температура низкая - в данном случае 49 градусов.

Сначала мы извлечем название элемента прогноза, краткое описание и температуру, поскольку все они похожи:

Теперь мы можем извлечь атрибут title из тега img. Для этого мы просто рассматриваем объект BeautifulSoup как словарь и передаем нужный нам атрибут в качестве ключа:

img = tonight.find("img")
desc = img['title']

print(desc)

Полученный результат:

Tonight: Mostly clear, with a low around 49. West northwest wind 12 to 17 mph decreasing to 6 to 11 mph after midnight. Winds could gust as high as 23 mph.

Извлечение всей информации со страницы

Теперь, когда мы знаем, как извлекать каждую отдельную часть информации, мы можем объединить наши знания с CSS-селекторами и списками, чтобы извлечь все сразу.

В приведенном ниже коде мы:

  • Выберите все элементы с классом period-name внутри элемента с классом tombstone-container в seven_day.
  • Используйте составление списка для вызова метода get_text для каждого BeautifulSoupобъекта.

Как вы можете видеть выше, наша техника дает нам каждое из названий периодов по порядку. Мы можем применить ту же технику для получения других 3 полей:

short_descs = [sd.get_text() for sd in seven_day.select(".tombstone-container .short-desc")]
temps = [t.get_text() for t in seven_day.select(".tombstone-container .temp")]
descs = [d["title"] for d in seven_day.select(".tombstone-container img")]print(short_descs)print(temps)print(descs)

Результат:

['Mostly Clear', 'Sunny', 'Mostly Clear', 'Sunny', 'Slight ChanceRain', 'Rain Likely', 'Rain Likely', 'Rain Likely', 'Chance Rain']
['Low: 49 °F', 'High: 63 °F', 'Low: 50 °F', 'High: 67 °F', 'Low: 57 °F', 'High: 64 °F', 'Low: 57 °F', 'High: 64 °F', 'Low: 55 °F']
['Tonight: Mostly clear, with a low around 49. West northwest wind 12 to 17 mph decreasing to 6 to 11 mph after midnight. Winds could gust as high as 23 mph. ', 'Thursday: Sunny, with a high near 63. North wind 3 to 5 mph. ', 'Thursday Night: Mostly clear, with a low around 50. Light and variable wind becoming east southeast 5 to 8 mph after midnight. ', 'Friday: Sunny, with a high near 67. Southeast wind around 9 mph. ', 'Friday Night: A 20 percent chance of rain after 11pm.  Partly cloudy, with a low around 57. South southeast wind 13 to 15 mph, with gusts as high as 20 mph.  New precipitation amounts of less than a tenth of an inch possible. ', 'Saturday: Rain likely.  Cloudy, with a high near 64. Chance of precipitation is 70%. New precipitation amounts between a quarter and half of an inch possible. ', 'Saturday Night: Rain likely.  Cloudy, with a low around 57. Chance of precipitation is 60%.', 'Sunday: Rain likely.  Cloudy, with a high near 64.', 'Sunday Night: A chance of rain.  Mostly cloudy, with a low around 55.']

Объединение наших данных в фреймворк pandas

Теперь мы можем объединить данные в DataFrame Pandas и проанализировать его. DataFrame - это объект, который может хранить табличные данные, что упрощает анализ данных. Если вы хотите узнать больше о Pandas, посетите наш бесплатный курс здесь.

Для этого мы вызовем класс DataFrame и передадим каждый список элементов, которые у нас есть. Мы передаем их как часть словаря. Каждый ключ словаря станет столбцом в DataFrame, а каждый список станет значениями в столбце:

import pandas as pd
weather = pd.DataFrame({
        "period": periods,
         "short_desc": short_descs,
         "temp": temps,
         "desc":descs
    })
weather

Наш результат становится:

Что дальше?

В следующем антракте мы будем работать с другой библиотекой Python, известной как selenium. Мы будем работать с веб-приложением Instagram и выполнять такие действия, как вход в систему, прокрутка, загрузка подписей и загрузка изображений. Представьте, что у вас есть 2000 изображений в Instagram. Вы решите использовать парсинг веб-страниц и автоматизировать этот процесс, или вы будете загружать их одну за другой?

Дополнительная информация





Краткое введение в библиотеку Python« Pandas
Немного предыстории кdatascience.com»



Рекомендуемое чтение



Разветвите меня на GitHub

Ознакомьтесь с полным исходным кодом по следующей ссылке:

https://github.com/themavencoder/web-scraping-tutorial