본문 바로가기
TIL

내배캠 TIL 3일차

by ColorConeHead 2023. 12. 30.
반응형

어제 코드 추가하기

어제 만든 코드는 크롤링을 잘 해오는지 테스트용으로
리스트 길이를 출력하는 함수에서 끝났다면 오늘은 엑셀파일로
내보내는 것까지 코드를 수정했다.

import re
import pandas as pd
import requests
import numpy as np

game_name = []          # 게임이름
game_score = []         # 게임평점
game_platform = []      # 발매플랫폼
game_year = []          # 출시년도
game_sales = []         # 판매량
game_total_shipped = [] # 총판매량(실물타이틀+디지털)
game_total_sales = []   # 총판매량(디지털)

### 리스트에 있는 년도의 발매 게임 정보를 크롤링

years = [2017, 2018, 2019, 2020, 2021, 2022, 2023]

for year in years:
    page = 1            # 1페이지는 기본값
    while True:

        # year와 page 값을 받아와 url을 설정해서 requests로 소스코드 읽어오기
        url = f'https://opencritic.com/browse/all/{year}?page={page}'
        response = requests.get(url)
        text = response.content.decode("utf-8")

        # 정규표현식을 이용해서 원하는 소스코드 중 원하는 파츠만 가져오기
        source = re.findall(r'<app-root(.+)</span><!----><!----></div></div><!----></div><!----><!----></div>', text, re.DOTALL)


        # 파츠 내에서 원하는 요소만 가져오기
        long_name = re.findall(r'game/(.+?)</a>', source[0], re.DOTALL)
        score = re.findall(r'score col-auto"> (.+?) </div>',  source[0], re.DOTALL)
        platform = re.findall(r'platforms col-auto"> (.+?) </div>', source[0], re.DOTALL)

        # 원하는 요소를 각각의 리스트에 넣어주기
        for i in range(len(long_name)):
            game_name.append(long_name[i].split(">")[1])
            game_score.append(score[i])
            game_platform.append(platform[i])
            game_year.append(year)


        # 마지막 페이지가 아니면 페이지 +1 해주기
        if 'right page-button' in text:
            page += 1
        else:
            break


game_name_v = np.array(game_name).reshape(-1, 1)
game_score_v = np.array(game_score).reshape(-1, 1)
game_platform_v = np.array(game_platform).reshape(-1, 1)
game_year_v = np.array(game_year).reshape(-1, 1)


df = pd.DataFrame(index=range(len(game_year_v)))

df['name'] = game_name_v
df['platform'] = game_platform_v
df['year'] = game_year_v
df['score'] = game_score_v

df.to_csv('result.csv')

 


그렇게 출력된 결과물에서 문제점이 몇 개 발견되었다.


1. 데이터 내용에 한자가 있는 것


이름에 한자가 있는 게임 데이터만
게임 이름과 발매 플랫폼이 나뉘지 않았다.

몇 개 되지 않아서 해결하기보다는
그냥 없애기로 했지만
왜 그런지는 알아봐야겠다.


2. 크롤링 시간 문제


앞서 작성했던 코드에 사용되었던 사이트는
판매량은 나오지 않았기 때문에
판매량만 나오는 사이트에서 크롤링 하는 코드를 작성하였다.

import re
import pandas as pd
import requests


game_total_shipped = []
game_total_sales = []

df = pd.read_csv('video_games_score_over_2017_del.csv')


game_name = list(df['Name'])

cnt = 1
for i in game_name:
    key = " + ".join(i.split(" "))
    try:
        url = f'https://www.vgchartz.com/games/games.php?name={key}&keyword=&console=&region=All&developer=&publisher=&goty_year=&genre=&boxart=Both&banner=Both&ownership=Both&showmultiplat=Yes&results=10&order=Sales&showtotalsales=0&showtotalsales=1&showpublisher=0&showvgchartzscore=0&shownasales=0&showdeveloper=0&showcriticscore=0&showpalsales=0&showreleasedate=0&showuserscore=0&showjapansales=0&showlastupdate=0&showothersales=0&showshipped=0&showshipped=1'
        response = requests.get(url)

        text = response.text

        core = re.findall(rf'<td style="font-size:12pt;">(.+?)</table>', text, re.DOTALL)

        if core == []:
            game_total_shipped.append('N/A')
            game_total_sales.append('N/A')
            continue

        items = re.findall(r'<td align="center">(.+?)</td>', core[0], re.DOTALL)
        game_total_shipped.append(items[1])
        game_total_sales.append(items[2])

    except requests.exceptions.ChunkedEncodingError:
        game_total_shipped.append('N/A')
        game_total_sales.append('N/A')
        continue
    print(cnt, game_total_sales)
    cnt += 1

df = pd.DataFrame(col=range(len(game_total_shipped)))

df['game_total_shipped'] = np.array(game_total_shipped).reshape(-1, 1)
df['game_total_sales'] = np.array(game_total_sales).reshape(-1, 1)

df.to_csv('result2_csv')

 

 

 

**requests.exceptions.ChunkedEncodingError**

위 에러가 계속 떠서
try, except를 통해 예외처리를 해주었다.


진행 상황을 보고 싶어서 
cnt를 만들어서 중간중간에 출력되게 했는데
1시간이 지났는데 1000개 정도 밖에 안 됐었다.

예외 처리가 시간을 많이 잡아먹게 하는 지 알아봐야겠다.

[requests.exceptions.ChunkedEncodingError 참고링크]

 

 

 

 

3. 크롤링 시간 문제 2

이 TIL을 작성하는 중에 발견했는데

**requests.exceptions.ConnectTimeout**

위 에러가 뜨면서 코드가 멈췄다.

구글링하다가 에러 원인과
예외처리에 추가해줘야 하는 코드를 찾았다.


[requests.exceptions.ConnectTimeout 참고링크](https://velog.io/@seunghoking/python-requests%EB%A1%9C-%EC%97%AC%EB%9F%AC%EB%B2%88-http%EC%9A%94%EC%B2%AD%ED%95%A0-%EB%95%8Crequests.exceptions.ConnectionError-HTTPConnectionPool-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95)

내일까지 제출인 과제이므로
코드를 잘 고치든지
이런 저런 에러를 발견했다고 보고하든지 
팀원들과 상의해야겠다.

p.s 우리 팀 왜 3일만에 2명 나갔지...나 뭐 안 했는데.

반응형

'TIL' 카테고리의 다른 글

내배캠 TIL 6일차  (0) 2023.12.30
내배캠 TIL 5일차  (0) 2023.12.30
내배캠 TIL 4일차  (1) 2023.12.30
내배캠 TIL 2일차  (0) 2023.12.30
내배캠 TIL 1일차  (0) 2023.12.30