Рубрики
Без рубрики

Разработайте свой первый веб-скребок на Python с помощью Beautifulsoup

В этом посте вы узнаете, как написать простой веб-скребок на Python с помощью запросов и библиотек Beautifulsoup.

Автор оригинала: Adnan Siddiqi.

Я собираюсь написать простейший веб-скребок на Python с помощью таких библиотек, как requests и BeautifulSoup . Прежде чем я продолжу, позвольте мне обсудить, что такое очистка веб-страниц/HTML.

Что такое соскабливание паутины?

Согласно Википедия :

Веб-скребок (сбор веб-данных или извлечение веб-данных) – это метод компьютерного программного обеспечения для извлечения информации с веб-сайтов. Это достигается либо прямой реализацией протокола передачи гипертекста (на котором основан Веб), либо внедрением веб-браузера.

Поэтому используйте метод соскабливания для доступа к данным с веб-страниц и сделайте их полезными для различных целей (например, анализ, агрегирование и т. Д.). Очистка-это не единственный способ извлечения данных с веб-сайта или веб-приложения, есть и другие способы достижения этой цели, например, с помощью API/SDK, предоставляемых приложением, каналов RSS/Atom и т.д. Если такие средства уже предусмотрены, соскоб должен

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

Теперь мне нужно выбрать какую-нибудь веб-страницу, чтобы получить необходимую информацию. Я выбрал OLX для этой цели, страница, которую я собираюсь очистить, – это одна из подробных страниц объявления, объявление об автомобиле здесь .

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

На странице | есть некоторая полезная информация для моей системы сравнения цен: Название, Цена, Местоположение, Изображения, имя владельца и Описание .

Давайте сначала возьмем Название. Одним из предварительных условий написания web scrapper является то, что вы должны достаточно хорошо использовать HTML-инспектор, предоставляемый в веб-браузерах, потому что, если вы не знаете, какую разметку или тег нужно выбрать, вы не сможете получить необходимые данные. Этот учебник по Chrome должен быть полезен, если вы раньше не использовали инспекторы. Хорошо, ниже приведен HTML-код заголовка объявления:

Давайте сначала возьмем Название. Одним из предварительных условий написания web scrapper является то, что вы должны достаточно хорошо использовать HTML-инспектор, предоставляемый в веб-браузерах, потому что, если вы не знаете, какую разметку или тег нужно выбрать, вы не сможете получить необходимые данные. Этот учебник по Chrome должен быть полезен, если вы раньше не использовали инспекторы. Хорошо, ниже приведен HTML-код заголовка объявления:

Как видите, все довольно просто, заголовок объявления написан в теге H1 и использует классы css brkword lheight28 . Важная вещь: убедитесь, что вы можете максимально сузить свой выбор, особенно когда вы выбираете одну запись, потому что, если вы просто выберете общий HTML-тег, есть вероятность, что такой тег существует на странице более одного раза. Это не часто встречается для тега H1, но поскольку я обнаружил, что они также указывают имена классов, я выбрал и это, в этом конкретном сценарии есть только один экземпляр тега H1, поэтому, даже если я выберу тег H1 без классов, я все равно получу необходимую информацию.

Хорошо, теперь я собираюсь написать код. Первая задача-получить доступ к странице, проверить, доступна ли она, а затем получить доступ к ее html-коду.

import requests
from bs4 import BeautifulSoup

url = 'https://www.olx.com.pk/item/civic-87gl-a-cng-cleared-IDUIaEZ.html#8dc446e009'
headers = {
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'}

r = requests.get(url, headers=headers)

# make sure that the page exist

if r.status_code == 200:
    html = r.text
    soup = BeautifulSoup(html, 'lxml')
    title = soup.find('h1')
    if title is not None:
        title_text = title.text.strip()

Здесь я получаю доступ к странице с помощью библиотеки запросов Python, вы также можете использовать другие, такие как urllib , но поскольку я люблю простоту, обеспечиваемую запросами, я вообще не ищу никакой другой библиотеки.

Страница была доступна, я также передал UserAgent в заголовке. Это не обязательно, но часто случается, что сайт не позволяет вам получить доступ к странице, если определенный заголовок не отправляется с Http-запросом. Кроме того, также хорошо выйти чистым и сообщить серверу, что вы пытаетесь быть хорошим, предоставляя пользовательский агент.

После создания объекта BeautifulSoup я получаю доступ к тегу H1. Есть несколько способов сделать это, но в основном я полагаюсь на метод select (), так как он позволяет использовать селекторы CSS. Это было просто, поэтому я просто использовал метод find () . Более подробная информация приведена на веб-сайте документации BS.

Вы можете задаться вопросом, почему я проверяю, есть ли тег H1, хотя очевидно, что он там. Причина в том, что у вас нет контроля над веб-сайтами других людей. Существует вероятность того, что они по какой-либо причине изменят разметку или структуру сайта, и ваш код перестанет работать. Поэтому лучше всего проверить существование каждого элемента, и если он существует, то продолжайте дальше. Он также может помочь вам регистрировать ошибки и отправлять уведомления администраторам сайта или системе управления журналами, чтобы проблема могла быть устранена как можно скорее.

Как только объект заголовка найден, я получил его текст и использовал strip (), чтобы удалить все пробелы. Никогда не доверяйте данным, полученным с веб-сайта. Вы всегда должны очищать и преобразовывать его в соответствии с вашими потребностями. Затем я получил местоположение, которое похоже на то, что я сделал для названия, а затем цены.

location = soup.find('strong', {'class': 'c2b small'})
    if location is not None:
        location_text = location.text.strip()

price = soup.select('div > .xxxx-large')
    if price is not None:
        price_text = price[0].text.strip('Rs').strip()

Здесь, как вы можете видеть, я использовал метод select () , он используется для поиска элементов с помощью селекторов CSS. Я мог бы достичь того же результата, используя find (), но просто ради разнообразия я выбрал это. Select возвращает элемент списка, поскольку несколько элементов могут соответствовать критериям в случае селекторов. Я выбрал один-единственный элемент, соответствующий критериям и извлеченной цене. Затем я выбрал URL-адреса изображений и описания.

images = soup.select('#bigGallery > li > a')
    img = [image['href'].strip() for image in images]

    description = soup.select('#textContent > p')
    if description is not None:
        description_text = description[0].text.strip()

# Creating a dictionary Object
item = {}
item['title'] = title_text
item['description'] = description_text
item['location'] = location_text
item['price'] = price_text
item['images'] = img

В последнем я создал объект словаря. Это не часть очистки, а просто для получения данных в стандартном формате для дальнейшей обработки, которую я создал. Вы также можете конвертировать в XML, CSV все, что захотите.

Код доступен на Github .

Эта статья первоначально опубликована здесь .