Als Vertiefungsthema 1 habe ich Web-Scraping gewählt.
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:
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.
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:
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.
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')
Proxy | Country | Type | Anonymity | Uptime | Check Date |
---|
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.
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.