Web Scraping. Часть 1
- вторник, 18 февраля 2020 г. в 00:26:25
Всем привет. Недавно у меня возникла идея о том, чтобы поделиться с интересующимся кругом лиц о том как пишутся скраперы. Так как большинству аудитории знаком Python все дальнейшие примеры будут написаны на нём.
Данная часть рассчитана для того, чтобы познакомить тех, кто ещё не пробовал себя в данной сфере. Если вы уже продвинутый читатель, то можете смело листать дальше, но для сохранения закономерности я бы посоветовал уделить немного внимания данной статье.
print('Part 1. Get started')
Для себя я выделяю два принципа извлечения и анализа данных: frontend, backend.
Frontend. В данном случае мы непосредственно получаем информацию из конечного HTML файла, собранного на сервере веб-приложения. У данного способа есть свои плюсы и минусы: мы всегда получаем информацию, которая уже точно загружена на сайт, но теряем производительность, так как иногда нам нужно узнавать об обновлениях сайта как можно быстрее.
Backend. В данном случае мы получаем информацию от backend api веб-приложения в формате json или xml. Сразу хочу сказать, что не у всех сайтов возможно получить доступ к api, иногда даже невозможно, если анализировать только сайт и приходится анализировать протокол мобильного приложения. Однако если у нас получается найти способы и точки для обращения к api веб-приложения, то мы получаем структурированную информацию и хорошую производительность нашего скрапера.
Здесь мы работаем с селекторами, чтобы получить нужные нам элементы. Для этого для начала нам нужно подключить библиотеку 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 и взаимодействовать с ними.