Вступайте, юные веб-ниндзя! Готовы ли вы повысить уровень своей игры по сбору данных? Если вы мечтали парсить даже самые хитрые веб-сайты, обходить блокировки и не оставлять следов, то вы попали в нужное место.

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

Просто хедз-ап! Вам нужно будет ознакомиться с основами Python, парсингом веб-страниц и такими библиотеками, как BeautifulSoup, запросы и Selenium. Но не волнуйтесь, если у вас все еще белый пояс в этих областях. Интернет полон знаний, готовых к открытию. Ознакомьтесь с основами, затем возвращайтесь сюда и давайте побеждать!

Раунд 1: Строительство базы

Каждому ниндзя нужно свое оружие. Здесь скребок — это наша катана, инструмент, который выполняет свою работу.

Скребок

Начнем с создания скребка. Мы будем использовать BeautifulSoup Python и библиотеки запросов. Если BeautifulSoup — это проворные глаза нашего ниндзя, обнаруживающие и анализирующие любую информацию, то запросы — это быстрые ноги, которые достигают любого уголка Интернета.

from bs4 import BeautifulSoup
import requests
def scrape_site(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    return soup

В этом фрагменте scrape_site берет URL-адрес, отправляет запрос GET и анализирует HTML с помощью BeautifulSoup. Аккуратно и чисто, как удар ниндзя.

Прокси

Далее, давайте углубимся в наши маскировки, прокси. Прокси — это промежуточные серверы, которые передают наши запросы, маскируя нашу истинную личность и местонахождение. Мы можем получить список бесплатных прокси с https://www.sslproxies.org/. Давайте создадим функцию для парсинга этого сайта и возврата списка прокси:

def get_proxies():
    url = 'https://www.sslproxies.org/'
    soup = scrape_site(url)
    proxies = [{'http': proxy.text} for proxy in soup.select('td:nth-child(1)')]
    return proxies

get_proxies — это простая функция, которая очищает https://www.sslproxies.org/, анализирует IP-адреса из первого столбца таблицы и возвращает их в виде списка словарей. Умно, не так ли?

Обработка ошибок

Быть ниндзя не означает, что вы не споткнетесь и не упадете. Все дело в том, как вы встанете на ноги. То же самое касается и нашего скребка. Он может наткнуться на неисправный прокси-сервер или столкнуться с блокировкой сайта. В таких случаях он должен иметь возможность переключиться на новый прокси-сервер и повторить попытку. Давайте добавим эту логику в нашу функцию scrape_site:

import random
def scrape_site_with_proxies(url, proxies):
    while True:
        try:
            proxy = random.choice(proxies)
            response = requests.get(url, proxies=proxy, timeout=5)
            soup = BeautifulSoup(response.text, 'html.parser')
            return soup
        except:
            proxies.remove(proxy)

Здесь мы выбираем случайный прокси из нашего списка, отправляем запрос GET с использованием этого прокси и анализируем HTML. Если что-то пойдет не так, мы удалим неисправный прокси из нашего списка и повторим попытку с другим.

Раунд 2: Реальный пример

Большой! Мы построили ядро ​​нашего скребка. Теперь давайте проверим это. Давайте возьмем несколько вдохновляющих цитат с http://quotes.toscrape.com/ и сохраним их в базе данных MongoDB. Этот веб-сайт является безопасным местом для начинающих веб-ниндзя, где они могут практиковать свои приемы веб-скрейпинга.

Настройка базы данных

Прежде всего, давайте установим соединение с нашей базой данных MongoDB и укажем коллекцию для хранения наших котировок. Мы также добавим функцию save_quote_to_db для вставки котировок в нашу базу данных.

from pymongo import MongoClient
client = MongoClient('mongodb://localhost:27017/')
db = client['quote_database']
collection = db['quotes']
def save_quote_to_db(quote, author):
    collection.insert_one({'quote': quote, 'author': author})

Стереть и сохранить

Теперь давайте перейдем к скребковой части.

def scrape_quotes(url, proxies):
    while True:
        try:
            proxy = random.choice(proxies)
            response = requests.get(url, proxies=proxy, timeout=5)
            soup = BeautifulSoup(response.text, 'html.parser')
            for quote_block in soup.find_all(class_='quote'):
                quote = quote_block.find(class_='text').get_text()
                author = quote_block.find(class_='author').get_text()
                save_quote_to_db(quote, author)
            next_page = soup.find(class_='next')
            if next_page is None:
                break
            url = 'http://quotes.toscrape.com' + next_page.find('a')['href']
        except:
            proxies.remove(proxy)

В scrape_quotes мы используем суп, чтобы найти все цитаты на странице. Для каждой цитаты мы извлекаем текст и автора, а затем сохраняем их в нашу базу данных с помощью save_quote_to_db.

Здесь мы также обрабатываем пагинацию. Если на странице есть кнопка «Далее», мы берем ссылку и используем ее в качестве нового URL-адреса для следующей итерации.

Вуаля! Наш ниндзя успешно проник на сайт, извлек ценные данные и сохранил их на будущее.

Раунд 3: вызов крупной рыбе — Shopify

Теперь, когда вы освоились, давайте поднимем планку и погрузимся в более сложный сценарий. Мы будем собирать информацию о продуктах с веб-сайтов на основе Shopify.

Отказ от ответственности: Веб-скрапинг противоречит Условиям обслуживания Shopify. Этот пример предназначен для образовательных целей и не должен использоваться для парсинга в реальном мире без явного разрешения.

Shopify — это популярная платформа электронной коммерции с веб-сайтами, созданными с помощью JavaScript. Чтобы очистить такой динамический контент, нам понадобится Selenium, мощная библиотека, которая может управлять веб-браузером.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()  # Assuming you have the ChromeDriver installed and it's available in your PATH
def scrape_shopify(url, proxies):
    while True:
        try:
            proxy = random.choice(proxies)
            webdriver.DesiredCapabilities.CHROME['proxy'] = {
                "httpProxy": proxy,
                "ftpProxy": proxy,
                "sslProxy": proxy,
                "proxyType": "MANUAL",
            }
            
            driver.get(url)
            WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '.grid-view-item')))
            product_elements = driver.find_elements_by_css_selector('.grid-view-item')
            for product_element in product_elements:
                title = product_element.find_element_by_css_selector('.product-card__name').text
                price = product_element.find_element_by_css_selector('.product-card__price').text
                save_product_to_db(title, price)
            next_page = driver.find_element_by_css_selector('.next')
            if next_page is None:
                break
            url = next_page.get_attribute('href')
        except:
            proxies.remove(proxy)
driver.quit()  # Don't forget to close the driver at the end

В scrape_shopify мы загружаем каждую страницу в браузер, управляемый Selenium. Мы ждем, пока продукты загрузятся, извлекаем название и цену каждого продукта и обрабатываем разбиение на страницы.

И вот оно, товарищ веб-ниндзя! Благодаря этим новым навыкам вы сможете ориентироваться в динамичном мире Shopify.

Заключительные слова

Поздравляем! Вы успешно прошли это интенсивное обучение и стали опытным веб-ниндзя. С вашим интеллектуальным скрейпером никакие данные не будут вне вашей досягаемости.

Но помните, с большой силой приходит большая ответственность. Крайне важно соблюдать условия обслуживания веб-сайта и избегать причинения вреда серверам, отправляя слишком много запросов за короткий промежуток времени.

Вооружившись новыми знаниями, вперед и покоряйте мир данных. Удачного скрейпинга!

🔗 Свяжитесь со мной в LinkedIn!

Я надеюсь, что вы нашли эту статью полезной! Если вы хотите узнать больше и быть в курсе моих последних идей и статей, не стесняйтесь связаться со мной в LinkedIn.

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

Подпишитесь на меня в LinkedIn ➡️