티스토리 뷰

반응형

지금하는 기술적인 고민의 대부분은 이미 누군가가 했을 것이고

이미 어딘가에 기록되어 있을것이다. 단지 내가 그게 어디에 있는지 찾지 못했을 뿐이다. 

 

얼추 중급 개발자를 항상 고용하고 있는 느낌이다. 그때 그때 필요한 것 질문하면 만들어준다. 

필요한 것들을 만들기 위해서 처음부터 여기 저기 뒤지는 작업을 안해도 된다. 일단 완성된 내용 이해하면 된다.

 

함수 수행한 시간 계산해주는  데커레이터 하나 만들어 달라고 해봤다. chatGPT, 요즘 너무 자주 쓴다. 

알아야 하는 정도는 데커레이터라는게 뭔지 정도,  그래야 쉽게 질문할수 있다. 사실 이 내용도 물어보면 주저리 주저리 답해주만...

그래서 프롬프터 엔지니링에도 비즈니스별 전문 영역이 있다.

 

사람마다 전문지식 수준에 따라 질문하는 수준이 다를테니깐.

 

"함수 수행시간 얼마나 걸리는지 알 수 있는 데커레이터 함수 파이썬으로 하나 만들어주세요"

def timing_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__} took {end_time - start_time:.6f} seconds to execute.")
        return result
    return wrapper
 

 

#bs4 test
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import random
from html import unescape  # HTML 엔터티를 문자로 변환하기 위한 모듈

def find_links_with_pub_code(url, pub_code):
    # 웹페이지의 HTML 소스를 가져옵니다.
    response = requests.get(url)
    html_content = response.text

    # BeautifulSoup을 사용하여 HTML을 파싱합니다.
    soup = BeautifulSoup(html_content, 'html.parser')

    # 모든 링크를 찾아냅니다.
    links = soup.find_all('a', href=True)

    # "ca-pub-7611240025188124"를 포함하는 링크를 출력합니다.
    for link in links:
        href_value = unescape(link['href'])  # HTML 엔터티를 문자로 변환
        if pub_code in href_value:
            print("####", href_value)

def save_sitemaps_to_txt(sitemaps, filename="sitemap.txt"):
    with open(filename, "w", encoding="utf-8") as file:
        for sitemap in sitemaps:
            file.write(f"{sitemap}\n")

def get_all_sitemaps(base_url, sitemap_url):
    response = requests.get(sitemap_url)
    soup = BeautifulSoup(response.text, "xml")

    sitemaps = []

    for loc in soup.find_all("loc"):
        print(loc)
        sitemap = loc.text

        # 이미지에 대한 링크인 경우 제외, xml제외
        if not sitemap.lower().endswith(('.jpg', '.jpeg', '.png', '.gif', '.bmp')):
            sitemaps.append(sitemap)
            
            # 재귀적으로 서브 디렉토리의 사이트 맵을 가져옴
            sub_sitemaps = get_all_sitemaps(base_url, sitemap)
            sitemaps.extend(sub_sitemaps)

    return sitemaps

def plus_random_gap():
    rn = random.uniform(1, 60)
    #rn = 0
    return (rn)

def random_gap():
    rn = random.uniform(7, 30)
    return (rn+plus_random_gap())

def random_gap_shrt():
    rn = random.uniform(2, 10)
    return (rn + plus_random_gap())    

# 사이트를 열었다가 닫기까지 대기 시간을 랜덤으로 조절
def random_sleep():
    time.sleep(random_gap_shrt())

def timing_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__} took {end_time - start_time:.6f} seconds to execute.")
        return result
    return wrapper

@timing_decorator
def do_browsing(driver, sitemap):

    print("entering new site...")
    try:
        driver.get(sitemap)
        # 대기 시간
        random_sleep()

        # 화면의 높이를 얻어서 스크롤
        window_height = driver.execute_script("return window.innerHeight;")
        driver.execute_script(f"window.scrollTo(0, 0);")
        
        # 대기 시간
        random_sleep()
        driver.execute_script(f"window.scrollTo(0, {window_height // random_gap_shrt()});")

        # 대기 시간
        random_sleep()
        # 화면을 맨 아래까지 스크롤
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

        # 대기 시간
        random_sleep()
        driver.execute_script(f"window.scrollTo(0, {window_height // random_gap_shrt()});")

        # 대기 시간
        random_sleep()
        driver.execute_script(f"window.scrollTo(0, {window_height // random_gap_shrt()});")

        # 대기 시간
        random_sleep()

    except Exception as e:
        print(f"Error visiting {sitemap}: {e}")
    

def visit_and_close_sites_2(sitemaps):

    # 브라우저 자동화 시작
    driver = webdriver.Safari()
    driver.set_window_size(1600, 1000)
    driver.set_window_position(0, 0)

    # 사이트 맵 리스트를 섞음
    random.shuffle(sitemaps)

    i=0
    for sitemap in sitemaps:
        i=i+1
        print(f"{i}/{len(sitemaps)} >> {sitemap}")
        
        do_browsing(driver, sitemap)

    # 브라우저 닫기
    driver.quit()


def find_links_with_pub_code(url, pub_code):
    # 웹페이지의 HTML 소스를 가져옵니다.
    response = requests.get(url)
    html_content = response.text

    # BeautifulSoup을 사용하여 HTML을 파싱합니다.
    soup = BeautifulSoup(html_content, 'html.parser')

    # 모든 링크를 찾아냅니다.
    links = soup.find_all('a', href=True)
    print("@@@@@@",links)

    print("##looking")
    for link in links:
        href_value = unescape(link['href'])  # HTML 엔터티를 문자로 변환
        if pub_code in href_value:
            print(href_value)


def main():

    dev = "https://cnn.com/"

    site_urls = [dev,]
    for base_url in site_urls:
        print(base_url)
        if base_url in (dev):
            sitemap_url = f"{base_url}sitemap.xml"
        else:
            sitemap_url = f"{base_url}sitemap_index.xml"

        all_sitemaps = get_all_sitemaps(base_url, sitemap_url)
        save_sitemaps_to_txt(all_sitemaps)
        visit_and_close_sites_2(all_sitemaps)

        random_gap()


if __name__ == "__main__":
    main()
반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함