Web Scraping. Часть 1

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

Введение


Всем привет. Недавно у меня возникла идея о том, чтобы поделиться с интересующимся кругом лиц о том как пишутся скраперы. Так как большинству аудитории знаком Python все дальнейшие примеры будут написаны на нём.


Данная часть рассчитана для того, чтобы познакомить тех, кто ещё не пробовал себя в данной сфере. Если вы уже продвинутый читатель, то можете смело листать дальше, но для сохранения закономерности я бы посоветовал уделить немного внимания данной статье.


print('Part 1. Get started')

Инструменты


  • Язык программирования и соответствующие библиотеки
    Конечно, без него никуда. В нашем случае будет использован Python. Данный язык является довольно сильным инструментом для написания скраперов, если уметь правильно пользоваться им и его библиотеками: requests, bs4, json, lxml, re.
  • Инструменты разработчика
    Каждый современный браузер имеет данную утилиту. Лично мне удобно пользоваться Google Chrome или Firefox. Если вы пользуетесь другим браузерами, рекомендую попробовать один из вышеперечисленных. Здесь нам понадобятся практически все инструменты: elements, console, network, application, debuger.
  • Современная IDE
    Здесь выбор остаётся за вами, единственное, что хотелось бы посоветовать — наличие компилятора, debuger'a и статического анализатора в вашей среде разработке. Я отдаю своё предпочтение PyCharm от JetBrains.

Немного о формате


Для себя я выделяю два принципа извлечения и анализа данных: frontend, backend.


Frontend. В данном случае мы непосредственно получаем информацию из конечного HTML файла, собранного на сервере веб-приложения. У данного способа есть свои плюсы и минусы: мы всегда получаем информацию, которая уже точно загружена на сайт, но теряем производительность, так как иногда нам нужно узнавать об обновлениях сайта как можно быстрее.


Backend. В данном случае мы получаем информацию от backend api веб-приложения в формате json или xml. Сразу хочу сказать, что не у всех сайтов возможно получить доступ к api, иногда даже невозможно, если анализировать только сайт и приходится анализировать протокол мобильного приложения. Однако если у нас получается найти способы и точки для обращения к api веб-приложения, то мы получаем структурированную информацию и хорошую производительность нашего скрапера.


Работа с Frontend сайта


Здесь мы работаем с селекторами, чтобы получить нужные нам элементы. Для этого для начала нам нужно подключить библиотеку requests и сделать запрос. Отдельное внимание стоит уделить headers, т.к. с их помощью сервер анализирует запрос и возвращает вам результат в зависимости от того, что было в них указано, настоятельно рекомендую найти информацию про стандартные хэддеры и их значения. Для примеря я выбрал сайт: Kith


import requests

headers = {
    'authority': 'www.kith.com',
    'cache-control': 'max-age=0',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36',
    'sec-fetch-dest': 'document',
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-user': '?1',
    'accept-language': 'en-US,en;q=0.9',
}

session = requests.session()

response = session.get("https://kith.com/collections/mens-footwear", headers=headers)

if response.status_code == 200:
    print("Success")
else:
    print("Bad result")

Далее нам необходимо забрать элементы. С помощью инструментов разработчика(Ctrl+Shift+I) мы можем посмотреть селекторы элементов, который нас интересуют.
И выведем интересующие нас параметры: название, цена, ссылка на продукт.


soup = BeautifulSoup(response.text, 'html.parser')

for element in soup.find_all('li', class_='collection-product'):
    name = element.find('h1', class_="product-card__title").text.strip()
    price = element.find('span', class_="product-card__price").text.strip()
    link = "https://kith.com/" + element.find('a').get('href')

Для удобного взаимодействия с продуктами создадим класс


class Prodcut:
    name = str
    price = str
    link = str

    def __init__(self, name, price, link):
        self.name = name
        self.price = price
        self.link = link

    def __repr__(self):
        return str(self.__dict__)

Теперь наш скрипт готов, остаётся его выполнить и вывести результат


import requests
from bs4 import BeautifulSoup

class Prodcut:
    name = str
    price = str
    link = str

    def __init__(self, name, price, link):
        self.name = name
        self.price = price
        self.link = link

    def __repr__(self):
        return str(self.__dict__)

headers = {
    'authority': 'www.yeezysupply.com',
    'cache-control': 'max-age=0',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36',
    'sec-fetch-dest': 'document',
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-user': '?1',
    'accept-language': 'en-US,en;q=0.9',
}

session = requests.session()

response = session.get('https://kith.com/collections/mens-footwear', headers=headers)

soup = BeautifulSoup(response.text, 'html.parser')

for element in soup.find_all('li', class_='collection-product'):
    name = element.find('h1', class_="product-card__title").text.strip()
    price = element.find('span', class_="product-card__price").text.strip()
    link = "https://kith.com/" + element.find('a').get('href')

    prodcut = Prodcut(name, price, link)

    print(prodcut.__repr__())

Заключение


Мы рассмотрели основные технологии и принципы, с которыми нам предстоит познакомиться в следующих частях. Рекомендую самостоятельно попробовать выполнить задачи с перечисленными библиотеками, а также буду рад выслушать ваши предпочтения по поводу сайта, который будет выбран в качестве примера. Далее мы разберём как искать точки backend api и взаимодействовать с ними.

Источник: https://habr.com/ru/post/488720/


Интересные статьи

Интересные статьи

Это последний пост из серии 4-х постов, посвященной заглядыванию внутрь Chrome, и исследующей, как он обрабатывает наш код для отображения веб-сайта. В предыдущем посте мы рассмотрели *ре...
Недавно мы пригласили в эфир "Цинкового прода" Алексея Лесовского из компании Data Egret. Разговор получился интересный и познавательный, поэтому предлагаю вашему вниманию расшифровку э...
Наверное, мало какому айтишнику нужно объяснять, что такое Memtest86+ — пожалуй, он уже стал более-менее стандартом в тестировании оперативной памяти на ПК. Когда в одной из предыдущих частей я...
Это первая часть серии статей по основам микросервисных архитектур. В ней вы познакомитеь с концепцией микросервисов и узнаете, как создавать микросервисы с помощью Spring Boot и Spring Cloud. ...
Больше RFID-меток богу RFID-меток! С момента публикации статьи про RFID-метки прошло уже без малого 7 лет. За эти годы путешествий и пребывания в различных странах, в карманах поднакопилось ...