[파이썬/크롤링] 스팀홈페이지 크롤링(2)

seulzzang·2022년 9월 15일
0

파이썬/크롤링

목록 보기
2/4
post-thumbnail

지난번에 이어서~..
데이터 처리하는 방향을 바꿨다.
원래는 시스템요구사항에 해당하는 운영체제같은 것들을 key로 받고, 그에 해당하는 값들을 value로 받아서 그것들을 dictionary로 만들려고 했지만.. 그렇게 하면 게임 제목은 어디다 담아줘야하지? 하는 어려움에 봉착함.. 난 아직 개초보코더기때문에 그렇게 복잡하게는 생각 못함.. 아직 빡통임..
그래서 게임타이틀key로 가지고 시스템요구사항들을 value로 갖는 dictionary를 생성해주기로 했다.

📍수집한 app id를 바탕으로 각 게임 최소사양 불러오기

  • {'게임 타이틀(장르)' : [시스템 요구사항]}으로 이루어진 dictionary에 담아줄 것이기 때문에

    sysreqlist = {}

    sysreqlist를 선언해준다.

  • 이후 id_list의 길이 만큼 반복문을 수행하며 제목, 장르, 최소사양을 크롤링 한다.

# for i in range(len(id_list)):
for i in range(10):
    appidURL = 'https://store.steampowered.com/app/'+id_list[i]
    res = requests.get(appidURL, cookies={
        'Steam_Language':'koreana'
    })
    soup = BeautifulSoup(res.text, 'html.parser')

개발자도구를 확인해보면 data-os 속성이 있는 것을 알 수 있는데, 이는 운영체제를 나타내는 속성이며, 나는 윈도우만 필요하므로 data-os="win"속성을 지정해 주기로 하였다.

    sysreq_content = soup.select_one('.game_area_sys_req.sysreq_content.active[data-os="win"]')
    if sysreq_content.select_one('.game_area_sys_req_leftCol') == None:
        sysreqs = sysreq_content.select('.game_area_sys_req_full li')
    else:
         sysreqs = sysreq_content.select('.game_area_sys_req_leftCol li')
   
    appName = soup.select_one('#appHubAppName').text
    genre = soup.select('.glance_tags.popular_tags a')[0].text.strip()
    title = appName + ' (' + genre + ')'

많기도 하다..

보통 대부분의 게임들은 시스템 요구사항에 최소권장left_colright_col로 나뉘어져있다. 하지만 최소만 존재하는 경우 game_area_sys_req_full 클래스를 가지므로 클래스 game_area_sys_req_leftCol를 호출하면 아무값도 나오지 않음.. 그래서 sysreq_content.select_one('.game_area_sys_req_leftCol') == None이라면 최소만 존재하는 경우이므로 클래스를 game_area_sys_req_full주는 조건문을 달아줬다.

  • sysreq_content
  • sysreqs
  • appName : 게임 타이틀
  • genre : 이 제품의 인기태그의 첫번째 항목(게임 장르를 파악하기 위함)
  • title : 최종 dictionary에 담아줄 게임 타이틀장르를 합친 str
    req_list = []
    for sysreq in sysreqs:
        # >문장<이 나오면 제외.
        if '필요합니다' in sysreq.text:
            continue
        elif '추가 사항' in sysreq.text:
            continue
        else:
            req = sysreq.text.strip()
            req_list.append(req)
    sysreqlist[title] = req_list
  • 각 게임들의 시스템 요구사항을 담아줄 리스트 req_list를 초기화 한다.
  • 종종 시스템 요구 사항 박스에 64비트 프로세서와 운영 체제가 필요합니다라는 문장이 들어가 있는 경우가 있는데, 이 역시 li태그에 포함된 text라서 제외시켜줘야 한다. (필요하다면 담아도 상관 없음) 이를 파악하고 인덱스를 0번부터가 아닌 1번부터 불러오기로 하면 가끔 저런 문장이 없는 경우가 있어서 그냥 필요합니다라는 text가 포함돼 있는 경우 continue를 해주는 방식으로 시스템 요구사항들을 크롤링했다.
  • 추가사항 역시 어두운 곳에서 헤드셋을 끼고 플레이하십시오같은.. 가끔 이런 소리가 들어가 있는 게임이 있길래 제외시켜줬다.
  • 이후 dictionary에 담아주면 끝.
Output exceeds the size limit. Open the full output data in a text editor
{'The Death | Thần Trùng (공포)': ['운영체제: Windows 7 SP1+ x64',
  '프로세서: Intel/Amd',
  '메모리: 4 GB RAM',
  '그래픽: Nvidia/Amd',
  'DirectX: 버전 11',
  '저장공간: 8 GB 사용 가능 공간',
  '사운드카드: Yes'],
 'The Wandering Village (앞서 해보기)': ['운영체제: Windows® 7, Windows® 10',
  '프로세서: Quad Core Processor',
  '메모리: 4 GB RAM',
  '그래픽: GeForce GTX 660, Radeon RX 460 or similar dedicated graphics card',
  'DirectX: 버전 11',
  '저장공간: 2 GB 사용 가능 공간'],
 '카이토 마사하루의 사건부 (액션)': ['운영체제: Windows 10',
  '프로세서: Intel Core i5-3470, 3.2 GHz or AMD Ryzen 3 1200, 3.1 GHz',
  '메모리: 8 GB RAM',
  '그래픽: NVIDIA GeForce GTX 960, 2 GB or AMD Radeon RX 460, 2 GB',
  '저장공간: 60 GB 사용 가능 공간'],
 '로스트 저지먼트: 심판받지 않은 기억 (액션)': ['운영체제: Windows 10',
  '프로세서: Intel Core i5-3470, 3.2 GHz or AMD Ryzen 3 1200, 3.1 GHz',
  '메모리: 8 GB RAM',
  '그래픽: NVIDIA GeForce GTX 960, 2 GB or AMD Radeon RX 460, 2 GB',
  '저장공간: 60 GB 사용 가능 공간'],
 '저지 아이즈:사신의 유언 Remastered (액션)': ['운영체제: Windows 10',
  '프로세서: Intel Core i5-3470, 3.2 GHz or AMD Ryzen 3 1200, 3.1 GHz',
...
  '메모리: 256 MB RAM',
  '그래픽: Intel graphics HD 620',
  'DirectX: 버전 9.0',
  '저장공간: 120 MB 사용 가능 공간',
  '사운드카드: existent']}

크롤링이 아주 잘 된 것을 확인할 수 있다!
원래 장르는 크롤링 안하려고 했는데.. 게임의 장르가 뭔지는 파악해야지 컴퓨터 사양이 나랑 맞든 말든 플레이를 할 마음이 들지 않겠냐구요.. 그래서 제목 옆에 붙여주기로 했다.
텔레그램 자동화를 실행할 경우 해당 게임이 출시된 날짜와 함께

*월 *일 신작 게임 안내입니다.
< The Death | Thần Trùng (공포) >
해당 게임에 요구되는 최소 사양입니다.
['운영체제: Windows 7 SP1+ x64',
  '프로세서: Intel/Amd',
  '메모리: 4 GB RAM',
  '그래픽: Nvidia/Amd',
  'DirectX: 버전 11',
  '저장공간: 8 GB 사용 가능 공간',
  '사운드카드: Yes']

이런 식으로 메세지를 보내주는 형식이 어떨까..


이제 남은것은 신규데이터를 체크하기위해서 id_list를 갱신해야 하는데, 이를 파일로 저장해서 관리하고 불러오기를 하는 방법을 코딩해야한다.
스팀 홈페이지가 개빡치는게 app id가 순서대로인게 아니라 뒤죽박죽이다.. 그래서 일단 생각하기로는 자동화를 시작하기 전 까지 신규 app id를 텍스트 파일로 관리하고, 매일containment test를 진행하여 없는 app id면 신작이니까 그 아이디에 해당하는 게임만 크롤링하는 방식으로..
일단 생각까진 완벽한데.. 할 수 있는 데 까지 코딩을 얼른 해야겠다. 주말엔 놀아야하니까😊

profile
중요한 것은 꺾이지 않는 마음

0개의 댓글