paint-brush
Давайте создадим бесплатный инструмент для веб-скрапинга, который объединяет прокси и ИИ для анализа данныхк@aviatorscode2
Новая история

Давайте создадим бесплатный инструмент для веб-скрапинга, который объединяет прокси и ИИ для анализа данных

к Victor Yakubu15m2024/12/17
Read on Terminal Reader

Слишком долго; Читать

Узнайте, как объединить веб-скрапинг, прокси-серверы и языковые модели на основе искусственного интеллекта, чтобы автоматизировать извлечение данных и легко получать полезные сведения.
featured image - Давайте создадим бесплатный инструмент для веб-скрапинга, который объединяет прокси и ИИ для анализа данных
Victor Yakubu HackerNoon profile picture
0-item
1-item
2-item

В то время как некоторые веб-сайты легко скрейпить, используя только Selenium, Puppeteer и т. п., другие веб-сайты, которые реализуют расширенные меры безопасности, такие как CAPTCHA и запреты по IP, могут оказаться сложными. Чтобы преодолеть эти проблемы и убедиться, что вы можете скрейпить 99% веб-сайтов бесплатно с помощью Scraper, вы будете создавать это в этой статье, и вы будете интегрировать прокси-инструмент в вашем коде, которые помогут обойти эти меры безопасности.


Однако сбор данных — это всего лишь один шаг; то, что вы делаете с этими данными, не менее, если не более важно. Часто это требует кропотливого просеивания больших объемов информации вручную. Но что, если бы вы могли автоматизировать этот процесс? Используя языковую модель (LLM), вы можете не только собирать данные, но и запрашивать их для извлечения значимых идей, экономя время и усилия.


В этом руководстве вы узнаете, как объединить веб-скрапинг с ИИ, чтобы создать мощный инструмент для сбора и анализа данных в больших масштабах бесплатно. Давайте погрузимся!

Предпосылки

Прежде чем начать, убедитесь, что у вас есть следующее:

  1. Базовые знания Python, так как этот проект подразумевает написание и понимание кода Python.
  2. Установите Python (3.7 или более позднюю версию) на свою систему. Вы можете загрузить его с python.org .

Установка и настройка

Чтобы продолжить работу с этим руководством, выполните следующие шаги:

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

1. Создайте виртуальную среду

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


  1. Создайте новый каталог проекта:

    Откройте терминал (или командную строку/PowerShell в Windows) и создайте новый каталог для своего проекта:

     mkdir ai-website-scraper cd ai-website-scraper


  2. Создайте виртуальную среду:

Для создания виртуальной среды выполните следующую команду:


  • В Windows:

     python -m venv venv
  • На macOS/Linux:

     python3 -m venv venv


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


2. Активируйте виртуальную среду

Активируйте виртуальную среду, чтобы начать в ней работать:


  • В Windows:

     .\venv\Scripts\activate
  • На macOS/Linux:

     source venv/bin/activate


Приглашение терминала изменится на ( venv ), подтверждая, что вы теперь находитесь внутри виртуальной среды.

3. Установите необходимые зависимости

Теперь установите библиотеки, необходимые вашему проекту. Создайте файл requirements.txt в каталоге вашего проекта и добавьте следующие зависимости:


 streamlit selenium Beautifulsoup4 langchain langchain-ollama lxml html5lib


Эти пакеты необходимы для сбора данных, обработки данных и создания пользовательского интерфейса:

  • streamlit : используется для создания интерактивного пользовательского интерфейса.

  • Selenium : для извлечения содержимого веб-сайтов.

  • beautifulsoup4 : Для анализа и очистки HTML.

  • langchain и langchain-ollama : предназначены для интеграции с Ollama LLM и обработки текста.

  • lxml и html5lib : для расширенного анализа HTML.


Установите зависимости, выполнив следующую команду:

(Перед выполнением команды убедитесь, что вы находитесь в папке, где находится файл.)


 pip install -r requirements.txt


Создание пользовательского интерфейса с помощью Streamlit

Streamlit позволяет легко создавать интерактивный пользовательский интерфейс (UI) для приложений Python. В этом разделе вы создадите простой, удобный интерфейс, в котором пользователи могут вводить URL и отображать извлеченные данные.

1. Настройте скрипт Streamlit

Создайте файл с именем ui.py в каталоге вашего проекта. Этот скрипт определит пользовательский интерфейс для вашего скрапера. Используйте код ниже для структурирования вашего приложения:

 import streamlit as st import pathlib from main import scrape_website # function to load css from the assets folder def load_css(file_path): with open(file_path) as f: st.html(f"<style>{f.read()}</style>") # Load the external CSS css_path = pathlib.Path("assets/style.css") if css_path.exists(): load_css(css_path) st.title("AI Scraper") st.markdown( "Enter a website URL to scrape, clean the text content, and display the result in smaller chunks." ) url = st.text_input(label= "", placeholder="Enter the URL of the website you want to scrape") if st.button("Scrape", key="scrape_button"): st.write("scraping the website...") result = scrape_website(url) st.write("Scraping complete.") st.write(result)


  • Функции st.title и st.markdown задают заголовок приложения и предоставляют инструкции для пользователей.
  • Компонент st.text_input позволяет пользователям вводить URL-адрес веб-сайта, данные с которого они хотят извлечь.
  • Нажатие кнопки «Скрапинг» запускает логику скрапинга, отображая сообщения о ходе выполнения с помощью st.info .


Вы можете узнать больше о компонентах Streamlit из их документация .

2. Добавьте пользовательские стили

Чтобы стилизовать свое приложение, создайте папку assets в каталоге проекта и добавьте файл style.css. Настройте интерфейс Streamlit с помощью CSS:

 .stAppViewContainer { background-image: url("https://images.unsplash.com/photo-1732979887702-40baea1c1ff6?q=80&w=2832&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"); background-size: cover; color: black; } .stAppHeader { background-color: rgba(0, 0, 0, 0); } .st-ae { background-color: rgba(233, 235, 234, 0.895); } .st-emotion-cache-ysk9xe { color: black; } .st.info, .stAlert { background-color: black; } .st-key-scrape_button button { display: inline-block; padding: 10px 20px; font-size: 16px; color: #fff; background-color: #007bff; border: none; border-radius: 5px; cursor: pointer; animation: pulse 2s infinite; } .st-key-scrape_button button:hover { background-color: #0056b3; color: #fff; }


3. Запустите приложение Streamlit.

В каталоге вашего проекта выполните следующую команду:

 streamlit run ui.py


Это запустит локальный сервер, и вы должны увидеть URL в терминале, обычно http://localhost:8501 . Откройте этот URL в своем браузере, чтобы взаимодействовать с веб-приложением.

Приложение AI Scraper

Скрапинг веб-сайта с помощью Selenium

Далее напишите код для извлечения HTML-контента любой веб-страницы с помощью Selenium. Однако для работы кода вам понадобится Chrome WebDriver.

Установить ChromeDriver для Selenium

Selenium требует WebDriver для взаимодействия с веб-страницами. Вот как это настроить:

  1. Загрузить ChromeDriver:
    Посетите это Веб-сайт ChromeDriver и загрузите версию, соответствующую вашему браузеру Google Chrome.
  2. Добавить ChromeDriver в PATH


После загрузки ChromeDriver извлеките файл, скопируйте имя файла приложения « chromedriver » и вставьте его в папку проекта.

После этого создайте новый файл с именем main.py и реализуйте следующий код:

 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # Function to scrape HTML from a website def scrape_website(website_url): # Path to WebDriver webdriver_path = "./chromedriver" # Replace with your WebDriver path service = Service(webdriver_path) driver = webdriver.Chrome(service=service) try: # Open the website driver.get(website_url) # Wait for the page to fully load WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, "body"))) # Extract the HTML source html_content = driver.page_source return html_content finally: # Ensure the browser is closed after scraping driver.quit()


Сохраните и запустите код; вы должны отобразить весь HTML-код страницы, который вы скопировали, в своем приложении Streamlit следующим образом:

Использование прокси-провайдера для обхода веб-сайтов с капчей и запретами по IP-адресу

Хотя теперь вы можете получить HTML-код веб-сайта, приведенный выше код может не работать для сайтов с расширенными механизмами защиты от парсинга, такими как CAPTCHA-проблемы или IP-баны. Например, парсинг сайта Indeed или Amazon с использованием Selenium может привести к блокировке доступа к странице CAPTCHA. Это происходит, потому что веб-сайт обнаруживает, что бот пытается получить доступ к его контенту. Если такое поведение сохранится, сайт может в конечном итоге заблокировать ваш IP-адрес, предотвратив дальнейший доступ.


Капча


Чтобы исправить это, интегрируйте Браузер для скрапинга Bright Data в ваш скрипт. Браузер для парсинга — это надежный инструмент, который использует несколько прокси-сетей, включая резидентные IP-адреса, для обхода защиты от парсинга. Он обрабатывает разблокировку страниц, управляя пользовательскими заголовками, отпечатками браузера, решением CAPTCHA и т. д. Это гарантирует, что ваши попытки парсинга останутся незамеченными, при этом доступ к контенту будет беспрепятственным.

Бесплатная настройка браузера для скрапинга Bright Data

  1. Регистрация — перейти Домашняя страница Bright Data и нажмите « Начать бесплатную пробную версию ». Если у вас уже есть учетная запись Bright Data, вы можете просто войти в систему.

  2. После входа в систему нажмите « Получить прокси-продукты ».


  3. Нажмите кнопку « Добавить » и выберите « Браузер для скрапинга ».


  4. Далее вы перейдете на страницу « Добавить зону », где вам нужно будет выбрать имя для новой прокси-зоны вашего браузера для скрапинга. После этого нажмите « Добавить ».


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


Более подробную информацию о браузере для скрапинга вы также можете найти в документации для разработчиков Bright Data.


В вашем файле main.py измените код на этот. Вы заметите, что этот код чище и короче предыдущего.


 from selenium.webdriver import Remote, ChromeOptions from selenium.webdriver.chromium.remote_connection import ChromiumRemoteConnection from selenium.webdriver.common.by import By from bs4 import BeautifulSoup AUTH = '<username>:<passord>' SBR_WEBDRIVER = f'https://{AUTH}@brd.superproxy.io:9515' # Function to scrape HTML from a website def scrape_website(website_url): print("Connecting to Scraping Browser...") sbr_connection = ChromiumRemoteConnection(SBR_WEBDRIVER, "goog", "chrome") with Remote(sbr_connection, options=ChromeOptions()) as driver: driver.get(website_url) print("Waiting captcha to solve...") solve_res = driver.execute( "executeCdpCommand", { "cmd": "Captcha.waitForSolve", "params": {"detectTimeout": 10000}, }, ) print("Captcha solve status:", solve_res["value"]["status"]) print("Navigated! Scraping page content...") html = driver.page_source return html


Замените <имя пользователя> и <пароль> на имя пользователя и пароль вашего браузера для парсинга.

Очистка содержимого Dom

После парсинга HTML-контента веб-сайта он часто оказывается заполненным ненужными элементами, такими как JavaScript, стили CSS или нежелательные теги, которые не вносят вклад в основную информацию, которую вы извлекаете. Чтобы сделать данные более структурированными и полезными для дальнейшей обработки, вам необходимо очистить DOM-контент, удалив ненужные элементы и организовав текст.


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

Пошаговое руководство по очистке содержимого DOM

Вот код, который будет добавлен в main.py для очистки содержимого DOM:


 from bs4 import BeautifulSoup # Extract the body content from the HTML def extract_body_content(html_content): soup = BeautifulSoup(html_content, "html.parser") body_content = soup.body if body_content: return str(body_content) return "" # Clean the body content by removing scripts, styles, and other unwanted elements def clean_body_content(body_content): soup = BeautifulSoup(body_content, "html.parser") # Remove <script> and <style> tags for script_or_style in soup(["script", "style"]): script_or_style.extract() # Extract cleaned text with each line separated by a newline cleaned_content = soup.get_text(separator="\n") cleaned_content = "\n".join( line.strip() for line in cleaned_content.splitlines() if line.strip() ) return cleaned_content # Split the cleaned content into smaller chunks for processing def split_dom_content(dom_content, max_length=5000): return [ dom_content[i : i + max_length] for i in range(0, len(dom_content), max_length) ]


Что делает Кодекс

  1. Извлечение содержимого тела:
    • Функция extract_body_content использует BeautifulSoup для анализа HTML и извлечения содержимого тега <body> .
    • Если тег <body> существует, функция возвращает его как строку. В противном случае она возвращает пустую строку.
  2. Очистка содержимого:
    • Функция clean_body_content обрабатывает извлеченное содержимое, удаляя ненужные элементы:
      • Теги <script> и <style> удалены, чтобы исключить JavaScript и CSS.
      • Функция извлекает простой текст из очищенного содержимого.
      • Он форматирует текст, удаляя пустые строки и лишние пробелы.
  3. Разделение контента:
    • Функция split_dom_content берет очищенный контент и разбивает его на более мелкие фрагменты с максимальной длиной по умолчанию 5000 символов.
    • Это полезно для обработки больших объемов текста в управляемых фрагментах, особенно при передаче данных в модели с ограничениями по размеру токенов или входных данных.


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

Анализ содержимого Dom в Ollama

После очистки и подготовки содержимого DOM следующим шагом будет анализ информации для извлечения конкретных деталей с помощью Оллама , большая языковая модель (LLM), интегрированная с LangChain. Ollama — это CLI-инструмент, используемый для загрузки и локального запуска LLM. Однако перед использованием Ollama необходимо выполнить следующие установки:


  • Если вы этого не сделали, загрузите и установите Ollama с сайта официальный сайт . Вы можете установить его на Mac с помощью команды Homebrew.

     brew install ollama
  • Далее устанавливаем любую модель из этот список ; есть такие модели, как Phi3, Mistral, Gemma 2 и т. д.; у каждой свои системные требования. Этот код использует phi3 в основном потому, что он легкий.

     ollama pull phi3


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


Вот как настроить функциональность для анализа содержимого DOM в модели phi3 .

Пошаговое руководство по коду для llm.py

Следующий код реализует логику анализа фрагментов DOM с помощью Ollama и извлечения соответствующих данных:

 from langchain_ollama import OllamaLLM from langchain_core.prompts import ChatPromptTemplate # Template to instruct Ollama for parsing template = ( "You are tasked with extracting specific information from the following text content: {dom_content}. " "Please follow these instructions carefully: \n\n" "1. **Extract Information:** Only extract the information that directly matches the provided description: {parse_description}. " "2. **No Extra Content:** Do not include any additional text, comments, or explanations in your response. " "3. **Empty Response:** If no information matches the description, return an empty string ('')." "4. **Direct Data Only:** Your output should contain only the data that is explicitly requested, with no other text." ) # Initialize the Ollama model model = OllamaLLM(model="phi3") # Function to parse DOM chunks with Ollama def parse_with_ollama(dom_chunks, parse_description): prompt = ChatPromptTemplate.from_template(template) chain = prompt | model parsed_results = [] for i, chunk in enumerate(dom_chunks, start=1): if not chunk.strip(): # Skip empty chunks print(f"Skipping empty chunk at batch {i}") continue try: print(f"Processing chunk {i}: {chunk[:100]}...") # Print a preview print(f"Parse description: {parse_description}") response = chain.invoke( { "dom_content": chunk, "parse_description": parse_description, } ) print(f"Response for batch {i}: {response}") parsed_results.append(response) except Exception as e: print(f"Error parsing chunk {i}: {repr(e)}") parsed_results.append(f"Error: {repr(e)}") return "\n".join(parsed_results)

Что делает код.

  1. Шаблон инструкции:
    • Предоставляет точные указания для Олламы относительно того, какую информацию следует извлекать.
    • Гарантирует, что вывод будет чистым, лаконичным и соответствующим описанию анализа.
  2. Обработка фрагментов:
    • Функция parse_with_ollama выполняет итерацию по фрагментам DOM, обрабатывая каждый с помощью LLM.
    • Пропускает пустые фрагменты для оптимизации производительности.
  3. Обработка ошибок:
    • Корректно обрабатывает ошибки, регистрирует их и продолжает обработку оставшихся фрагментов.

Обновление файла ui.py

Добавьте следующий код в файл ui.py, чтобы пользователи могли вводить инструкции по синтаксическому анализу в LLM и просматривать результаты:

 from main import scrape_website, extract_body_content, clean_body_content, split_dom_content from llm import parse_with_ollama if "dom_content" in st.session_state: parse_description = st.text_area("Enter a description to extract specific insights from your scraped data:") if st.button("Parse Content", key="parse_button"): if parse_description.strip() and st.session_state.get("dom_content"): st.info("Parsing the content...") dom_chunks = split_dom_content(st.session_state.dom_content) parsed_result = parse_with_ollama(dom_chunks, parse_description) st.text_area("Parsed Results", parsed_result, height=300) else: st.error("Please provide valid DOM content and a description to parse.")

Как это работает в пользовательском интерфейсе

  1. Ввод данных пользователем:
    • Пользователь предоставляет в текстовой области описание данных, которые необходимо извлечь, на естественном языке.
  2. Триггер анализа:
    • При нажатии кнопки «Анализ содержимого» очищенное содержимое DOM разбивается на управляемые фрагменты и передается в parse_with_ollama.
  3. Отображение результатов:
    • Результаты анализа отображаются в текстовой области, что позволяет пользователям просматривать извлеченную информацию.


После этого парсер сможет давать ответы на ваши запросы на основе собранных данных.


Что дальше?

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


Полный код для скребка ИИ можно найти здесь. Не стесняйтесь экспериментировать с ним и адаптировать его под свои уникальные потребности. Вклады также приветствуются — если у вас есть идеи по улучшению, рассмотрите возможность создания запроса на извлечение!


Вы также можете пойти дальше. Вот несколько идей:

  • Экспериментируйте с подсказками: адаптируйте подсказки для извлечения конкретной информации или удовлетворения уникальных требований проекта.
  • Пользовательский интерфейс
  • Интеграция других моделей LLM: изучение других языковых моделей, таких как OpenAI , Близнецы и т. д. для дальнейшей оптимизации анализа данных.