ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • python
    PYTHON 2022. 3. 4. 14:39
    # 셀레늄: 웹 자동화 및 웹의 소스코드를 수집하는 모듈
    # cmd -> pip install selenium (셀레늄 라이브러리 다운로드)
    # 셀레늄 임포트
    from selenium import webdriver
    import time

    # 다운로드 받은 크롬 물리 드라이브 가동 명령합니다.
    driver = webdriver.Chrome('C:/Users/WiTHUS/Desktop/java_web_jiin/python/chromedriver.exe')

    time.sleep(1)
    '''
    # 자동으로 버튼이나 링크 클릭 제어하기
    login_btn = driver.find_element_by_xpath('//*[@id="account"]/a')
    login_btn.click()
    time.sleep(1.5)

    # 자동으로 텍스트 입력하기
    id_input = driver.find_element_by_xpath('//*[@id="id"]')
    id_input.send_keys('abc1234')
    time.sleep(1)

    pw_input = driver.find_element_by_xpath('//*[@id="pw"]')
    pw_input.send_keys('aaa1111')
    time.sleep(1)

    driver.find_element_By_xpath('//*[@id="log.login"]').click()
    time.sleep(1)
    '''

    # 네이버에 접속해서 검색창에 '오늘 날씨'를 입력하고
    # 검색 후 가장 먼저 뜨는 네이버 뉴스를 띄웁니다.

    driver.find_element_by_xpath('//*[@id="query"]').send_keys('오늘 날씨는요?')
    time.sleep(0.5)

    driver.find_element_by_xpath('//*[@id="search_btn"]').click()
    time.sleep(0.5)

    driver.find_element_by_xpath('//*[@id="sp_nws_all1"]/div[1]/div/div[1]/div[2]/a[2]').click()
    time.sleep(0.5)


     
    '''
    네이버로 접속하셔서 뉴스스탠드 쪽에 있는 파란색 '네이버 뉴스'를
    클릭하세요.

    상단에 있는 메뉴 중 정치, 경제, 사회, 생활/문화, 세계, IT/과학
    탭을 돌아다니면서 헤드라인 뉴스 4개씩 클릭해 주시면 됩니다.
    뒤로가기는 driver.back() 메서드로 뒤로가기 가능합니다.

    XPATH를 따다 보면 규칙을 발견하실 수 있을 겁니다.
    반복문 이용해서 클릭 명령을 내려 주시면 됩니다.
    24개의 명령을 일일히 쓰라는 게 아니에요. 규칙을 꼭 발견 하세요.
    '''

    from selenium import webdriver
    import time

    driver = webdriver.Chrome('C:/Users/WiTHUS/Desktop/java_web_jiin/python/chromedriver.exe')

    time.sleep(0.5)

    #뉴스홈 클릭
    driver.find_element_by_xpath('//*[@id="NM_NEWSSTAND_HEADER"]/div[2]/a[1]').click()
    time.sleep(0.5)

    #정치탭 클릭
    driver.find_element_by_xpath('/html/body/section/header/div[2]/div/div/div[1]/div/div/ul/li[2]/a/span').click()
    time.sleep(0.5)

    for x in range(3, 8):

        for n in range(1, 5):

            try:
                news_head = f'//*[@id="main_content"]/div/div[2]/div[1]/div[{n}]/div[1]/ul/li[1]/div[2]/a'
                driver.find_element_by_xpath(news_head).click()
            except:
                news_head = f'//*[@id="main_content"]/div/div[3]/div/div[{n}]/ul/li[1]/div/a'
                driver.find_element_by_xpath(news_head).click()


        # 다른 분야 탭을 누르는 동작입니다.
        news_tab = f'//*[@id="lnb"]/ul/li[{x}]/a/span'
        driver.find_element_by_xpath(news_tab).click()
        time.sleep(0.5)
     
    from selenium import webdriver
    import time
    # 뷰티풀수프 임포트
    from bs4 import BeautifulSoup

    # 웹 드라이버 활성화 및 알라딘 홈페이지로 이동합니다.

    driver = webdriver.Chrome('C:/Users/WiTHUS/Desktop/java_web_jiin/python/chromedriver.exe')

    time.sleep(0.5)

    driver.find_element_by_xpath('//*[@id="re_mallmenu"]/ul/li[3]/div/a/img').click()

    time.sleep(0.5)

    # selenium으로 현재 페이지 html 소스코드를 전부 불러옵니다.
    src = driver.page_source
    print(src)

    time.sleep(1)

    #selenium 으로 현재 페이지의 html 소스코드를 전부 불러옵니다.
    src = driver.page_source

    # 뷰티풀수프 객체를 생성합니다.
    # 뷰티풀수프 객체를 생성하면서, 셀레늄이 가지고 온 html 소스코드를 제공하고,
    # 해당 소스코드를 html 문법으로 변환하라는 주문입니다.

    soup = BeautifulSoup(src, 'html.parser')

    # 뷰티풀수프를 사용하여 수집하고 싶은 데이터가 들어 있는 태그를 부분 추출할 수 있습니다.

    # find_all() 메서드는 인수값으로 추출하고자 하는 태그의 이름을 적으면
    # 해당 태그만 전부 추출하여 리스트에 담아 대입합니다.

    div_list = soup.findAll('div', class_='ss_book_box')
    # print('div_list에 들어 있는 데이터의 수: ', len(div_list))
    # print(div_list[0]) 1위 책만 가져오세요.

    first_book = div_list[0].find_all('li')
    # print(first_book)

    # text는 태그를 제외한 사용자가 실제로 브라우저에서 확인 가능한
    # 텍스트만을 추출하여 문자열 형태로 반환합니다.

    book_title = first_book[1].text
    book_author = first_book[2].text
    book_price = first_book[3].text

    auth_info = book_author.split('|')

    print('# 제목: ', book_title)
    print('# 저자: ', auth_info[0])
    print('# 출판사: ', auth_info[1])
    print('# 출판일: ', auth_info[2])
    print('# 가격:', book_price.split(', ')[0])
     

    from selenium import webdriver
    import time
    from bs4 import BeautifulSoup
    from datetime import datetime


    d = datetime.today()

    file_path = f'C:/Users/WiTHUS/Desktop/java_web_jiin/python/crawling/알라딘 베스트셀러 1~50위_{d.year}_{d.month}_{d.day}.txt'

    '''
    # with문을 사용하면 with 블록을 벗어나는 순간 객체가 자동으로 해제됩니다.
    (java의 try with resource와 비슷합니다.)
    # with 작성 시 사용할 객체의 이름을 as 뒤에 작성해 줍니다.
    '''

    '''
    * 표준 모듈 codecs

    - 웹이나 다른 프로그램의 텍스트 데이터와 파이썬 내부의 텍스트 데이터의 인코딩 방식이 서로 다른 경우에,
    내장함수 open()이 제대로 인코딩을 적용할 수 없어서 에러가 발생합니다. (UnicodeEncodeError)
    '''


    with codecs.open(file_path, mode='w', encoding='utf-8') as f:
        driver = webdriver.Chrome('C:/Users/WiTHUS/Desktop/java_web_jiin/python/chromedriver.exe')
        driver.get('https://www.aladin.co.kr')
        time.sleep(0.5)

        driver.find_element_by_xpath('//*[@id="re_mallmenu"]/ul/li[3]/div/a/img').click()
        time.sleep(0.5)

       

        src = driver.page_source

        soup = BeautifulSoup(src, 'html.parser')

        div_list = soup.findAll('div', class_='ss_book_box')
       
        rank = 1

        for div in div_list:
            book_info = div.find_all('li')

            if book_info[0].text[0] != '[':
                book_title = book_info[0].text
                book_author = book_info[1].text
                book_price = book_info[2].text

            else:
                book_title = book_info[1].text
                book_author = book_info[2].text
                book_price = book_info[3].text

            auth_info = book_author.split('|')
           
            f.write(f'# 순위: {rank}\n')
            f.write(f'# 제목: {book_title}\n')
            f.write(f'# 저자: {auth_info[0]} \n')
            f.write(f'# 출판사: {auth_info[1]} \n')
            f.write(f'# 출판일: {auth_info[2]} \n')
            f.write(f'# 가격:' + book_price.split(', ')[0] + '\n')
            f.write('-' * 40 + '\n')

            rank += 1
     
     
    '''
    * 표준 모듈 datetime

    - 운영 체제의 현재 시간과 날짜 정보를 파이썬 내부로 읽어오는 기능을 제공하는 모듈입니다.
    '''
    from datetime import datetime

    # 오늘 날짜와 현재 시간 정보를 가지고 있는 객체를 리턴합니다.
    d = datetime.today()
    print(d)

    print(f'지금은 {d.year}{d.month}{d.day}{d.hour}{d.minute}{d.second}초입니다.')
     
     
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    import time
    from bs4 import BeautifulSoup
    from datetime import datetime

    # 엑셀처리 모듈 임포트
    import xlsxwriter

    # user-agent 정보를 변환해 주는 모듈 임포트
    # 특정 브라우저로 크롤링을 진행할 때 차단되는 것을 방지
    from fake_useragent import UserAgent

    # 이미지를 바이트 변환 처리 모듈
    from io import BytesIO

    # 요청 헤더 정보를 꺼내올 수 있는 모듈
    import urllib.request as req

    d = datetime.today()

    file_path = f'C:/Users/WiTHUS/Desktop/java_web_jiin/python/crawling/알라딘 베스트셀러 1~50위(new)_{d.year}_{d.month}_{d.day}.xlsx'

    # User Agent 정보 변환 (필수는 아닙니다.)
    opener = req.build_opener() # 헤더 정보를 초기화합니다.
    opener.addheaders = [('User-agent', UserAgent().ie)]
    req.install_opener(opener) # 새로운 헤더 정보를 삽입합니다.

    # 엑셀 처리 선언합니다.
    # workbook 객체를 생성하여 엑셀 파일을 하나 생성합니다. (매개값으로 저장될 경로를 지정합니다.)
    workbook = xlsxwriter.workbook(file_path)

    # worksheet 생성합니다.
    worksheet = workbook.add_worksheet()

    # 브라우저를 뜨지 않게 하는 방법
    chrome_option = Options()
    chrome_option.add_argument('--headless')

    # 브라우저 설정 - 일반 모드
    browser = webdriver.Chrome('C:/Users/WiTHUS/Desktop/java_web_jiin/python/chromedriver.exe')

    # # 브라우저 설정 - headless 모드
    # browser = webdriver.Chrome('C:/Users/WiTHUS/Desktop/java_web_jiin/python/chromedriver.exe', options=chrome_option)

    # 브라우저 사이즈 조정
    browser.set_window_size(800, 600)

    # 브라우저 내부 대기 (전체 로딩될 때까지 대기 후 남은 시간은 무시합니다.)
    browser.implicitly_wait(10)

    # 베스트 셀러 홈페이지 이동합니다

    # 엑셀에 텍스트를 저장합니다.
    cell_format = workbook.add_format({'bold': True, 'font_color': 'red', 'bg_color':'yellow'})
    worksheet.write('A1', '썸네일', cell_format)
    worksheet.write('B1', '제목', cell_format)
    worksheet.write('C1', '작가', cell_format)
    worksheet.write('D1', '출판사', cell_format)
    worksheet.write('E1', '출판일', cell_format)
    worksheet.write('F1', '가격', cell_format)
    worksheet.write('G1', '링크', cell_format)

    while True:
        # bs4 초기화
        soup = BeautifulSoup(browser.page_source, 'html.parser')

        div_ss_book_box_list = soup.find_all('div', class_='ss_book_box')

        for div_ss_book_box in div_ss_book_box_list:

            # 이미지
            img_url = div_ss_book_box.select_one('table div > a > img.i_cover')
            print(img_url)

    'PYTHON' 카테고리의 다른 글

    project html/css  (0) 2022.03.11
    python  (0) 2022.03.01
    python  (0) 2022.02.25
    python  (0) 2022.02.25
    python  (0) 2022.02.23
Designed by Tistory.