eunja511005 / AutoCoding

0 stars 0 forks source link

Crawling #195

Open eunja511005 opened 1 month ago

eunja511005 commented 1 month ago
import logging
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException, TimeoutException, WebDriverException
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time

def setup_logger(name, log_file, level=logging.INFO):
    """Function to setup a logger; creates a logger that logs both to a file and to the console."""
    logger = logging.getLogger(name)
    logger.setLevel(level)

    # 기존 핸들러 제거
    if (logger.hasHandlers()):
        logger.handlers.clear()

    # 파일 핸들러
    file_handler = logging.FileHandler(log_file)
    file_handler.setLevel(level)

    # 콘솔 핸들러
    console_handler = logging.StreamHandler()
    console_handler.setLevel(level)

    # 포맷 설정
    formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
    file_handler.setFormatter(formatter)
    console_handler.setFormatter(formatter)

    # 핸들러 추가
    # logger.addHandler(file_handler)
    logger.addHandler(console_handler)

    return logger

logger = setup_logger('crawling.ipynb', 'web_crawler.log')

def setup_driver():
    """Setup Selenium WebDriver with Chrome."""
    options = Options()
    options.add_argument('--headless')  # headless 모드로 실행
    options.add_argument('--disable-gpu')
    options.add_argument('--no-sandbox')

    try:
        driver = webdriver.Chrome(options=options)
        logger.info('WebDriver successfully created.')
        return driver
    except WebDriverException as e:
        logger.error(f'Error creating WebDriver: {e}')
        raise

def fetch_page_source(url, driver):
    """Fetch the page source using Selenium."""
    try:
        driver.get(url)
        time.sleep(3)  # 페이지 로딩을 기다립니다.
        logger.info(f'Successfully accessed the page: {url}')
        return driver.page_source
    except TimeoutException as e:
        logger.error(f'Timeout while trying to access the page: {url} - {e}')
        raise
    except WebDriverException as e:
        logger.error(f'Error fetching page source: {e}')
        raise

def parse_content(page_source):
    """Parse the content of the page using BeautifulSoup."""
    try:
        soup = BeautifulSoup(page_source, 'html.parser')
        # logger.info(soup.prettify())
        # links = soup.findAll("a", class_="Link--primary v-align-middle no-underline h4 js-navigation-open markdown-title")
        # links = soup.findAll("a", {"class":{"Link--primary v-align-middle no-underline h4 js-navigation-open markdown-title"}})
        links = soup.findAll("a", 
                     {"class": "Link--primary v-align-middle no-underline h4 js-navigation-open markdown-title"},
                     string=lambda text: "랭체인" in text if text else False)
        # 각 a 태그의 href와 텍스트 출력
        for link in links:
            href = link.get('href')
            text = link.get_text()
            logger.info(f'Text: {text}, Href: {href}')

        title = soup.find('title').get_text()
        body = soup.find('body').get_text()
        logger.info('Successfully parsed the page content.')
        return title, body
    except AttributeError as e:
        logger.error(f'Error parsing page content: {e}')
        raise

def main(url):
    driver = setup_driver()

    try:
        page_source = fetch_page_source(url, driver)
        title, body = parse_content(page_source)
        logger.info(f'Page Title: {title}')
        logger.info(f'Page Body: {body[:200]}...')  # 몸체 일부만 로깅
    except Exception as e:
        logger.error(f'An error occurred: {e}')
    finally:
        driver.quit()
        logger.info('WebDriver closed.')

if __name__ == '__main__':
    url_to_crawl = 'https://github.com/eun/AutoCoding/issues'  # 크롤링할 URL을 여기에 입력하세요
    main(url_to_crawl)

a 태그중 data-type이 toggle인 경우 클릭하는 셀레니움

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

# Chrome WebDriver를 사용하여 Selenium 세션을 시작
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))

# 웹페이지 로드
driver.get("https://example.com")  # 여기에 해당 웹페이지 URL을 입력

# 페이지의 모든 <a> 태그를 찾기
all_links = driver.find_elements(By.TAG_NAME, "a")

# 각 링크를 순회하며 조건에 따라 작업 수행
for link in all_links:
    # 'data-type' 속성이 'toggle'인지 확인
    data_type = link.get_attribute('data-type')
    if data_type == 'toggle':
        link.click()  # 링크 클릭
        # 클릭 후 필요한 추가 작업 수행 (예: 기다리기, 로그 남기기 등)
    else:
        # 'toggle'이 아닌 경우의 다른 작업 수행
        # 예: 특정 정보 수집, 다른 요소와 상호작용 등
        continue  # 이 예제에서는 다음 링크로 넘어감

# 작업 완료 후 드라이버 종료
driver.quit()
eunja511005 commented 1 month ago

셀레니움으로 클릭 후 해당 요소를 beatifulsoup 이용하기 위해 변환후 class 추출 예제

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 pyperclip
from selenium.webdriver.common.keys import Keys

# Chrome WebDriver를 사용하여 Selenium 세션을 시작
driver = webdriver.Chrome()
login_url = "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Feunja511005%2FAutoCoding%2Fissues"
main_url = "https://github.com/eunja511005/AutoCoding/issues"

try:
    # 로그인 
    driver.get(login_url)

    id_element = WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.CSS_SELECTOR,'#login_field')))
    pyperclip.copy('eun@gmail.com')
    id_element.send_keys(Keys.CONTROL+'v')
    pyperclip.copy('sp########')
    driver.find_element(By.ID, 'password').send_keys(Keys.CONTROL+'v')
    driver.find_element(By.CSS_SELECTOR, '.btn.btn-primary.btn-block.js-sign-in-button').click()

    # 메인 웹페이지 로드
    driver.get(main_url)  # 여기에 해당 웹페이지 URL을 입력

    # id가 'global-create-menu-anchor'인 버튼 찾기
    WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, 'global-create-menu-anchor')))
    create_button = driver.find_element(By.ID, "global-create-menu-anchor")
    create_button.click()
    driver.save_screenshot('page_after_click.png')

    # Selenium을 사용하여 모든 <a> 태그 수집
    all_links_elements = driver.find_elements(By.ID, "global-create-menu-anchor")

    # Selenium 요소를 BeautifulSoup에서 사용할 수 있는 HTML로 변환
    html_content = ''.join([link.get_attribute('outerHTML') for link in all_links_elements])

    # BeautifulSoup 객체 생성
    soup = BeautifulSoup(html_content, 'html.parser')

    # 이제 BeautifulSoup을 사용하여 원하는 작업 수행
    all_buttons = soup.find_all("button", {"id": {"global-create-menu-anchor"}})

    # 각 링크의 href 속성 출력
    for botton in all_buttons:
        print(botton.get('class'))
except Exception as e:
    print(e)
finally:    
    # 작업 완료 후 드라이버 종료
    driver.quit()