졸업작품_preparing..../python_작업

Steam_game_ 검색_자동화도구만들기

IT grow. 2019. 2. 10. 07:43
반응형

Steam_game 의 몇가지 필요한 정보들이 있었다.

예를 들면 , 특정 게임의 태그 . 이름 . 출시일 . 추천수 . 소유자 .. 등등이다.


크롤링을 사용하여서 할 수 있다 . 


다만 , 시간적이 오래걸릴 뿐더러 , 데이터의 손실의 가능성이 있다.


그리고 내가 필요로 하는 정보가 사이트에 없는 경우가 있으며 , 이 정보를 따로 만들어서 합치는 작업을 생각하면

많은 시간을 필요로 한다.


그래서 알게된 api가 있다.


https://steamspy.com/api.php


--> 위 사이트는 steamspy 사이트이며 , Steam 게임에 대한 dataset을 가지고 있으며 , 무료 api를 제공한다.


위 api를 사용해서 사용자의 입력을 받아서 , 특정 태그에 따른 게임의 정보들을 출력해 보는 자동화도구를 만들어 보겠다.


작업환경은 Pycharm , Jupyter notebook 을 썼으며 , 주된 작업은 Jupyter notebook 에서 하고 


완성된 코드는 Pycharm에서 정리를 하면서 해보았다.


코드를 통해서 확인해 본다 .




먼저 필요한 라이브러리를 로딩시켜준다.

import urllib.parse
import requests

parse는 url을 다룰때 변환할 때 사용할 것이다.

requests는 말 그대로 req 할 때 사용할 것이다.




다음은 우리가 사용할 url 을 변수에다가 저장시켜준 것이다.

내가 사용한 Steamspy 에서 제공한 api 는 특정 게임의 이름을 입력받아서 출력해 주는 메소드의 기능은 없었다.

그래서 , 특정 태그를 입력을 받았으며 , 태그를 통해서 얻을 수 있는 response에는 tags , language를 포함하고 있지 않았다.


그렇기 때문에 나는 , 2개의 api 메소드를 이용해야 했다.

게임의 자세한 정보는 appdetails&appid 를 통해서 얻을 수 있는데 , steamspy에서 appid는 규칙이 불규칙적이며 , 내가 그 appid를 유추하기 힘들었기 때문에 , tag 검색을 통해서 얻어진 appid를 기반으로 appdetails&appid 를 통해서 게임의 tags, language를 얻어 올 수 있었다.

# Steamspy API Get
main_api = "http://steamspy.com/api.php?request=tag&tag"

Searching_tags = "http://steamspy.com/api.php?request=appdetails&appid="




다음은 , 사용자에게 특정 태그를 입력받는 입력이다 ( 추후에 한글버전도 추가할 것이다 ) 

print("찾고자 하는 game 태그를 입력해 주세요.(영문)")

Userinput = input()




다음은 , 우리가 위에서 선언해준 api 주소에 urlencode를 통해서 url 변수를 만든다 . 

그리고 url 변수를 req.get 으로써 request 를 하고 이 형태를 json형태로 받아온다 

# main_api 에다가 사용자가 입력한 값을 encode해서 덧 붙여준다
url = main_api + urllib.parse.urlencode({'=':Userinput})


# url 요청을 json 형태로 받아온다 .
json_data = requests.get(url).json()




이렇게 받아온 json_data 를 확인해 보니 , 이중 딕셔너리 형태였다.

이중 딕셔너리 형태는 key : value 값으로 이루어 지는데 , 여기서 이 key값이 불규칙적이기 떄문에 

특정 변수에 key값을 넣어 주어야 했다.

# 받아온 json 데이터가 이중 딕셔너리 형태이고 , 가져온 키값들이 규칙적인게 아니라
# 특정 appid 를 가지고 있다 . 그렇기 때문에 , key값만 빼서 따로 keys라는 변수에 저장시켜준다.
keys = [key for key in json_data]




다음 코드를 보면 for문으로써 출력을 한 형태이다.

다음 코드를 보면 위에서 왜 keys 라는 변수를 썼는지 알 수 있을 것이다.


내가 가져온 특정 태그의 response 의 parameter들은 이중 딕셔너리이며 , key 값이 불규칙적이기 때문에 , 

받아온 data의 크기만큼 for문을 돌리고 , 각 key값들은 배열의 주소값으로써 순서대로 저장되어 있기 때문에 , 

그 배열에 저장된 key값에 따라 내가 원하는 정보를 따로 걸러낼 수 있었다.

for문내에는 위에서 말한 2개의 api중 하나인데 , 이 api는 json_data의 appid의 값을 기반으로 api_requests를 한다.


위 url과는 다르게 str 로써 key값을 붙여주었는데 , 여기서의 appid는 숫자의 형태이기 때문에 , 문자열로만 형변환을 해주었다.


for Count in range(0,len(json_data)):

url2 = Searching_tags + str(keys[Count])
json_data2 = requests.get(url2).json()

print("game_appid : " + keys[Count])
print("================================")
print("game_name : " + json_data[keys[Count]]['name'])
print("================================")
print("game_score_rank : " + str(json_data[keys[Count]]['score_rank']))
print("================================")
print("game_userscore : " + str(json_data[keys[Count]]['userscore']))
print("================================")
print("game_owners : " + str(json_data[keys[Count]]['owners']))
print("================================")
print("game_All_tags : " + str(json_data2['tags']))
print("================================")
print("game_languages : " + str(json_data2['languages']))




출력화면은 다음과 같다.


먼저 , 사용자의 입력을 받는다 


사용자의 입력을 통해 다음과 같은 결과값들이 나온다.


위 처럼 나오게 되는데 , tags는 이쁘게 출력되지 않았는데 , 이 점은 추후 고칠 것이다.

그리고 영문 뿐만아니라 한글도 되면 좋을것 같다는 생각이 든다 . 



반응형