В то время как некоторые веб-сайты легко скрейпить, используя только Selenium, Puppeteer и т. п., другие веб-сайты, которые реализуют расширенные меры безопасности, такие как CAPTCHA и запреты по IP, могут оказаться сложными. Чтобы преодолеть эти проблемы и убедиться, что вы можете скрейпить 99% веб-сайтов бесплатно с помощью Scraper, вы будете создавать это в этой статье, и вы будете интегрировать
Однако сбор данных — это всего лишь один шаг; то, что вы делаете с этими данными, не менее, если не более важно. Часто это требует кропотливого просеивания больших объемов информации вручную. Но что, если бы вы могли автоматизировать этот процесс? Используя языковую модель (LLM), вы можете не только собирать данные, но и запрашивать их для извлечения значимых идей, экономя время и усилия.
В этом руководстве вы узнаете, как объединить веб-скрапинг с ИИ, чтобы создать мощный инструмент для сбора и анализа данных в больших масштабах бесплатно. Давайте погрузимся!
Прежде чем начать, убедитесь, что у вас есть следующее:
Чтобы продолжить работу с этим руководством, выполните следующие шаги:
Выполните следующие действия, чтобы настроить среду и подготовиться к созданию скрепера на базе искусственного интеллекта.
Сначала настройте виртуальную среду для управления зависимостями вашего проекта. Это обеспечит вам изолированное пространство для всех требуемых пакетов.
Создайте новый каталог проекта:
Откройте терминал (или командную строку/PowerShell в Windows) и создайте новый каталог для своего проекта:
mkdir ai-website-scraper cd ai-website-scraper
Создайте виртуальную среду:
Для создания виртуальной среды выполните следующую команду:
В Windows:
python -m venv venv
На macOS/Linux:
python3 -m venv venv
Это создаст папку venv
, в которой будет храниться виртуальная среда.
Активируйте виртуальную среду, чтобы начать в ней работать:
В Windows:
.\venv\Scripts\activate
На macOS/Linux:
source venv/bin/activate
Приглашение терминала изменится на ( venv
), подтверждая, что вы теперь находитесь внутри виртуальной среды.
Теперь установите библиотеки, необходимые вашему проекту. Создайте файл 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
Создайте файл с именем 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)
Вы можете узнать больше о компонентах Streamlit из их
Чтобы стилизовать свое приложение, создайте папку 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; }
В каталоге вашего проекта выполните следующую команду:
streamlit run ui.py
Это запустит локальный сервер, и вы должны увидеть URL в терминале, обычно http://localhost:8501
. Откройте этот URL в своем браузере, чтобы взаимодействовать с веб-приложением.
Далее напишите код для извлечения HTML-контента любой веб-страницы с помощью Selenium. Однако для работы кода вам понадобится Chrome WebDriver.
Selenium требует WebDriver для взаимодействия с веб-страницами. Вот как это настроить:
После загрузки 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 следующим образом:
Хотя теперь вы можете получить HTML-код веб-сайта, приведенный выше код может не работать для сайтов с расширенными механизмами защиты от парсинга, такими как CAPTCHA-проблемы или IP-баны. Например, парсинг сайта Indeed или Amazon с использованием Selenium может привести к блокировке доступа к странице CAPTCHA. Это происходит, потому что веб-сайт обнаруживает, что бот пытается получить доступ к его контенту. Если такое поведение сохранится, сайт может в конечном итоге заблокировать ваш IP-адрес, предотвратив дальнейший доступ.
Чтобы исправить это, интегрируйте
Регистрация — перейти
После входа в систему нажмите « Получить прокси-продукты ».
Нажмите кнопку « Добавить » и выберите « Браузер для скрапинга ».
Далее вы перейдете на страницу « Добавить зону », где вам нужно будет выбрать имя для новой прокси-зоны вашего браузера для скрапинга. После этого нажмите « Добавить ».
После этого будут созданы ваши учетные данные прокси-зоны. Эти данные понадобятся вам в вашем скрипте для обхода любых антискрейпинговых механизмов, используемых на любом веб-сайте.
Более подробную информацию о браузере для скрапинга вы также можете найти в документации для разработчиков 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
Замените <имя пользователя> и <пароль> на имя пользователя и пароль вашего браузера для парсинга.
После парсинга HTML-контента веб-сайта он часто оказывается заполненным ненужными элементами, такими как JavaScript, стили CSS или нежелательные теги, которые не вносят вклад в основную информацию, которую вы извлекаете. Чтобы сделать данные более структурированными и полезными для дальнейшей обработки, вам необходимо очистить DOM-контент, удалив ненужные элементы и организовав текст.
В этом разделе объясняется, как очистить HTML-контент, извлечь значимый текст и разбить его на более мелкие фрагменты для последующей обработки. Процесс очистки необходим для подготовки данных для таких задач, как обработка естественного языка или анализ контента.
Вот код, который будет добавлен в 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) ]
Что делает Кодекс
Сохраните изменения и протестируйте свое приложение. Вы должны получить такой вывод после скрапинга веб-сайта.
После очистки и подготовки содержимого DOM следующим шагом будет анализ информации для извлечения конкретных деталей с помощью
Если вы этого не сделали, загрузите и установите Ollama с сайта
brew install ollama
Далее устанавливаем любую модель из
ollama pull phi3
После установки вы сможете вызывать эту модель из своего скрипта с помощью LangChain, чтобы получать содержательную информацию из отправляемых ей данных.
Вот как настроить функциональность для анализа содержимого DOM в модели phi3 .
Следующий код реализует логику анализа фрагментов 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)
Добавьте следующий код в файл 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.")
После этого парсер сможет давать ответы на ваши запросы на основе собранных данных.
Сочетание веб-скрейпинга и ИИ открывает захватывающие возможности для анализа данных. Помимо сбора и сохранения данных, теперь вы можете использовать ИИ для оптимизации процесса получения информации из собранных данных. Это полезно для отделов маркетинга и продаж, анализа данных, владельцев бизнеса и многих других.
Полный код для скребка ИИ можно найти здесь. Не стесняйтесь экспериментировать с ним и адаптировать его под свои уникальные потребности. Вклады также приветствуются — если у вас есть идеи по улучшению, рассмотрите возможность создания запроса на извлечение!
Вы также можете пойти дальше. Вот несколько идей: