ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 주요 게임 매체 스크랩하기(bs4 활용)
    코딩 및 데이터분석/웹크롤링 2023. 7. 26. 00:04

    각 기사 옆에 'Summary'라는 이름으로 본문 세 줄 요약까지 해버리고 싶은데, 아직 초보라 방법을 모르겠다.

     

    그리고 이 결과로 만든 xlsx파일을 컴퓨터로 봐봤자 의미가 없기 때문에 모바일로도 간편하게 받아보고 싶은데... 이 역시 방법을 모르겠다.

     

    GPT 선생이 없었으면 혼자 힘으로는 절대 이 코드를 얻지 못했을 것이다.

    AI란 정말 신묘하다.

     

    앞으로 해외 매체들도 추가해볼 생각이다.

    각 매체 별로 기사 탭에 들어가면 제일 먼저 보이는 메인 페이지에 노출된 기사의 제목, 링크만 10~20개 정도 추출하는 것이라, 아마 각 홈페이지에 이 스크랩으로 인한 부담은 없을 것이라고 생각한다.

     


    버전

    2023.8.10 GameDeveloper 비즈니스 섹션 추가

    import requests
    import pandas as pd
    from bs4 import BeautifulSoup
    from datetime import datetime
    # 인벤
    
    url = 'https://www.inven.co.kr/webzine/news/?hotnews=1'
    html = requests.get(url)
    soup = BeautifulSoup(html.content, 'html.parser')
    
    # 빈 리스트 만들기
    titles = []
    links = []
    date_times = []
    
    # 뉴스 제목, 링크 등 정보 담고 있는 영역
    content_divs = soup.find_all('div', class_='content')
    
    # 하위 영역에서 각 요소 찾기
    for content_div in content_divs:
        # 제목
        title_element = content_div.find('span', class_='title').text
        titles.append(title_element)
    
        # 링크
        link_element = content_div.find('a', href=True)
        link = link_element['href']
        links.append(link)
    
        # 날짜
        date_time_element = content_div.find('span', class_='info').text
        date_time = date_time_element.split('|')[-1].strip()
        date_times.append(date_time)
    
    data = {
        'Title': titles,
        'Date': date_times,
        'Link': links
    }
    
    # df로 만들고, 인덱스 및 컬럼 정리
    inven_df = pd.DataFrame(data)
    inven_df.insert(0, 'Media', '인벤')
    inven_df.index=inven_df.index+1
    
    # URL이 자꾸 짤려서 너비를 키움
    pd.set_option('max_colwidth', 200)
    inven_df
    
    
    # 디스이즈게임
    pd.set_option('max_colwidth', 200)
    
    url = 'https://www.thisisgame.com/webzine/news/nboard/263/'
    html = requests.get(url)
    soup = BeautifulSoup(html.content, 'html.parser')
    
    tig_data = []
    for titles in soup.find_all(class_='subject'):
        link_tag = titles.a
        if link_tag and 'href' in link_tag.attrs:
            link = link_tag['href']
            link = 'https://www.thisisgame.com/webzine/news/nboard/263/' + link
    
            date_tag = titles.find_next('span', class_='date')
            date = date_tag.text.strip() if date_tag else None
    
            tig_data.append({"Title": link_tag.text, "Date": date, "Link": link})
    
    df = pd.DataFrame(tig_data)
    df.insert(0, 'Media', '디스이즈게임')
    df.index=df.index+1
    
    tig_df=df
    
    # 게임메카
    pd.set_option('max_colwidth', 200)
    
    url = 'https://www.gamemeca.com/news.php'
    html = requests.get(url)
    soup = BeautifulSoup(html.content, 'html.parser')
    
    mecca_data = []
    for titles in soup.find_all(class_=['tit_thumb', 'tit_thumb_h']):
        link_tag = titles.a
        if link_tag and 'href' in link_tag.attrs:
            link = link_tag['href']
            link = 'https://www.gamemeca.com' + link
    
            date_tag = titles.find_next(class_='day_news')
            date = date_tag.text.strip() if date_tag else None
    
            mecca_data.append({"Title": link_tag.text, "Date": date, "Link": link})
    
    df = pd.DataFrame(mecca_data)
    df.insert(0, 'Media', '게임메카')
    df.index=df.index+1
    
    mecca_df=df
    
    # 중국 17173 매체
    pd.set_option('max_colwidth', 200)
    
    url = 'http://news.17173.com/'
    html = requests.get(url)
    soup = BeautifulSoup(html.content, 'html.parser')
    
    yiqi_data = []
    for titles in soup.find_all(class_='tit'):
        link_tag = titles.a
        if link_tag and 'href' in link_tag.attrs:
            link = link_tag['href']
            
            date_tag = titles.find_next(class_='ico ico-date')
            date = date_tag.text.strip() if date_tag else None
    
            yiqi_data.append({"Title": link_tag.text, "Date": date, "Link": link})
    
    df = pd.DataFrame(yiqi_data)
    df.insert(0, 'Media', '17173')
    df.index=df.index+1
    
    yiqi_df=df
    
    # gamedeveloper.com/business 섹션
    pd.set_option('max_colwidth', 200)
    
    url = 'https://www.gamedeveloper.com/business'
    html = requests.get(url)
    soup = BeautifulSoup(html.content, 'html.parser')
    
    gd_data = []
    
    # 기사 목록 추출
    articles = soup.find_all('div', class_='topic-content-article')
    
    # 각 기사 정보 추출
    for article in articles:
        # 기사 제목 추출
        article_title = article.find('span', class_='article-title').text
    
        # 기사 링크 추출
        article_link = article.find('a', class_='article-edge-wrap')['href']
    
        # 기사 날짜 추출
        article_date = article.find('div', class_='arcile-date').text
    
        gd_data.append({"Title": article_title, "Date": article_date, "Link": article_link})
    
    df = pd.DataFrame(gd_data)
    df.insert(0, 'Media', 'GameDeveloper')
    df.index=df.index+1
    
    gd_df=df
    
    
    
    #엑셀 각 시트로 추출 
    
    file_name="{}_주요 게임매체 기사.xlsx".format(datetime.now().strftime('%y%m%d'))
    with pd.ExcelWriter(file_name) as writer:
        inven_df.to_excel(writer, sheet_name='인벤', index=True)
        tig_df.to_excel(writer, sheet_name='디스이즈게임', index=True)
        mecca_df.to_excel(writer, sheet_name='게임메카', index=True)
        yiqi_df.to_excel(writer, sheet_name='17173', index=True)
        gd_df.to_excel(writer, sheet_name='GameDeveloper', index=True)

     

     

     

     

     

Copyright 2023. 준호의 게임 이야기. All rights reserved.