Загрузка...

Помогите спарсить веб-сайт

Тема в разделе Python создана пользователем tinec4actliv 6 дек 2024. 117 просмотров

  1. tinec4actliv
    tinec4actliv Автор темы 6 дек 2024 23 26 июл 2022
    Понимаю, что вопрос, возможно глупый. Но я напряг все свои полторы извилины, и даже у новомодных ИИ попросил помочь с созданием алгоритма. Все бестолку.

    Моя задача собрать названия школ и адреса их веб-сайтов. По сути я имею дело с веб-страницами двух типов, они могут выглядеть так:
    1. Страница со списком городов/районов
    2. Страница с адресами школ в указанном городе/районе

    То есть адрес до искомой страницы может выглядеть как: Уфа->Дема->*Адреса школ
    Или как: Янаул->*Адреса школ. Короче иерархия всегда случайная. Но адреса школ - всегда конечная точка.

    На страницах со списком городов/районов/республик я просто ищу все теги *a в теге *div, а на странице с адресами школ ищу теги *a в таблице.

    Я не могу понять, как сделать это все рекурсивно без кучи вложенных циклов. Есть у кого идеи?

    Python
    import requests
    from bs4 import BeautifulSoup
    import threading

    def is_end_point(page):
    if page.find("table") == None:
    return False
    else:
    return True

    def parse(URL):
    page = requests.get(URL).text
    bs = BeautifulSoup(page, "lxml")

    page = bs.find("div", class_="contents")

    queue = []
    if is_end_point(page):
    for i in page.find_all("a"):
    queue.append(i)
    print(type(queue[0]))
    else:
    for i in page.find_all("a"):
    pass


    if __name__=="__main__":
    parse("https://russiaschools.ru/respublika_bashkortostan/birsk/")
     
  2. 525
    525 6 дек 2024 Заблокирован(а)
    Python
    import requests
    from bs4 import BeautifulSoup

    def is_end_point(page):
    """Проверка, является ли страница конечной (с адресами школ)."""
    return page.find("table") is not None

    def parse_page(url):
    """Обработка страницы: рекурсивно обходит ссылки, пока не дойдет до конечных страниц."""
    try:
    response = requests.get(url)
    response.raise_for_status()
    except requests.RequestException as e:
    print(f"Ошибка при запросе {url}: {e}")
    return []

    bs = BeautifulSoup(response.text, "lxml")
    contents = bs.find("div", class_="contents")

    if not contents:
    print(f"Контент не найден на странице {url}")
    return []

    if is_end_point(contents):
    # Если страница с адресами школ, извлекаем ссылки
    return [(a.text.strip(), a["href"]) for a in contents.find_all("a") if "href" in a.attrs]

    # Если страница со списком городов/районов, рекурсивно обходим ссылки
    results = []
    for a in contents.find_all("a", href=True):
    sub_url = a["href"]
    if not sub_url.startswith("http"): # Обработка относительных ссылок
    sub_url = requests.compat.urljoin(url, sub_url)
    results.extend(parse_page(sub_url))

    return results

    if __name__ == "__main__":
    start_url = "https://russiaschools.ru/respublika_bashkortostan/birsk/"
    schools = parse_page(start_url)
    for name, link in schools:
    print(f"{name}: {link}")
     
    1. tinec4actliv Автор темы
      525, по чесночку, сам писал?
    2. 525
Top
Загрузка...