У той час як деякі веб-сайти легко отримати, використовуючи лише 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 у них
Щоб створити стиль програми, створіть папку з активами в каталозі проекту та додайте файл 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.")
Після цього зберігач тепер може надавати відповіді на ваші підказки на основі зібраних даних.
Поєднання веб-скрейпінгу та штучного інтелекту відкриває захоплюючі можливості для розуміння на основі даних. Окрім збору та збереження даних, тепер ви можете використовувати штучний інтелект для оптимізації процесу отримання інформації зі зібраних даних. Це корисно для відділів маркетингу та продажів, аналізу даних, власників бізнесу та багато іншого.
Ви можете знайти повний код для AI scraper тут. Не соромтеся експериментувати з ним і адаптувати його до своїх унікальних потреб. Внески також вітаються — якщо у вас є ідеї щодо покращення, розгляньте можливість створення запиту на витяг!
Ви також можете зробити це далі. Ось кілька ідей: