코딩 연습/코딩배우기

뉴스픽 파트너스 기사 링크 주소 복사

good4me 2022. 4. 10. 23:12

뉴스픽 파트너스 링크 주소를 하나씩 클릭해서 복사 붙여넣기 하는 방식이 아니라 좌우 스크롤되는 기사 20개와 추천 콘텐츠 10개 링크 주소를 한 번에 복사할 수 있도록 파이썬으로 코딩해보았다.

 

 

파이썬으로 뉴스픽 파트너스 기사 링크 주소 가져오기 

얼마 전에 뉴스픽 파트너스 관련 포스팅을 했는데, 여러 기사에 대해 파이썬 크롤링으로 링크 주소를 가져오는 방법을 작성해보고 그 결과를 다시 포스팅한다.

 

셀레니움 모듈 import, 크롬 드라이브 사용

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
import time
import pyperclip
import pyautogui
import openpyxl
from datetime import datetime


def chromeWebdriver():
    chrome_service = ChromeService(executable_path=ChromeDriverManager().install())
    options = Options()
    options.add_experimental_option('detach', True)
    options.add_experimental_option('excludeSwitches', ['enable-logging'])
    user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36'
    options.add_argument(f'user-agent={user_agent}')
    # options.add_argument('--headless')

    driver = webdriver.Chrome(service=chrome_service, options=options)

    return driver
  • 크롬 드라이브는 위 코드처럼 함수로 만들어서 사용하면 편리함

 

 

셀레니움으로 뉴스픽 파트너스 로그인 하기

driver = chromeWebdriver()
driver.get('https://partners.newspic.kr/login')
driver.implicitly_wait(2)
# driver.maximize_window()
time.sleep(2)

id = driver.find_element(By.NAME, 'id')
id.click()
pyperclip.copy('아이디_메일')
pyautogui.hotkey('ctrl', 'v')
time.sleep(1)

pw = driver.find_element(By.NAME, 'password')
pw.click()
pyperclip.copy('패스워드')
pyautogui.hotkey('ctrl', 'v')
time.sleep(1)

login_btn = driver.find_element(By.XPATH, '/html/body/div[1]/section/div[2]/div/div[1]/form/button')
login_btn.click()
time.sleep(2)
  • 크롬 드라이브 함수를 호출하고,
  • 뉴스픽 파트너스에 셀레니움으로 로그인 절차를 수행한다. 아이디는 이메일이고 패스워드를 넣어주면 크롬 드라이브를 통해 뉴스픽 파트너스 브라우저가 자동으로 오픈되고 로그인이 된다.
  • send_keys()를 사용할 수 있으나 간혹 막히는 경우가 있어서 pyperclip과 pyautogui를 사용함

 

 

좌우 스크롤 기사의 링크주소 가져오기

## 섹션1 - 좌우스크롤
now = datetime.now()
xl_filename = '뉴스픽_' + now.strftime('%Y%m%d%H%M%S') + '.xlsx'
wb = openpyxl.Workbook()
ws = wb.active
ws.append(['No', '기사 URL', '이미지', '기사 제목', '비고'])
wb.save(xl_filename)

news_scrap = []
scrap = []
newsList_ul = driver.find_element(By.ID, 'profitNewsList')
lis = newsList_ul.find_elements(By.CLASS_NAME, 'swiper-slide')
print(len(lis))

row = 2
for li in lis:
    _image = li.find_element(By.CSS_SELECTOR, 'div.thumb > img').get_attribute('src')
    title = li.find_element(By.CSS_SELECTOR, 'div.thumb > div.box-share > ul > li:nth-child(1) > button').get_attribute('data-title')
    link_url = li.find_element(By.CSS_SELECTOR, 'div.box-share > a').get_attribute('href')
    _link_url = link_url.replace('http://', 'https://').replace('&lcp', '&cp')
    link_list = _link_url.split('&')

    final_url_link = ''
    idx = 0
    for link in link_list:
        if idx == 3:
            continue
        final_url_link += link + '&'

    final_url_link = final_url_link[:-1]
    print(f'{_image}\n{title}\n{link_url}\n{final_url_link}')

    ## 엑셀 저장
    ws.cell(row, 1).value = row - 1
    ws.cell(row, 2).value = final_url_link
    ws.cell(row, 3).value = _image
    ws.cell(row, 4).value = title.strip()
    ws.cell(row, 5).value = f'="<center><a href=\'"&B{row}&"\' target=\'_blank\' rel=\'noopener\'><img src=\'"&C{row}&"\'><br /><b>"&D{row}&"</b></a></center><br />"'
    row += 1

wb.save(xl_filename)
  • 엑셀 파일을 생성하고, 셀레니움으로 html 구문에서 기사 썸네일 URL, 기사 제목, 파트너스 링크 주소를 추출한다.
  • 이때 단축 URL에 맞는 파트너스 URL로 변경하기 위해 replace() 함수를 사용했다.
  • 기사 링크 주소 등을 엑셀에 저장하는 이유는 기사 관리를 위한 것이고 마지막 열에 html 코드를 넣어 엑셀 값 만을 복사하여 웹 페이지 등에 바로 붙여넣기 하기 위해서임

 

good4me.co.kr

 

추천 콘텐츠 링크 주소 복사하기

## 섹션2
recommend_ul = driver.find_element(By.ID, 'recommendNewsList')
recommend_lis = recommend_ul.find_elements(By.CSS_SELECTOR, 'li.d-flex')
print(len(recommend_lis))

for li in recommend_lis:
    _image2 = li.find_element(By.CSS_SELECTOR, 'div.thumb > a > img').get_attribute('src')
    title2 = li.find_element(By.CSS_SELECTOR, 'div.info > a > span').text
    link_url2 = li.find_element(By.CSS_SELECTOR, 'div.info > a').get_attribute('href')
    _link_url2 = link_url2.replace('http://', 'https://').replace('&lcp', '&cp')
    link_list2 = _link_url2.split('&')

    final_url_link2 = ''
    idx = 0
    for link in link_list2:
        if idx == 3:
            continue
        final_url_link2 += link + '&'

    final_url_link2 = final_url_link2[:-1]
    print(f'{_image2}\n{title2}\n{link_url2}\n{final_url_link2}')

    ## 엑셀 저장
    ws.cell(row, 1).value = row - 1
    ws.cell(row, 2).value = final_url_link2
    ws.cell(row, 3).value = _image2
    ws.cell(row, 4).value = title2.strip()
    ws.cell(row, 5).value = f'="<center><a href=\'"&B{row}&"\' target=\'_blank\' rel=\'noopener\'><img src=\'"&C{row}&"\'><br /><b>"&D{row}&"</b></a></center><br />"'
    row += 1

wb.save(xl_filename)

driver.quit()
  • 이 부분도 좌우 스크롤 부분과 유사한 방식으로 추출하였으며, 엑셀에 같이 저장하여 한번에 웹 페이지에 올릴 수 있도록 하였다.

 

실행 결과

저장된 엑셀 내역
저장된 엑셀 내역

  • 엑셀 E열 값을 복사하여 웹 페이지(아래 이미지)에 html 코드 작성으로 삽입

 

웹 페이지에 html 소스 붙여넣기
웹 페이지에 html 소스 붙여넣기

 

웹 페이지 등록 결과
웹 페이지 등록 결과

 

예시 페이지 보기

 

[뉴스픽] 아파트 대체재 뜬 오피스텔…이제는 '4베이' 시대 외

아파트 대체재 뜬 오피스텔…이제는 '4베이' 시대 제주 헬기 추락사고 실종 해경대원 숨진 채 발견 터키: 세계에서 가장 오래된 디저트, 아슈레 푸딩 4세대 아이돌 미드 대표주자 권은비 ‘추락

4u.ne.kr