Задать вопрос
Ответы пользователя по тегу Парсинг
  • Как спарсить такой веб-сайт?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    import requests
    from bs4 import BeautifulSoup
    
    def parse_table(div, results):
        # Ищем таблицы внутри данного div
        tables = div.find_all('table')
        for table in tables:
            rows = table.find_all('tr')
            for row in rows:
                cells = row.find_all('td')
                if cells:
                    # Извлекаем название и ссылку
                    name = cells[0].get_text(strip=True)
                    link = cells[0].find('a')['href'] if cells[0].find('a') else None
                    if link:
                        results[name] = link
    
    def recursive_parse(url, visited, results):
    
        if url in visited:
            return
        visited.add(url)
        print('Парсим URL:', url)
    
        response = requests.get(url)
        soup = BeautifulSoup(response.content, 'html.parser')
    
        # Ищем все div с itemscope
        divs = soup.find_all('div', itemscope=True)
        for div in divs:
            parse_table(div, results)  # Парсим таблицы внутри найденного div
    
        # Ищем все ссылки на подстраницы
        links = soup.find_all('a', href=True)
        for link in links:
    
            sub_url = link['href']
            # Проверяем, что ссылка ведет на подстраницу и не является текущим URL
            if 'respublika_bashkortostan' in sub_url and sub_url.startswith('http') and sub_url != url:
                recursive_parse(sub_url, visited, results)
    
    # Начальная URL
    start_url = 'https://russiaschools.ru/respublika_bashkortostan/'
    visited_urls = set()
    results_dict = {}
    recursive_parse(start_url, visited_urls, results_dict)
    
    
    for name, link in results_dict.items():
        print(f'Название: {name}, Ссылка: {link}')


    З.Ы. я не знаю могут ли быть одинаковые наименования (например МБДОУ ДС №5) в разных районах, поэтому или просто выводите на экран или записывайте вместе с названием района.
    Ответ написан
    Комментировать
  • Почему парсер не собирает данные и записывает пустые значения?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Есть несколько моментов:
    1. Про длинный кусок кода: он и не будет работать так, как вы хотите, потому что вы передаёте аргумент with_extra_data=True в свою самописную функцию, а в parser.get_flats() - нет. Соответственно он и не парсит дополнительные поля, отсюда и: "пробовала вывести ключи: смотрю, а их там тупо нет".
    Должно быть:
    data = parser.get_flats(deal_type=deal_type, rooms=rooms, with_extra_data=True,  additional_settings={"start_page": page, "end_page": page})


    2. Если вы действительно использовали эти прокси (а не просто привели их для примера), то это бессмысленно - они нерабочие. Прокси из свободного доступа редко долго живут, а тут они вообще из примера на pypi.org / github.

    3. Вёрстка сайтов постоянно изменяется, в том числе и для противодействия парсингу. Текущая версия циана не имеет<span> c текстом "Тип жилья", а именно такой селектор использовался в библиотеке парсера, следовательно он всегда будет отдавать -1 для object_type.

    4. Если вы всё-таки хотите парсить сайт, используя cianparser, то вам нужно внести несколько изменений в файл библиотеки: "Путь до вашего проекта\venv\Lib\site-packages\cianparser\flat\page.py".
    В функцию__parse_flat_offer_page_json__(self)после инициализации словаря page_data, добавить:
    ot = self.offer_page_soup.select_one('[data-name="OfferSummaryInfoItem"] p:nth-of-type(2)').get_text()
    page_data["object_type"] = ot

    и закомментировать строчки:
    # if "Тип жилья" == span.text:
    #     page_data["object_type"] = spans[index + 1].text


    Результат:
    671dbfa43dc32277607933.png
    Ответ написан
    3 комментария
  • Python парсинг, скрипт перестал вытягивать информацию, как исправить?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Такой вариант не подойдёт? Рендерится через Chromium.

    from requests_html import HTMLSession
    
    def download(url):
        session = HTMLSession()
        resp = session.get(url)
        resp.html.render()
    
        if resp.status_code == 200:
            list_of_img = resp.html.find('img')
            d = list_of_img[0].attrs
            image_url = d['srcset'].split(',')[-1].split(' ')[0]
            image_name = image_url.split('/')[-1]
            image = session.get(image_url).content
            with open(image_name, 'wb') as file:
                file.write(image)
        else:
            print(f"[ERROR] Не удалось загрузить изображение:\n{url}")
    
        session.close()
    
    download('https://scrolller.com/i-dragged-my-brother-out-at-1am-to-see-the-aogsmn8ihx')
    Ответ написан
    Комментировать