Bagama't ang ilang website ay diretsong kiskisan sa pamamagitan lamang ng paggamit ng Selenium, Puppeteer, at mga katulad nito, ang ibang mga website na nagpapatupad ng mga advanced na hakbang sa seguridad gaya ng mga CAPTCHA at IP ban ay maaaring mahirap. Upang malampasan ang mga hamong ito at matiyak na makakapag-scrape ka ng 99% ng mga website nang libre gamit ang Scraper, bubuuin mo ito sa artikulong ito, at isasama mo ang isang
Gayunpaman, ang pagkolekta ng data ay isang hakbang lamang; kung ano ang gagawin mo sa data na iyon ay pantay, kung hindi higit pa, mahalaga. Kadalasan, ito ay nangangailangan ng maingat na pagsasala sa malalaking volume ng impormasyon nang manu-mano. Ngunit paano kung maaari mong i-automate ang prosesong ito? Sa pamamagitan ng paggamit ng language model (LLM), hindi ka lang makakakolekta ng data kundi ma-query mo rin ito para makakuha ng mga makabuluhang insight—makakatipid ng oras at pagsisikap.
Sa gabay na ito, matututunan mo kung paano pagsamahin ang web scraping sa AI upang makabuo ng isang mahusay na tool para sa pagkolekta at pagsusuri ng data nang libre. Sumisid tayo!
Bago ka magsimula, tiyaking mayroon kang sumusunod:
Upang magpatuloy sa tutorial na ito, kumpletuhin ang mga sumusunod na hakbang:
Sundin ang mga hakbang na ito upang i-set up ang iyong kapaligiran at maghanda para sa pagbuo ng AI-powered scraper.
Una, mag-set up ng isang virtual na kapaligiran upang pamahalaan ang mga dependency ng iyong proyekto. Titiyakin nito na mayroon kang nakahiwalay na espasyo para sa lahat ng kinakailangang pakete.
Lumikha ng bagong direktoryo ng proyekto:
Buksan ang iyong terminal (o Command Prompt/PowerShell sa Windows) at lumikha ng bagong direktoryo para sa iyong proyekto:
mkdir ai-website-scraper cd ai-website-scraper
Lumikha ng virtual na kapaligiran:
Patakbuhin ang sumusunod na utos upang lumikha ng virtual na kapaligiran:
Sa Windows:
python -m venv venv
Sa macOS/Linux:
python3 -m venv venv
Lumilikha ito ng venv
folder na mag-iimbak ng virtual na kapaligiran.
I-activate ang virtual na kapaligiran upang magsimulang magtrabaho sa loob nito:
Sa Windows:
.\venv\Scripts\activate
Sa macOS/Linux:
source venv/bin/activate
Ang iyong terminal prompt ay magbabago upang ipakita ( venv
), na nagpapatunay na ikaw ay nasa loob na ngayon ng virtual na kapaligiran.
Ngayon, i-install ang mga aklatan na kailangan ng iyong proyekto. Gumawa ng requirements.txt
file sa iyong direktoryo ng proyekto at idagdag ang mga sumusunod na dependencies:
streamlit selenium Beautifulsoup4 langchain langchain-ollama lxml html5lib
Ang mga package na ito ay mahalaga para sa pag-scrape, pagproseso ng data, at pagbuo ng UI:
streamlit : Ito ay ginagamit upang lumikha ng interactive na user interface.
Selenium : Para sa pag-scrap ng nilalaman ng website.
beautifulsoup4 : Para sa pag-parse at paglilinis ng HTML.
langchain at langchain-ollama : Ito ay para sa pagsasama sa Ollama LLM at pagproseso ng text.
lxml at html5lib : Para sa advanced na pag-parse ng HTML.
I-install ang mga dependencies sa pamamagitan ng pagpapatakbo ng sumusunod na command:
(Tiyaking nasa folder ka kung saan matatagpuan ang file bago patakbuhin ang command.)
pip install -r requirements.txt
Lumikha ng file na pinangalanang ui.py sa iyong direktoryo ng proyekto. Ang script na ito ay tutukuyin ang UI para sa iyong scraper. Gamitin ang code sa ibaba upang buuin ang iyong application:
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)
Maaari kang matuto nang higit pa tungkol sa mga streamlit na bahagi mula sa mga ito
Upang lagyan ng istilo ang iyong application, gumawa ng folder ng asset sa direktoryo ng iyong proyekto at magdagdag ng style.css file. I-customize ang Streamlit na interface gamit ang 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; }
Sa iyong direktoryo ng proyekto, patakbuhin ang sumusunod na command:
streamlit run ui.py
Maglulunsad ito ng lokal na server, at dapat kang makakita ng URL sa terminal, kadalasan http://localhost:8501
. Buksan ang URL na ito sa iyong browser upang makipag-ugnayan sa web application.
Susunod, isulat ang code upang kunin ang HTML na nilalaman ng anumang webpage gamit ang Selenium. Gayunpaman, para gumana ang code, kailangan mo ng Chrome WebDriver.
Ang Selenium ay nangangailangan ng isang WebDriver upang makipag-ugnayan sa mga web page. Narito kung paano ito i-set up:
Pagkatapos i-download ang ChromeDriver, i-extract ang file at kopyahin ang pangalan ng file ng application na " chromedriver " at i-paste ito sa iyong folder ng proyekto.
Kapag tapos na ito, lumikha ng bagong file na tinatawag na main.py
at ipatupad ang code sa ibaba:
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()
I-save at patakbuhin ang code; dapat mong makuha ang lahat ng HTML ng pahina na iyong nasimot na ipinapakita sa iyong streamlit na application tulad nito:
Bagama't maaari mo na ngayong kunin ang HTML ng isang website, maaaring hindi gumana ang code sa itaas para sa mga site na may advanced na mga mekanismong anti-scraping gaya ng mga hamon sa CAPTCHA o mga pagbabawal sa IP. Halimbawa, ang pag-scrape ng site tulad ng Indeed o Amazon gamit ang Selenium ay maaaring magresulta sa pag-block ng access sa page ng CAPTCHA. Nangyayari ito dahil nakita ng website na sinusubukan ng isang bot na i-access ang nilalaman nito. Kung magpapatuloy ang pag-uugaling ito, maaaring ipagbawal ng site ang iyong IP address, na pumipigil sa karagdagang pag-access.
Upang ayusin ito, pagsamahin
Pag-sign up — pumunta sa
Pagkatapos mag-log in, mag-click sa " Kumuha ng Mga Proxy Products ".
Mag-click sa pindutang " Idagdag " at piliin ang " Scraping Browser ."
Susunod, dadalhin ka sa pahina ng " Magdagdag ng zone ", kung saan kakailanganin mong pumili ng pangalan para sa iyong bagong scraping browser proxy zone. Pagkatapos nito, mag-click sa " Idagdag ".
Pagkatapos nito, malilikha ang iyong mga kredensyal sa proxy zone. Kakailanganin mo ang mga detalyeng ito sa iyong script upang ma-bypass ang anumang mga mekanismong anti-scraping na ginagamit sa anumang website.
Maaari mo ring tingnan ang dokumentasyon ng developer ng Bright Data para sa higit pang mga detalye tungkol sa scraping browser.
Sa iyong main.py
file, baguhin ang code dito. Mapapansin mo na ang code na ito ay mas malinis at mas maikli kaysa sa nakaraang code.
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
Palitan ang <username> at <password> ng iyong nag-scrap na username at password sa browser.
Pagkatapos i-scrap ang HTML na nilalaman ng isang website, madalas itong puno ng mga hindi kinakailangang elemento gaya ng JavaScript, CSS style, o hindi gustong mga tag na hindi nakakatulong sa pangunahing impormasyon na iyong kinukuha. Upang gawing mas structured at kapaki-pakinabang ang data para sa karagdagang pagpoproseso, kailangan mong linisin ang nilalaman ng DOM sa pamamagitan ng pag-alis ng mga hindi nauugnay na elemento at pag-aayos ng teksto.
Ipinapaliwanag ng seksyong ito kung paano linisin ang nilalamang HTML, i-extract ang makabuluhang teksto, at hatiin ito sa mas maliliit na tipak para sa pagproseso sa ibaba ng agos. Ang proseso ng paglilinis ay mahalaga para sa paghahanda ng data para sa mga gawain tulad ng natural na pagpoproseso ng wika o pagsusuri ng nilalaman.
Narito ang code na idaragdag sa main.py upang pangasiwaan ang paglilinis ng nilalaman ng 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) ]
Ano ang Ginagawa ng Code
I-save ang iyong mga pagbabago at subukan ang iyong application. Dapat kang makakuha ng isang output na tulad nito pagkatapos mag-scrap ng isang website.
Kapag nalinis at naihanda na ang nilalaman ng DOM, ang susunod na hakbang ay ang pag-parse ng impormasyon upang kunin ang mga partikular na detalye gamit
Kung wala ka pa, i-download at i-install ang Ollama mula sa
brew install ollama
Susunod, i-install ang anumang modelo mula sa
ollama pull phi3
Pagkatapos ng pag-install, maaari kang tumawag sa modelong iyon mula sa iyong script gamit ang LangChain upang magbigay ng makabuluhang mga insight mula sa data na ipapadala dito.
Narito kung paano i-set up ang functionality upang i-parse ang nilalaman ng DOM sa modelong phi3
Ang sumusunod na code ay nagpapatupad ng lohika upang i-parse ang mga DOM chunks gamit ang Ollama at kunin ang mga nauugnay na detalye:
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)
Idagdag ang sumusunod na code sa ui.py file upang payagan ang mga user na mag-input ng mga tagubilin sa pag-parse sa LLM at tingnan ang mga resulta:
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.")
Kapag tapos na ito, makakapagbigay na ang scraper ng mga tugon sa iyong mga senyas batay sa data na nasimot.
Ang kumbinasyon ng web scraping at AI ay nagbubukas ng mga kapana-panabik na posibilidad para sa mga insight na batay sa data. Higit pa sa pagkolekta at pag-save ng data, maaari mo na ngayong gamitin ang AI upang i-optimize ang proseso ng pagkakaroon ng insight mula sa data na na-scrap. Ito ay kapaki-pakinabang para sa marketing at mga sales team, pagsusuri ng data, mga may-ari ng negosyo, at marami pa.
Makikita mo ang kumpletong code para sa AI scraper dito. Huwag mag-atubiling mag-eksperimento dito at iakma ito sa iyong mga natatanging pangangailangan. Tinatanggap din ang mga kontribusyon—kung mayroon kang mga ideya para sa mga pagpapabuti, isaalang-alang ang paggawa ng pull request!
Maaari mo ring dalhin ito nang higit pa. Narito ang ilang ideya: