Dok je neke web stranice jednostavno obrisati koristeći samo Selenium, Puppeteer i slično, druge web stranice koje implementiraju napredne sigurnosne mjere kao što su CAPTCHA i IP zabrane mogu se pokazati teškim. Da biste prevladali ove izazove i osigurali da možete besplatno scraperirati 99% web stranica pomoću Scrapera, izgradit ćete ovo u ovom članku i integrirat ćete
Međutim, prikupljanje podataka je samo jedan korak; ono što radite sa tim podacima je podjednako važno, ako ne i više. Često, to zahtijeva pažljivo probiranje velikih količina informacija ručno. Ali šta ako možete automatizirati ovaj proces? Koristeći jezički model (LLM), ne samo da možete prikupljati podatke, već ih i ispitivati kako biste izvukli smislene uvide – štedeći vrijeme i trud.
U ovom vodiču ćete naučiti kako kombinirati web scraping s AI-om da biste izgradili moćan alat za besplatno prikupljanje i analizu podataka u velikom obimu. Uronimo!
Prije nego što počnete, provjerite imate li sljedeće:
Da nastavite s ovim vodičem, dovršite sljedeće korake:
Slijedite ove korake da biste postavili svoje okruženje i pripremili se za izgradnju strugača koji pokreće AI.
Prvo, postavite virtualno okruženje za upravljanje ovisnostima vašeg projekta. Ovo će osigurati da imate izolovan prostor za sve potrebne pakete.
Kreirajte novi direktorij projekta:
Otvorite svoj terminal (ili Command Prompt/PowerShell na Windowsu) i kreirajte novi direktorij za svoj projekt:
mkdir ai-website-scraper cd ai-website-scraper
Kreirajte virtuelno okruženje:
Pokrenite sljedeću naredbu da kreirate virtuelno okruženje:
Na Windowsima:
python -m venv venv
Na macOS/Linuxu:
python3 -m venv venv
Ovo kreira fasciklu venv
koja će pohraniti virtuelno okruženje.
Aktivirajte virtuelno okruženje da počnete raditi u njemu:
Na Windowsima:
.\venv\Scripts\activate
Na macOS/Linuxu:
source venv/bin/activate
Vaš terminalski prompt će se promijeniti u show ( venv
), potvrđujući da ste sada unutar virtuelnog okruženja.
Sada instalirajte biblioteke koje su potrebne vašem projektu. Kreirajte datoteku requirements.txt
u direktoriju vašeg projekta i dodajte sljedeće zavisnosti:
streamlit selenium Beautifulsoup4 langchain langchain-ollama lxml html5lib
Ovi paketi su neophodni za scraping, obradu podataka i izgradnju korisničkog sučelja:
streamlit : Koristi se za kreiranje interaktivnog korisničkog interfejsa.
Selen : Za scraping sadržaja web stranice.
beautifulsoup4 : Za raščlanjivanje i čišćenje HTML-a.
langchain i langchain-ollama : Ovo je za integraciju sa Ollama LLM i obradu teksta.
lxml i html5lib : Za napredno raščlanjivanje HTML-a.
Instalirajte zavisnosti tako što ćete pokrenuti sljedeću naredbu:
(Uverite se da ste u fascikli u kojoj se datoteka nalazi pre nego što pokrenete komandu.)
pip install -r requirements.txt
Kreirajte datoteku pod nazivom ui.py u direktoriju vašeg projekta. Ova skripta će definirati korisničko sučelje za vaš scraper. Koristite kod u nastavku da strukturirate svoju aplikaciju:
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)
Možete saznati više o komponentama streamlit iz njihovih
Da biste stilizirali svoju aplikaciju, kreirajte mapu imovine u direktoriju projekta i dodajte datoteku style.css. Prilagodite Streamlit interfejs pomoću CSS-a:
.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; }
U direktoriju vašeg projekta pokrenite sljedeću naredbu:
streamlit run ui.py
Ovo će pokrenuti lokalni server i trebali biste vidjeti URL u terminalu, obično http://localhost:8501
. Otvorite ovaj URL u svom pretraživaču za interakciju s web aplikacijom.
Zatim napišite kod za izdvajanje HTML sadržaja bilo koje web stranice koristeći Selenium. Međutim, da bi kod funkcionirao, potreban vam je Chrome WebDriver.
Selenium zahtijeva WebDriver za interakciju sa web stranicama. Evo kako to postaviti:
Nakon preuzimanja ChromeDriver-a, raspakirajte datoteku i kopirajte naziv datoteke aplikacije " chromedriver " i zalijepite je u fasciklu projekta.
Kada se ovo završi, kreirajte novu datoteku pod nazivom main.py
i implementirajte kod u nastavku:
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()
Sačuvajte i pokrenite kod; trebali biste dobiti sav HTML stranice koju ste scrapingirali prikazan u vašoj streamlit aplikaciji na sljedeći način:
Iako sada možete dohvatiti HTML web stranice, gornji kod možda neće funkcionirati za web lokacije s naprednim mehanizmima protiv grebanja kao što su CAPTCHA izazovi ili IP zabrane. Na primjer, scraping stranice poput Indeeda ili Amazona koristeći Selenium može dovesti do blokiranja pristupa CAPTCHA stranici. To se događa zato što web stranica otkrije da bot pokušava pristupiti njegovom sadržaju. Ako se ovo ponašanje nastavi, stranica može na kraju zabraniti vašu IP adresu, sprječavajući dalji pristup.
Da biste ovo popravili, integrirajte
Prijavljivanje — idite na
Nakon što se prijavite, kliknite na “ Nabavi proxy proizvode ”.
Kliknite na dugme “ Dodaj ” i odaberite “ Scraping Browser ”.
Zatim ćete biti preusmjereni na stranicu „ Dodaj zonu “, gdje će se od vas tražiti da odaberete ime za svoju novu proxy zonu pretraživača. Nakon toga kliknite na " Dodaj ".
Nakon ovoga, kreiraće se vjerodajnice vaše proxy zone. Ovi detalji će vam trebati u vašoj skripti da biste zaobišli sve mehanizme protiv grebanja koji se koriste na bilo kojoj web stranici.
Također možete pogledati dokumentaciju za programere Bright Data za više detalja o pretraživaču za scraping.
U datoteci main.py
promijenite kod u ovaj. Primijetit ćete da je ovaj kod čišći i kraći od prethodnog koda.
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
Zamijenite <korisničko ime> i <password> korisničkim imenom i lozinkom vašeg pretraživača.
Nakon grebanja HTML sadržaja web stranice, često je ispunjen nepotrebnim elementima kao što su JavaScript, CSS stilovi ili neželjene oznake koje ne doprinose osnovnim informacijama koje izdvajate. Da bi podaci bili strukturiraniji i korisniji za dalju obradu, potrebno je da očistite DOM sadržaj uklanjanjem nebitnih elemenata i organiziranjem teksta.
Ovaj odjeljak objašnjava kako očistiti HTML sadržaj, izdvojiti smisleni tekst i podijeliti ga na manje komade za daljnju obradu. Proces čišćenja je neophodan za pripremu podataka za zadatke poput obrade prirodnog jezika ili analize sadržaja.
Evo koda koji će biti dodan u main.py za rukovanje čišćenjem DOM sadržaja:
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) ]
Šta radi kod
Sačuvajte promjene i testirajte svoju aplikaciju. Trebali biste dobiti ovakav izlaz nakon scrapinga web stranice.
Nakon što je DOM sadržaj očišćen i pripremljen, sljedeći korak je raščlanjivanje informacija kako bi se pomoću njih izdvojili određeni detalji
Ako niste, preuzmite i instalirajte Ollamu sa stranice
brew install ollama
Zatim instalirajte bilo koji model iz
ollama pull phi3
Nakon instalacije, možete pozvati taj model iz svoje skripte koristeći LangChain kako biste pružili smislene uvide iz podataka koji će mu biti poslati.
Evo kako postaviti funkcionalnost za raščlanjivanje DOM sadržaja u phi3 model
Sljedeći kod implementira logiku za raščlanjivanje DOM dijelova s Ollama-om i izdvajanje relevantnih detalja:
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)
Dodajte sljedeći kod u datoteku ui.py kako biste omogućili korisnicima da unose upute za raščlanjivanje u LLM i pregledaju rezultate:
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.")
Kada je ovo urađeno, strugač sada može dati odgovore na vaše upite na osnovu skrapanih podataka.
Kombinacija web scrapinga i AI otvara uzbudljive mogućnosti za uvide vođene podacima. Osim prikupljanja i spremanja podataka, sada možete iskoristiti AI za optimizaciju procesa stjecanja uvida iz prikupljenih podataka. Ovo je korisno za marketinške i prodajne timove, analizu podataka, vlasnike preduzeća i još mnogo toga.
Ovdje možete pronaći kompletan kod za AI strugač. Slobodno eksperimentirajte s njim i prilagodite ga svojim jedinstvenim potrebama. Doprinosi su također dobrodošli—ako imate ideje za poboljšanja, razmislite o kreiranju zahtjeva za povlačenje!
Ovo također možete nastaviti dalje. Evo nekoliko ideja: