Вступайте, юные веб-ниндзя! Готовы ли вы повысить уровень своей игры по сбору данных? Если вы мечтали парсить даже самые хитрые веб-сайты, обходить блокировки и не оставлять следов, то вы попали в нужное место.
Это окончательное руководство проведет вас через тайное искусство веб-скрейпинга, извлекая данные с любого веб-сайта, проскользнув через Интернет незамеченным. Вы узнаете, как использовать прокси-серверы в качестве масок ниндзя, что позволит вам менять свою личность на ходу.
Просто хедз-ап! Вам нужно будет ознакомиться с основами 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.
Давайте расширять наши сети, участвовать в содержательных дискуссиях и делиться своим опытом в мире разработки программного обеспечения и за его пределами. С нетерпением ждем связи с вами! 😊