Vertiefungsthema.

Als Vertiefungsthema 1 habe ich Web-Scraping gewählt.

Was ist Web Scraping ?

Web-Scraping ist eine Technik, um Daten aus dem Internet zu extrahieren. Sie bezieht sich auf den Prozess des automatischen Herunterladens und Extrahierens von Informationen aus Webseiten. Dies ist besonders nützlich, um große Mengen an Daten effizient zu sammeln, die sonst manuell schwer zu erfassen wären.

Der Bezug zum Web-Programmieren ist deutlich, da Web-Scraping eng mit dem Verständnis von HTML, CSS und JavaScript verbunden ist. Diese Technologien sind die Grundlage für den Aufbau von Webseiten. Um Web-Scraping effektiv durchzuführen, muss man verstehen, wie Webseiten strukturiert sind und wie man auf die gewünschten Daten zugreifen kann.

Python ist eine beliebte Sprache für Web-Scraping, da es mehrere leistungsstarke Bibliotheken und Frameworks gibt, die diesen Prozess vereinfachen. Die bekannteste Bibliothek ist Beautiful Soup, die es ermöglicht, HTML- und XML-Dateien zu parsen. Sie bietet Methoden, um durch Elemente zu navigieren, sie zu suchen und zu ändern, was das Extrahieren spezifischer Daten erleichtert.

Ein typischer Web-Scraping-Prozess in Python beinhaltet folgende Schritte:

  • Anfordern der Webseite: Zuerst wird die Webseite mit einer Bibliothek wie requests angefordert. Dieser Schritt ist vergleichbar mit dem Öffnen einer Webseite in einem Browser.
  • Parsen des HTML-Codes: Nachdem die Webseite geladen wurde, verwendet man Beautiful Soup, um den HTML-Code zu parsen. Hierdurch kann man auf die verschiedenen Elemente der Webseite wie Tags, IDs und Klassen zugreifen.
  • Extrahieren der Daten: Nun kann man die spezifischen Informationen, die man benötigt, aus der Struktur der Webseite extrahieren. Dies kann Text, Bilder, Links oder andere Daten sein.
  • Speichern der Daten: Die extrahierten Daten können dann in einem gewünschten Format gespeichert werden, z.B. in einer CSV-Datei, einer Datenbank oder einem JSON-Format.

Es ist wichtig zu beachten, dass Web-Scraping rechtliche und ethische Fragen aufwirft. Nicht alle Webseiten erlauben das Scraping ihrer Daten, und manche haben spezifische Regeln, die in den Nutzungsbedingungen oder in einer robots.txt-Datei festgelegt sind. Es ist daher entscheidend, diese Aspekte zu berücksichtigen und sicherzustellen, dass das Scraping im Einklang mit diesen Richtlinien und dem geltenden Recht erfolgt.

Warum Web-Scraping?

Web-Scraping wird aus mehreren Gründen eingesetzt, die von technischen bis hin zu geschäftlichen Anforderungen reichen. Hier sind einige der wichtigsten Gründe:

  • Datenbeschaffung für Analysezwecke: Eine der häufigsten Anwendungen von Web-Scraping ist das Sammeln von Daten für die Analyse. Unternehmen und Forscher nutzen diese Technik, um große Mengen an öffentlich verfügbaren Daten von Webseiten zu sammeln, um Markttrends zu analysieren, Wettbewerbsanalysen durchzuführen, Kundenverhalten zu verstehen oder für akademische Forschungen.
  • Automatisierung und Effizienz: Web-Scraping ermöglicht die Automatisierung des Datensammelprozesses, der manuell zeitaufwändig und fehleranfällig sein kann. Durch Automatisierung können Daten regelmäßig und effizient gesammelt werden.
  • Monitoring und Tracking: Unternehmen nutzen Web-Scraping, um Preise, Lagerbestände oder neue Inhalte auf Konkurrenzwebseiten zu überwachen. Dies hilft ihnen, schnell auf Marktveränderungen zu reagieren.
  • Lead-Generierung: Marketing- und Vertriebsteams verwenden Web-Scraping, um potenzielle Kundenkontakte zu sammeln. Sie extrahieren Informationen wie Kontaktangaben von Websites, die für ihr Geschäft relevant sind.
  • Suchmaschinenoptimierung (SEO): Web-Scraping wird eingesetzt, um Keywords, Backlinks und andere SEO-relevante Daten von Webseiten zu extrahieren. Diese Informationen helfen bei der Optimierung der eigenen Webseite für Suchmaschinen.
  • Inhaltssyndizierung: Web-Scraping ermöglicht das Sammeln von Inhalten aus verschiedenen Quellen, um sie auf einer einzigen Plattform zusammenzuführen. News-Aggregatoren verwenden beispielsweise diese Technik, um Artikel von verschiedenen Online-Nachrichtenquellen zu sammeln.
  • Maschinelles Lernen und KI: Für Projekte im Bereich des maschinellen Lernens und der künstlichen Intelligenz ist oft eine große Menge an Daten erforderlich. Web-Scraping ist eine Methode, um diese Daten zu sammeln, insbesondere wenn es um Text-, Bild- oder Verhaltensdaten geht.

Das Web-Scraping Programm

Um Web-Scraping in Python zu demonstrieren, habe ich ein Programm geschrieben, welches die Tabelle der Webseite "https://spys.one/en/" mit den "Free Proxy" scraped und dann hier wieder einfügt. Hierfür habe ich die Bibliothek Beautiful Soup verwendet.

Dieser Prozess läuft alle 60 Sekunden, damit haben wir eine immer eine aktuelle Kopie der Tabelle.

Ein wichtiger Faktor ist es den Prozess nicht zu oft zu machen, da sonder der Server der Webseite "https://spys.one/en/" uns aufgrund einer DDOS attacke blacklsiten könnte.

Beispiel Programm

 
import requests 
from bs4 import BeautifulSoup
import re
from datetime import datetime

word_to_num = {
    'Zero': '0', 'One': '1', 'Two': '2', 'Three': '3', 'Four': '4', 'Five': '5',
    'Six': '6', 'Seven': '7', 'Eight': '8', 'Nine': '9'
}

path = "/Users/tobiaskarsch/Documents/VM/"

def replace_words_with_numbers(s):
    for word, num in word_to_num.items():
        s = s.replace(word, num)
    return s

url = 'https://spys.one/en/'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}

response = requests.get(url, headers=headers)

with open(path + 'proxyList.txt', 'w') as file:

    if response.status_code == 200:

        html_content = response.text

        soup = BeautifulSoup(html_content, 'html.parser')

        proxy_entries = soup.find_all('tr', class_=re.compile('spy1x|spy1xx'))

        file.write(f'{datetime.now().strftime("%d.%m.%Y %H:%M:%S")}')

        for entry in proxy_entries:
            ip_tag = entry.find('font', class_='spy14')
            script_tag = ip_tag.find_next('script') if ip_tag else None
            country_tag = entry.find('font', class_='spy14').find_next('acronym') if ip_tag else None

            type_tag = entry.find('font', class_='spy1')
            anonymity_tag = type_tag.find_next('font') if type_tag else None
            uptime_tag = anonymity_tag.find_next('font', class_='spy1').find_next('acronym') if anonymity_tag else None
            check_date_tags = entry.find_all('font', class_='spy1')[-2:]

            if script_tag and ip_tag and country_tag and type_tag and anonymity_tag and uptime_tag and check_date_tags:
                ip = ip_tag.get_text(strip=True)
                country = country_tag.get('title', 'Unknown').split(' ')[0]
                proxy_type = type_tag.get_text(strip=True)
                anonymity = anonymity_tag.get_text(strip=True)
                uptime = uptime_tag.get_text(strip=True)
                check_date = ' '.join(tag.get_text(strip=True) for tag in check_date_tags)
                script_code = script_tag.string

                script_code_numeric = replace_words_with_numbers(script_code)

                port_matches = re.findall(r'((w+)^(w+))', script_code_numeric)
                if port_matches:
                    port = 0
                    for part in port_matches:
                        port ^= int(part[0], 16) ^ int(part[1], 16)
                    file.write(f'Proxy: {ip}:{port}, Country: {country}, Type: {proxy_type}, Anonymity: {anonymity}, Uptime: {uptime}, Check Date: {check_date}')
    else:
        file.write(f"Failed to retrieve the webpage. Status code: {response.status_code}")

print('Done')
                  

Ergebnis:

Updated:

ProxyCountryTypeAnonymityUptimeCheck Date

Ein weiteres Beispiel:

Letztes Jahr habe ich ein Python-Programm entwickelt, um eine Herausforderung mit meinem Adventskalender zu bewältigen. Der Kalender bot tägliche Gewinnchancen, aber um herauszufinden, ob ich gewonnen hatte, musste ich online nachsehen, ob meine einzigartige Kalendernummer unter den Tagesgewinnern war. Da ich diesen Prozess mühsam fand, erstellte ich ein Programm, das automatisch einmal täglich die Gewinnnummern von der Webseite abruft und überprüft, ob meine Nummer darunter ist. Außerdem habe ich das Programm so eingerichtet, dass es mir täglich eine E-Mail schickt, die mir mitteilt, ob ich etwas gewonnen habe oder nicht. Leider hatte ich in diesem Adventskalender keinen Gewinn.

Beispiel Programm

 
import requests
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from datetime import date
import csv, smtplib, ssl
from datetime import datetime

url = "https://k2022.lions-gruenstadt.de/gewinner"
kalenderTobias = "4917"
id = "gewinnerliste"
today = date.today()
newFormatDate = today.strftime('%d.%m.%Y')
subject = """Subject: Lions Adventskalender 
"""

def getWebPageDataCurrent():
    today = date.today()
    newFormatDate = today.strftime('%d.%m.%Y')
    print("Getting Website Information")
    driver = webdriver.Firefox()
    driver.get(url)
    time.sleep(15)
    html = driver.page_source

    result = driver.find_element(By.ID, 'gewinnerliste')
    readable = str(result.text)

    driver.quit()

    tobias = ""
    loser = ""

    won = 0

    newFormat = newFormatDate.lstrip('0')

    seperate = readable.split("€")
    for i in range(len(seperate)):
        if newFormat in seperate[i]:
            if kalenderTobias in seperate[i]:
                a = "

Tobias won!
"
                b = seperate[i]
                tobias = a + b
                won += 1
        if won == 0:
            loser = "Today neither of you has won
"

    print("Received Website Information")
    finalText = tobias + "
" + loser
    subject = """Subject: Lions Adventskalender 
""" + str(newFormat) + "

" + finalText
    return subject


def sendMail(message):
    
    server = smtplib.SMTP('smtp.xxx.xxx', 000)
    server.starttls()
    server.login("[email protected]", "xxx")
    msg = (message)
    server.sendmail("[email protected]", "[email protected]", msg)
    server.quit()
    print("E-mail send successfully to Tobias on the: ", datetime.now())


def sleepTimer():
    date_time = datetime.now()
    print("Sleeping...")

    wert = "08:00:00"
    stopper = True
    counter = 0

    while stopper:
        date_time = datetime.now()
        d = date_time.strftime("%X")
        if d == wert:
            print("Current Day: ", datetime.now())
            print("Set time reached")
            stopper = False
        else:
            if counter == 15:
                print("Sleeping...")
                time.sleep(1)
                counter = 0
            else: 
                counter += 1
                time.sleep(1)

def programm():
    today = date.today()

    newFormatDate = today.strftime('%d.%m.%Y')
    print("Now running: ", datetime.now(), "

")
    currentDay = newFormatDate
    running = True
    while running:
        newFormatDate = today.strftime('%d.%m.%Y')
        print("Currently running: ", datetime.now(), "

")
        currentDay = newFormatDate

        if str(currentDay) == "25.12.2022":
            text = subject + "Der Adventskalender ist zu ende."
            sendMailChrissi(text)
            sendMailTobias(text)
            running = False
        else:
            data = getWebPageDataCurrent()
            sendMail(data)
            sleepTimer()

def main():
    try:
        programm()
    except:
        print("An error has occured.")
        print("Waiting 10 seconds.")
        time.sleep(10)
        main()

main()
                  

Da dieses Programm nur eine E-Mail generiet, können Sie unten das Ergebnis sehen. Noch einen kleinen Kommentart zu Programm. Dieses Programm verwendet eine andere Methode des Web.Scraping wie das vorherige Programm, da wir hier die Webseite in einem Browser öffnen und somit einen User simulieren. Diese Methode dauert leider etwas länger, aber aufgrund der Struktur der Webseite ist dies notwendig, da nur so die Inhalte und somit die Gewinnernummern geladen werden.