manaviel85370
add pages and all
da88570
import streamlit as st
from src.crawler.CrawlerV2 import *
from bs4 import BeautifulSoup
from src.utils.apis.gpt_api import classify_text
import random
from src.utils.helpers import clean_html, strip_html_to_text
from src.utils.markdown_processing.md_preprocessing import convert_html_to_md
from src.persistence.db import init_db
from lxml import etree
import streamlit_nested_layout
@st.cache_resource
def init_connection():
return init_db()
def get_html(url:str):
response = requests.get(url)
if response.status_code >= 400:
print(f"Skipping {overview_url} with status code {response.status_code}")
return None
else:
return response.content
def process_url(url:str, el):
try:
page_content = get_html(url)
if page_content:
cleaned_html = clean_html(page_content)
cleaned_text = strip_html_to_text(cleaned_html)
md = convert_html_to_md(cleaned_html)
gpt_class = classify_text(md)
with st.expander(url):
st.write("Bereinigtes HTML:")
with st.container(border=True, height=400):
st.markdown(md)
st.write(f"GPT Klasse: {gpt_class['class']}")
if gpt_class["class"] != "None":
new_element = {
"base_url_id": el["_id"],
"base_url": el["url"],
"url": url,
"html": page_content,
"cleaned_html": cleaned_html,
"cleaned_text": cleaned_text,
"class": gpt_class["class"]
}
db.event_urls.update_one(
{"url": new_element["url"]},
{"$setOnInsert": new_element},
upsert=True
)
return new_element
except Exception as e:
st.error(f"Es is ein Fehler aufgetreten, die url {url} wird übersprungen\n Fehlermeldung: {e}")
db = init_connection()
suburls_count = 10
# content
st.title("Generieren von Event Daten")
st.write("""
Hier werden die potentiellen Übersichtsseiten aus unsorted_urls sowie alle Links auf dieser Seite mithilfe der GPT API überprüft und den beiden Klassen **"EventDetail"** und **"EventOverview"** zugeordnet. Die Event Daten werden dann als neues Objekt in event_urls gespeichert.""")
st.info(
f"Es werden immer nur max. {suburls_count} Suburls der Übersichtsseiten angeschaut, damit die Daten ausgeglichen bleiben")
counter = st.number_input("Wie viele der Urls sollen insgesamt überprüft werden?", step=1)
get_event_data = st.button("Event Daten sammeln")
if get_event_data:
for i in range(counter):
el = db.unsorted_urls.find_one({"overview_pages": { "$exists": True, "$ne": [] } , "checked": None})
print(el)
if el:
with st.container(border=True):
if counter <= 0:
break
st.subheader(f"Daten sammeln für {el['url']} mit {len(el['overview_pages'])} Übersichtsseiten")
update_element = el
for overview_url in el["overview_pages"]:
st.info(f"Überprüfe Übersichtsseite: {overview_url}")
new_element=process_url(overview_url,el)
if new_element:
soup = BeautifulSoup(new_element["cleaned_html"],"lxml")
links = soup.find_all(["a"])
urls = set()
with st.expander("Suburls"):
try:
for link in links:
href = link["href"]
url = urljoin(overview_url, href)
url = urlparse(url)._replace(query="", fragment="").geturl()
if overview_url != url and check_regex(url, PATTERNS) and str(urlparse(overview_url).scheme)+str(urlparse(overview_url).netloc) != url:
urls.add(url)
except:
print("Exception while processing links")
if len(urls) > suburls_count:
urls= set(random.sample(list(urls), 10))
for url in urls:
new_element = process_url(url, el)
if not urls:
st.info("Es wurden keine Eventseiten unter der Übersichtsseite gefunden")
update_element["overview_pages"].remove(overview_url)
else:
update_element["overview_pages"].remove(overview_url)
counter = counter - 1
if counter <= 0:
break
new_values = {"$set": {"overview_pages": update_element["overview_pages"], "checked": True }}
db.unsorted_urls.update_one({"_id": update_element["_id"]}, new_values )