Bazı web siteleri yalnızca Selenium, Puppeteer ve benzerlerini kullanarak kolayca taranabilirken, CAPTCHA'lar ve IP yasakları gibi gelişmiş güvenlik önlemleri uygulayan diğer web siteleri zor olabilir. Bu zorlukların üstesinden gelmek ve Scraper'ı kullanarak web sitelerinin %99'unu ücretsiz olarak tarayabildiğinizden emin olmak için, bu makalede bunu oluşturacaksınız ve bir
Ancak, verileri toplamak sadece bir adımdır; bu verilerle ne yaptığınız da en az onlar kadar, hatta daha da önemlidir. Genellikle, bu büyük miktarda bilgiyi elle titizlikle elemeyi gerektirir. Peki ya bu süreci otomatikleştirebilirseniz? Bir dil modelinden (LLM) yararlanarak, yalnızca verileri toplamakla kalmaz, aynı zamanda anlamlı içgörüler çıkarmak için sorgulayabilirsiniz; bu da zamandan ve emekten tasarruf sağlar.
Bu kılavuzda, web kazımayı yapay zeka ile birleştirerek ücretsiz olarak büyük ölçekte veri toplama ve analiz etme konusunda güçlü bir araç oluşturmayı öğreneceksiniz. Hadi başlayalım!
Başlamadan önce aşağıdakilere sahip olduğunuzdan emin olun:
Bu eğitime devam etmek için aşağıdaki adımları tamamlayın:
Ortamınızı kurmak ve yapay zeka destekli kazıyıcıyı oluşturmaya hazırlanmak için şu adımları izleyin.
Öncelikle projenizin bağımlılıklarını yönetmek için sanal bir ortam kurun. Bu, gerekli tüm paketler için izole bir alana sahip olmanızı sağlayacaktır.
Yeni bir proje dizini oluşturun:
Terminalinizi (veya Windows'ta Komut İstemi/PowerShell'i) açın ve projeniz için yeni bir dizin oluşturun:
mkdir ai-website-scraper cd ai-website-scraper
Sanal ortamı yaratın:
Sanal ortamı oluşturmak için aşağıdaki komutu çalıştırın:
Windows'ta:
python -m venv venv
macOS/Linux'ta:
python3 -m venv venv
Bu, sanal ortamı depolayacak bir venv
klasörü oluşturur.
İçinde çalışmaya başlamak için sanal ortamı etkinleştirin:
Windows'ta:
.\venv\Scripts\activate
macOS/Linux'ta:
source venv/bin/activate
Terminal isteminiz ( venv
) olarak değişecek ve sanal ortamda olduğunuzu doğrulayacaktır.
Şimdi, projenizin ihtiyaç duyduğu kütüphaneleri yükleyin. Proje dizininizde bir requirements.txt
dosyası oluşturun ve aşağıdaki bağımlılıkları ekleyin:
streamlit selenium Beautifulsoup4 langchain langchain-ollama lxml html5lib
Bu paketler veri toplama, veri işleme ve kullanıcı arayüzü oluşturma için olmazsa olmazdır:
streamlit : Etkileşimli kullanıcı arayüzü oluşturmak için kullanılır.
Selenium : Web sitesi içeriğini taramak için.
beautifulsoup4 : HTML'yi ayrıştırmak ve temizlemek için.
langchain ve langchain-ollama : Bu, Ollama LLM ile bütünleşmek ve metin işlemek içindir.
lxml ve html5lib : Gelişmiş HTML ayrıştırma için.
Aşağıdaki komutu çalıştırarak bağımlılıkları yükleyin:
(Komutu çalıştırmadan önce dosyanın bulunduğu klasörde olduğunuzdan emin olun.)
pip install -r requirements.txt
Proje dizininizde ui.py adlı bir dosya oluşturun. Bu betik, kazıyıcınız için kullanıcı arayüzünü tanımlayacaktır. Uygulamanızı yapılandırmak için aşağıdaki kodu kullanın:
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 bileşenleri hakkında daha fazla bilgiyi şu adresten edinebilirsiniz:
Uygulamanızı biçimlendirmek için proje dizininizde bir varlıklar klasörü oluşturun ve bir style.css dosyası ekleyin. Streamlit arayüzünü CSS ile özelleştirin:
.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; }
Proje dizininizde aşağıdaki komutu çalıştırın:
streamlit run ui.py
Bu yerel bir sunucuyu başlatacak ve terminalde genellikle http://localhost:8501
bir URL görmelisiniz. Web uygulamasıyla etkileşim kurmak için bu URL'yi tarayıcınızda açın.
Sonra, Selenium kullanarak herhangi bir web sayfasının HTML içeriğini çıkarmak için kodu yazın. Ancak, kodun çalışması için bir Chrome WebDriver'a ihtiyacınız var.
Selenium'un web sayfalarıyla etkileşime girmesi için bir WebDriver'a ihtiyacı vardır. İşte nasıl kurulacağı:
ChromeDriver’ı indirdikten sonra dosyayı çıkartın ve uygulama dosya adı olan “ chromedriver ” kısmını kopyalayıp proje klasörünüze yapıştırın.
Bunu yaptıktan sonra main.py
adında yeni bir dosya oluşturun ve aşağıdaki kodu uygulayın:
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()
Kodu kaydedip çalıştırın; kopyaladığınız sayfanın tüm HTML'sini Streamlit uygulamanızda şu şekilde görüntülemelisiniz:
Artık bir web sitesinin HTML'sini geri alabilseniz de, yukarıdaki kod CAPTCHA meydan okumaları veya IP yasakları gibi gelişmiş anti-scraping mekanizmalarına sahip siteler için çalışmayabilir. Örneğin, Indeed veya Amazon gibi bir siteyi Selenium kullanarak kazımak, bir CAPTCHA sayfasının erişimi engellemesiyle sonuçlanabilir. Bunun nedeni, web sitesinin bir botun içeriğine erişmeye çalıştığını algılamasıdır. Bu davranış devam ederse, site sonunda IP adresinizi yasaklayabilir ve daha fazla erişimi engelleyebilir.
Bunu düzeltmek için entegre edin
Kayıt olma — şuraya git
Giriş yaptıktan sonra “ Proxy Ürünlerini Al ” butonuna tıklayın.
“ Ekle ” butonuna tıklayın ve “ Scraping Browser ” seçeneğini seçin.
Daha sonra, yeni kazıma tarayıcı proxy bölgeniz için bir ad seçmenizin isteneceği “ Bölge ekle ” sayfasına yönlendirileceksiniz. Bundan sonra, “ Ekle ”ye tıklayın.
Bundan sonra proxy bölgenizin kimlik bilgileri oluşturulacaktır. Herhangi bir web sitesinde kullanılan herhangi bir anti-scraping mekanizmasını atlatmak için bu ayrıntılara betiğinizde ihtiyacınız olacak.
Ayrıca, tarama tarayıcısı hakkında daha fazla ayrıntı için Bright Data'nın geliştirici belgelerine de göz atabilirsiniz.
main.py
dosyanızda kodu şu şekilde değiştirin. Bu kodun önceki koddan daha temiz ve kısa olduğunu fark edeceksiniz.
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
<Kullanıcı adı> ve <şifre> ifadelerini tarayıcınızın kullanıcı adı ve şifresiyle değiştirin.
Bir web sitesinin HTML içeriğini kazıdıktan sonra, genellikle JavaScript, CSS stilleri veya çıkardığınız temel bilgilere katkıda bulunmayan istenmeyen etiketler gibi gereksiz öğelerle doldurulur. Verileri daha yapılandırılmış ve daha fazla işleme için kullanışlı hale getirmek için, alakasız öğeleri kaldırarak ve metni düzenleyerek DOM içeriğini temizlemeniz gerekir.
Bu bölüm HTML içeriğinin nasıl temizleneceğini, anlamlı metnin nasıl çıkarılacağını ve alt akış işleme için daha küçük parçalara nasıl bölüneceğini açıklar. Temizleme süreci, doğal dil işleme veya içerik analizi gibi görevler için veri hazırlamak için önemlidir.
DOM içeriğini temizlemek için main.py'ye eklenecek kod şu şekilde:
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) ]
Kod Ne Yapar?
Değişikliklerinizi kaydedin ve uygulamanızı test edin. Bir web sitesini kazıdıktan sonra bunun gibi bir çıktı almalısınız.
DOM içeriği temizlenip hazırlandıktan sonraki adım, belirli ayrıntıları çıkarmak için bilgileri ayrıştırmaktır.
Eğer yapmadıysanız, Ollama'yı şu adresten indirin ve kurun:
brew install ollama
Sonra, herhangi bir modeli yükleyin
ollama pull phi3
Kurulumdan sonra, LangChain'i kullanarak betiğinizdeki bu modeli çağırabilir ve ona gönderilecek verilerden anlamlı içgörüler elde edebilirsiniz.
DOM içeriğini phi3 modeline ayrıştırmak için işlevselliğin nasıl kurulacağı aşağıda açıklanmıştır
Aşağıdaki kod, Ollama ile DOM parçalarını ayrıştırma ve ilgili ayrıntıları çıkarma mantığını uygular:
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)
Kullanıcıların LLM'ye ayrıştırma talimatları girmesine ve sonuçları görüntülemesine olanak tanımak için ui.py dosyasına aşağıdaki kodu ekleyin:
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.")
Bunu yaptıktan sonra, kazıyıcı artık kazınan verilere dayanarak istemlerinize yanıtlar sağlayabilir.
Web kazıma ve yapay zekanın birleşimi, veri odaklı içgörüler için heyecan verici olasılıklar sunar. Verileri toplamanın ve kaydetmenin ötesinde, artık kazınan verilerden içgörü elde etme sürecini optimize etmek için yapay zekadan yararlanabilirsiniz. Bu, pazarlama ve satış ekipleri, veri analizi, işletme sahipleri ve çok daha fazlası için faydalıdır.
AI kazıyıcı için tam kodu burada bulabilirsiniz. Denemekten ve benzersiz ihtiyaçlarınıza göre uyarlamaktan çekinmeyin. Katkılarınız da memnuniyetle karşılanır—geliştirme fikirleriniz varsa, bir çekme isteği oluşturmayı düşünün!
Bunu daha da ileri götürebilirsiniz. İşte bazı fikirler: