Простой скрипт для парсинга SimilarWeb

Discussion in 'Python' started by Gilgalad, 17 Aug 2023.

  1. Gilgalad

    Gilgalad New Member

    Joined:
    17 Aug 2023
    Messages:
    2
    Likes Received:
    1
    Reputations:
    0
    Написал небольшой скрипт который парсит похожие сайты с SimilarWeb:
    Запускаем скрипт, пишем домен, с которого хотим собрать похожие сайты
    [​IMG]
    Скрипт запускает браузер, открывает симиларвеб и парсит домены:
    [​IMG]
    Далее скрипт каждый спаршенный домен автоматически подставляет в симиларвеб и парсит похожие по нему. То есть парсинг длится бесконечно, но рано или поздно изначальная тематика уйдёт, поэтому рекомендую следить время от времени за процессом парсинга. Спаршенные домены сохраняются в текстовый файл results.txt, который создается в папке (папка так же создается при каждом запуске скрипта).
    Для работы скрипт использует драйвер chrome, то есть на вашем компьютере должен быть установлен какой-нибудь браузеров на хром-движке. Это всё сделано для того чтобы имитировать действия реального человека и обходить защиту от парсинга.
    Сам скрипт:
    Code:
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.chrome.service import Service
    from bs4 import BeautifulSoup
    import os
    from datetime import datetime
    import time
    
    def create_output_folder():
        folder_name = datetime.now().strftime("%Y_%m_%d-%H_%M_%S")
        os.makedirs(folder_name, exist_ok=True)
        return folder_name
    
    def write_to_file(folder, filename, data):
        with open(os.path.join(folder, filename), 'a') as f:
            f.write(data + "\n")
    
    def process_domain(domain, chrome_options):
        driver = webdriver.Chrome(options=chrome_options)
        driver.set_page_load_timeout(30)
    
        try:
            driver.get(f'https://www.similarweb.com/website/{domain}/')
            time.sleep(10)
    
            soup = BeautifulSoup(driver.page_source, 'html.parser')
    
            div = soup.find('div', {'class': 'wa-competitors__list'})
            domains = []
            if div is not None:
                for span in div.findAll('span', {'class': 'wa-competitors__list-item-title'}):
                    domains.append(span.text.strip())
    
            print(f"Данные домена {domain} успешно обработаны.")
            return domains
        except Exception as e:
            print(f"Ошибка обработки домена {domain}: {e}")
        finally:
            driver.quit()
        return []
    
    def main():
        output_folder = create_output_folder()
    
        chrome_options = Options()
    
        processed_domains = set()
        
        initial_domain = input("Введите домен для обработки: ")
        domains_to_process = [initial_domain]
    
        while domains_to_process:
            domain = domains_to_process.pop()
            if domain not in processed_domains:
                processed_domains.add(domain)
                for new_domain in process_domain(domain, chrome_options):
                    write_to_file(output_folder, "results.txt", new_domain)
                    domains_to_process.append(new_domain)
    
        print("Все данные были успешно сохранены.")
    
    if __name__ == "__main__":
        main()
    Если кому-то как-то надо дополнить - пишите. Так же могу написать простенькие скрипты, не только для парсинга. Обращайтесь.
     
    TADIAMOND likes this.
  2. TADIAMOND

    TADIAMOND Member

    Joined:
    19 Feb 2011
    Messages:
    140
    Likes Received:
    40
    Reputations:
    6
    Я тоже писал, но на PHP, потом они поставили CF, и все, только с браузером теперь. Ты не разбирался, как обходить?
     
  3. Gilgalad

    Gilgalad New Member

    Joined:
    17 Aug 2023
    Messages:
    2
    Likes Received:
    1
    Reputations:
    0
    мне стало лень искать обходы, решил на таком простом решении остановиться. для себя потом добавил проверку на Audience Interests и Technology Stack.
    на днях планирую поковырять решение без браузера, отпишусь в теме, если получится что-то
     
    #3 Gilgalad, 17 Aug 2023
    Last edited: 17 Aug 2023
  4. TADIAMOND

    TADIAMOND Member

    Joined:
    19 Feb 2011
    Messages:
    140
    Likes Received:
    40
    Reputations:
    6
    Я на гитхабе вибел решения, но они старые были. Буду ждать!