Während einige Websites einfach mit Selenium, Puppeteer und dergleichen zu scrapen sind, können sich andere Websites, die erweiterte Sicherheitsmaßnahmen wie CAPTCHAs und IP-Sperren implementieren, als schwierig erweisen. Um diese Herausforderungen zu meistern und sicherzustellen, dass Sie 99 % der Websites kostenlos mit dem Scraper scrapen können, werden Sie dies in diesem Artikel erstellen und einen
Das Sammeln der Daten ist jedoch nur ein Schritt; was Sie mit diesen Daten machen, ist ebenso wichtig, wenn nicht sogar noch wichtiger. Oftmals müssen hierfür große Mengen an Informationen mühsam manuell durchgesehen werden. Aber was wäre, wenn Sie diesen Prozess automatisieren könnten? Durch die Nutzung eines Sprachmodells (LLM) können Sie nicht nur Daten sammeln, sondern diese auch abfragen, um aussagekräftige Erkenntnisse zu gewinnen – und so Zeit und Mühe sparen.
In diesem Leitfaden erfahren Sie, wie Sie Web Scraping mit KI kombinieren, um kostenlos ein leistungsstarkes Tool zum Sammeln und Analysieren von Daten in großem Umfang zu erstellen. Tauchen Sie ein!
Bevor Sie beginnen, stellen Sie sicher, dass Sie über Folgendes verfügen:
Führen Sie die folgenden Schritte aus, um mit diesem Tutorial fortzufahren:
Befolgen Sie diese Schritte, um Ihre Umgebung einzurichten und den Aufbau des KI-gestützten Scrapers vorzubereiten.
Richten Sie zunächst eine virtuelle Umgebung ein, um die Abhängigkeiten Ihres Projekts zu verwalten. Dadurch wird sichergestellt, dass Sie über einen isolierten Speicherplatz für alle erforderlichen Pakete verfügen.
Erstellen Sie ein neues Projektverzeichnis:
Öffnen Sie Ihr Terminal (oder die Eingabeaufforderung/PowerShell unter Windows) und erstellen Sie ein neues Verzeichnis für Ihr Projekt:
mkdir ai-website-scraper cd ai-website-scraper
Erstellen Sie die virtuelle Umgebung:
Führen Sie den folgenden Befehl aus, um die virtuelle Umgebung zu erstellen:
Unter Windows:
python -m venv venv
Unter macOS/Linux:
python3 -m venv venv
Dadurch wird ein venv
-Ordner erstellt, in dem die virtuelle Umgebung gespeichert wird.
Aktivieren Sie die virtuelle Umgebung, um mit der Arbeit darin zu beginnen:
Unter Windows:
.\venv\Scripts\activate
Unter macOS/Linux:
source venv/bin/activate
Ihre Terminal-Eingabeaufforderung ändert sich in „show ( venv
)“ und bestätigt, dass Sie sich jetzt in der virtuellen Umgebung befinden.
Installieren Sie nun die Bibliotheken, die Ihr Projekt benötigt. Erstellen Sie eine Datei requirements.txt
in Ihrem Projektverzeichnis und fügen Sie die folgenden Abhängigkeiten hinzu:
streamlit selenium Beautifulsoup4 langchain langchain-ollama lxml html5lib
Diese Pakete sind für das Scraping, die Datenverarbeitung und den Aufbau der Benutzeroberfläche unerlässlich:
streamlit : Dies wird zum Erstellen der interaktiven Benutzeroberfläche verwendet.
Selenium : Zum Scraping von Website-Inhalten.
beautifulsoup4 : Zum Parsen und Bereinigen des HTML.
langchain und langchain-ollama : Dies dient der Integration mit dem Ollama LLM und der Textverarbeitung.
lxml und html5lib : Für erweitertes HTML-Parsing.
Installieren Sie die Abhängigkeiten, indem Sie den folgenden Befehl ausführen:
(Stellen Sie sicher, dass Sie sich in dem Ordner befinden, in dem sich die Datei befindet, bevor Sie den Befehl ausführen.)
pip install -r requirements.txt
Erstellen Sie in Ihrem Projektverzeichnis eine Datei mit dem Namen ui.py. Dieses Skript definiert die Benutzeroberfläche für Ihren Scraper. Verwenden Sie den folgenden Code, um Ihre Anwendung zu strukturieren:
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)
Weitere Informationen zu Streamlit-Komponenten erhalten Sie bei
Um Ihre Anwendung zu gestalten, erstellen Sie einen Assets-Ordner in Ihrem Projektverzeichnis und fügen Sie eine style.css-Datei hinzu. Passen Sie die Streamlit-Oberfläche mit CSS an:
.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; }
Führen Sie in Ihrem Projektverzeichnis den folgenden Befehl aus:
streamlit run ui.py
Dadurch wird ein lokaler Server gestartet. Im Terminal sollte eine URL angezeigt werden, normalerweise http://localhost:8501
. Öffnen Sie diese URL in Ihrem Browser, um mit der Webanwendung zu interagieren.
Schreiben Sie als Nächstes den Code, um den HTML-Inhalt einer beliebigen Webseite mit Selenium zu extrahieren. Damit der Code funktioniert, benötigen Sie jedoch einen Chrome WebDriver.
Selenium benötigt einen WebDriver, um mit Webseiten zu interagieren. So richten Sie ihn ein:
Nachdem Sie ChromeDriver heruntergeladen haben, extrahieren Sie die Datei, kopieren Sie den Anwendungsdateinamen „ chromedriver “ und fügen Sie ihn in Ihren Projektordner ein.
Wenn dies erledigt ist, erstellen Sie eine neue Datei namens main.py
und implementieren Sie den folgenden Code:
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()
Speichern und führen Sie den Code aus. Das gesamte HTML der Seite, die Sie kopiert haben, sollte in Ihrer Streamlit-Anwendung wie folgt angezeigt werden:
Obwohl Sie jetzt das HTML einer Website abrufen können, funktioniert der obige Code möglicherweise nicht für Websites mit erweiterten Anti-Scraping-Mechanismen wie CAPTCHA-Herausforderungen oder IP-Sperren. Wenn Sie beispielsweise eine Site wie Indeed oder Amazon mit Selenium scrapen, kann dies dazu führen, dass eine CAPTCHA-Seite den Zugriff blockiert. Dies geschieht, weil die Website erkennt, dass ein Bot versucht, auf ihren Inhalt zuzugreifen. Wenn dieses Verhalten anhält, kann die Site Ihre IP-Adresse schließlich sperren und weiteren Zugriff verhindern.
Um dies zu beheben, integrieren Sie
Anmeldung — gehen Sie zu
Klicken Sie nach der Anmeldung auf „ Proxy-Produkte abrufen “.
Klicken Sie auf die Schaltfläche „ Hinzufügen “ und wählen Sie „ Scraping Browser “.
Als Nächstes gelangen Sie zur Seite „ Zone hinzufügen “, wo Sie einen Namen für Ihre neue Scraping-Browser-Proxy-Zone auswählen müssen. Klicken Sie anschließend auf „ Hinzufügen “.
Anschließend werden Ihre Proxy-Zonen-Anmeldeinformationen erstellt. Sie benötigen diese Details in Ihrem Skript, um alle auf Websites verwendeten Anti-Scraping-Mechanismen zu umgehen.
Sie können sich für weitere Einzelheiten zum Scraping-Browser auch die Entwicklerdokumentation von Bright Data ansehen.
Ändern Sie den Code in Ihrer Datei main.py
wie folgt. Sie werden feststellen, dass dieser Code übersichtlicher und kürzer ist als der vorherige 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
Ersetzen Sie <Benutzername> und <Passwort> durch den Benutzernamen und das Passwort Ihres Scraping-Browsers.
Nach dem Scrapen des HTML-Inhalts einer Website ist dieser oft mit unnötigen Elementen wie JavaScript, CSS-Stilen oder unerwünschten Tags gefüllt, die nichts zu den Kerninformationen beitragen, die Sie extrahieren. Um die Daten strukturierter und für die weitere Verarbeitung nützlicher zu machen, müssen Sie den DOM-Inhalt bereinigen, indem Sie irrelevante Elemente entfernen und den Text organisieren.
In diesem Abschnitt wird erläutert, wie Sie den HTML-Inhalt bereinigen, aussagekräftigen Text extrahieren und ihn für die Weiterverarbeitung in kleinere Teile aufteilen. Der Bereinigungsprozess ist wichtig, um Daten für Aufgaben wie die Verarbeitung natürlicher Sprache oder die Inhaltsanalyse vorzubereiten.
Hier ist der Code, der zu main.py hinzugefügt wird, um die Bereinigung des DOM-Inhalts zu handhaben:
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) ]
Was der Code bewirkt
Speichern Sie Ihre Änderungen und testen Sie Ihre Anwendung. Nach dem Scraping einer Website sollten Sie eine Ausgabe wie diese erhalten.
Sobald der DOM-Inhalt bereinigt und vorbereitet ist, besteht der nächste Schritt darin, die Informationen zu analysieren, um spezifische Details zu extrahieren.
Wenn nicht, laden Sie Ollama herunter und installieren Sie es vom
brew install ollama
Installieren Sie anschließend ein beliebiges Modell von
ollama pull phi3
Nach der Installation können Sie dieses Modell mit LangChain aus Ihrem Skript aufrufen, um aus den Daten, die an das Modell gesendet werden, aussagekräftige Erkenntnisse zu gewinnen.
So richten Sie die Funktionalität zum Parsen von DOM-Inhalten in das Phi3 -Modell ein
Der folgende Code implementiert die Logik zum Parsen von DOM-Blöcken mit Ollama und Extrahieren relevanter Details:
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)
Fügen Sie der Datei ui.py den folgenden Code hinzu, um Benutzern die Eingabe von Analyseanweisungen in das LLM und die Anzeige von Ergebnissen zu ermöglichen:
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.")
Wenn dies erledigt ist, kann der Scraper nun auf Grundlage der extrahierten Daten Antworten auf Ihre Eingabeaufforderungen bereitstellen.
Die Kombination aus Web Scraping und KI eröffnet spannende Möglichkeiten für datengesteuerte Erkenntnisse. Über das Sammeln und Speichern von Daten hinaus können Sie KI jetzt nutzen, um den Prozess der Gewinnung von Erkenntnissen aus den Scraped-Daten zu optimieren. Dies ist nützlich für Marketing- und Vertriebsteams, Datenanalysen, Geschäftsinhaber und viele mehr.
Den vollständigen Code für den KI-Scraper finden Sie hier. Experimentieren Sie ruhig damit und passen Sie ihn an Ihre individuellen Bedürfnisse an. Beiträge sind ebenfalls willkommen – wenn Sie Verbesserungsvorschläge haben, erstellen Sie doch einfach einen Pull Request!
Sie können dies auch noch weiterführen. Hier sind einige Ideen: