Руководство по парсингу веб-страниц с помощью Python с использованием Beautiful Soup

Опубликовано: 2020-06-23
Оглавление показать
Введение в парсинг веб-страниц с помощью Python:
Как работает BeautifulSoup?
Как очистить данные с веб-страниц с помощью BeautifulSoup?
Процесс парсинга веб-страниц:
Вывод:

Введение в парсинг веб-страниц с помощью Python:

Когда дело доходит до просмотра веб-страниц, некоторые языки программирования предпочтительнее других. Одним из самых популярных среди них является Python. Помимо того, что это один из самых простых языков для изучения из-за более плавной кривой обучения, он также имеет то преимущество, что он является языком с широкой поддержкой разработчиков, что привело к появлению множества сторонних пакетов. Эти пакеты можно использовать для нескольких функций, что может быть сложно реализовать с помощью ядра Python. Некоторые распространенные примеры: для обработки изображений или компьютерного зрения мы используем OpenCV, для машинного обучения мы используем TensorFlow, а для построения графиков мы используем MatplotLib. Когда дело доходит до просмотра веб-страниц, одной из наиболее часто используемых библиотек является BeautifulSoup. Эта библиотека специально не очищает данные из Интернета, но если вы можете получить HTML-файл веб-страницы, она может помочь извлечь из него определенные точки данных. Как правило, библиотека используется для извлечения точек данных из документов XML и HTML.

Как работает BeautifulSoup?

Прежде чем приступить к написанию кода на Python, вы должны понять, как работает BeautifulSoup. После того, как вы извлекли HTML-контент веб-страницы и сохранили его в переменной, скажем, html_obj, вы можете преобразовать его в объект BeautifulSoup всего одной строкой кода:

суп_обж = красивый суп (html_obj, 'html.parser')

Где html_obj — это данные HTML, суп_обж — это полученный объект bs, а «html.parser» — это парсер, который использовался для преобразования. Когда у вас есть объект bs, названный суп_объект, обойти его очень просто, а так как обход достаточно прост, извлечение данных также становится простым. Возьмем пример. Скажем, вам нужно получить точку данных, называемую названием продукта, которая присутствует на каждой странице веб-сайта электронной коммерции. Теперь вы загрузили одну HTML-страницу продукта с этого веб-сайта и поняли, что на каждой странице есть название продукта, указанное в элементе типа span, имеющем идентификатор в качестве productTitle. Итак, как вы будете получать эти данные, скажем, с 1000 страниц продукта? Ну, вы получите данные HTML для каждой страницы и извлечете точку данных следующим образом:

для промежутков в soap.findAll('span', attrs={'id': 'productTitle'}):
name_of_product = spans.text.strip()

Хотя это способ получить текстовые данные между определенным элементом тега, вы также можете получать данные из атрибутов тега.

Веб-скрейпинг

Как очистить данные с веб-страниц с помощью BeautifulSoup?

Теперь, когда у нас есть некоторое общее представление о том, как осуществляется обход объекта bs, давайте напишем код и посмотрим, как он работает. Используя приведенный ниже фрагмент кода, вы можете очень легко извлечь данные из Zillow, ведущего рынка недвижимости из США. Вы можете запустить этот код и ввести URL-адрес листинга, чтобы получить выходные данные в формате JSON. Давайте разберемся с кодом, строка за строкой. Прежде всего, убедитесь, что на вашем компьютере установлен Python 3.7 или выше. Используйте pip для установки BeautifulSoup. Все остальные пакеты поставляются вместе с Python, так что вам не нужно их устанавливать. После этого установите редактор кода, такой как Atom или VS Code, и вы готовы к работе. Понимание кода важно, поэтому мы начнем с самой первой строки. Вам нужны четыре оператора импорта для определенных функций. Далее у вас есть три строки, начинающиеся с «ctx». Они специально предназначены для игнорирования ошибок SSL-сертификата, с которыми вы можете столкнуться при доступе к веб-сайтам через свой код. Затем мы принимаем URL-адрес веб-сайта в качестве входных данных от пользователя. Здесь вы также можете жестко закодировать URL-адрес или даже иметь массив из нескольких URL-адресов.

Процесс парсинга веб-страниц:

Затем мы получаем доступ к веб-странице, используя функцию запроса urllib. Не забудьте добавить User-Agent в заголовок, чтобы веб-сайт считал, что вы используете браузер. Причина этого заключается в том, что веб-сайты предназначены для доступа через браузеры, а не через код, и, следовательно, они могут заблокировать ваш IP-адрес, если поймают вас. Как только это будет сделано, мы выполнили все основные шаги, а затем мы будем преобразовывать объект HTML в объект bs, а затем преобразовывать его в формат utf-8 для обработки специальных символов и символов на веб-странице. Как только это будет сделано, мы извлекаем заголовок, краткие сведения и другие свойства путем разбора объекта bs. Как видите, в теге скрипта с атрибутом type = application/ld+json есть несколько точек данных, которые хранятся в формате JSON. Кроме того, вы можете видеть, что мы используем проверку i==0 и i==1. Это связано с тем, что на странице есть два тега скрипта (с одинаковым атрибутом). Первый тег дает нам некоторые точки данных, а второй — остальные. Как только мы извлекли все точки данных, вы можете сохранить их в файле JSON и сохранить как у нас. Вы также можете сохранить, загрузить его на сайт или даже отправить данные в API, если хотите.

импортировать json
импорт SSL
из запроса импорта urllib.request, urlopen
из bs4 импортировать BeautifulSoup

# Игнорировать ошибки сертификата SSL
ctx = ssl.create_default_context()
ctx.check_hostname = Ложь
ctx.verify_mode = ssl.CERT_NONE

# Берем URL листинга Zillow в качестве входных данных
url = input('Введите URL-адрес листинга Zillow House- ')

# Заставьте веб-сайт поверить, что вы используете браузер
req = Request(url, headers={'User-Agent': 'Mozilla/5.0'})
веб-страница = urlopen(req).read()

# HTML-страница -> Суп объектов BeautifulSoup = BeautifulSoup(веб-страница, 'html.parser')
html = суп.prettify('utf-8')
property_details = {'details_long': {}, 'адрес': {}}

# Извлечение различных точек данных из списка свойств
для заголовка в soap.findAll('title'):
property_details['Заголовок'] = title.text.strip()
ломать

для мета в супе.findAll('meta', attrs={'name': 'description'}):
property_details['details_short'] = мета['content'].strip()

для div в супе.findAll('div', attrs={'class': 'усечено количество символов'}):
property_details['details_long']['Описание'] = div.text.strip()

for (i, script) в enumerate(soup.findAll('script',
attrs={'тип': 'приложение/ld+json'})):
если я == 0:
json_data = json.loads (сценарий.текст)
property_details['details_long']['no_of_rooms'] = json_data['numberOfRooms']
property_details['details_long']['floor_size_in_sqrft'] = json_data['floorSize']['value']
property_details['адрес']['улица'] = json_data['адрес']['streetAddress']
property_details['address']['locality'] = json_data['address']['addressLocality']
property_details['адрес']['регион'] = json_data['адрес']['адресрегион']
property_details['адрес']['почтовый_код'] = json_data['адрес']['почтовый_код']
если я == 1:
json_data = json.loads (сценарий.текст)
property_details['price_in_dollars'] = json_data['предложения']['цена']
property_details['inage'] = json_data['изображение']
ломать

с open('house_listing_data.json', 'w') в качестве выходного файла:
json.dump (property_details, outfile, отступ = 4)

с open('house_listing_data.html', 'wb') в виде файла:
файл.записать(html)

print('———-Извлечение данных завершено. Проверьте файл json.———-')

Выходной JSON должен выглядеть примерно так:

{
«детали_длинные»: {
«количество_комнат»: 3,
«floor_size_in_sqrft»: «1392»
},
"адрес": {
«улица»: «22516 Джоан Д-р»,
«местность»: «Калифорния»,
«регион»: «MD»,
«почтовый_код»: «20619»
},
«Заголовок»: «22516 Джоан Д-р, Калифорния, Мэриленд 20619 | МЛС № МДСМ167670»,
«details_short»: «22516 Joan Dr , California, MD 20619-3175 — дом на одну семью, выставленный на продажу за 150 000 долларов. Дом площадью 1392 кв. Фута состоит из 3 спален и 2 ванных комнат. Найдите 40 фотографий дома 22516 Joan Dr на Zillow. Просматривайте дополнительные сведения о недвижимости, историю продаж и данные Zestimate на Zillow. МЛС № МДСМ167670»,
«цена_в_долларах»: 150000,
«inage»: «https://photos.zillowstatic.com/p_h/ISn2oi3glpvdv10000000000.jpg»
}

Вывод:

Использование BeautifulSoup для веб-скрейпинга может быть простым, если вы можете сначала проанализировать HTML-страницы вручную и выбрать теги, на которые нужно ориентироваться. Он может работать на страницах, которые не имеют динамического контента и не находятся за страницей входа. Для более сложных веб-страниц вам понадобятся более сложные инструменты. Наша команда PromptCloud помогает компаниям, которые хотят использовать данные и принимать решения на основе данных. Мы не только помогаем настроить полностью автоматизированные механизмы веб-скрапинга, которые запускаются с частыми интервалами в облаке, но также помогаем компаниям анализировать данные для извлечения тенденций и другой полезной информации.