TIL 200306

조양권·2021년 5월 17일

TIL

목록 보기
11/24

1. 오늘

  • 검색 기능 구현중 검색 기반 데이터가 필요해 스팀의 모든 게임을 크롤링해왔다.

  • 총 7만여개의 데이터를 페이지당 표시하는 데이터수 25로 나누어 반올림해 최대 페이지수를 구했다.

url_for_page = 'https://store.steampowered.com/search/?ignore_preferences=1&page=1'
response_for_page = requests.get(url_for_page)
source_for_page = response_for_page.text
soup_for_page = BeautifulSoup(source_for_page, 'html.parser')
maximum_page_tag = soup_for_page.select_one('div.search_pagination_left').contents[0].strip()#총 게임수가 있는 tag
split_tag = maximum_page_tag.split('-')#'-'를 기준으로 나눔
game_per_page = split_tag[1].split('of')[0].strip()#'/'기준으로 나눔
maximum_game = split_tag[1].split('of')[1].strip()
max_page = math.ceil(int(maximum_game)/int(game_per_page))#반올림
whole_info = []
  • 기존엔 다수의 페이지를 크롤링할때 변수를 선언해 크롤링해온 페이지의 텍스트를 해당 변수에 할당한후 해당 변수에서 필요한 태그를 찾아 크롤링해왔다.
  • 페이지수가 이천개가 넘어가자 위와 같은 방법으로 2000개가량의 페이지를 전부 저장하려니 memory_error가 발생했다. whole_source라는 배열선언후 페이지 전체가 아닌 필요 값만 whole_source에 할당했다.
whole_source = []
for game in games:
        if game.select_one('div > div > div.search_discount > span') != None:#할인중인 게임에만 있는 tag
            game_title = 'not found'
            game_link = 'not found'
            game_original_price = 'not found'
            game_img = 'not found'#해당게임은 이미 db에 있으므로 저장하지않는다.

        else:
            game_title = game.select_one('div > div > span.title').text
            game_original_price = game.select_one('div > div > div.search_price').text.replace('₩', '',1).strip().replace(',','')
            game_link = game['href']
            game_img = game.select_one('div > img').get('src')

    
whole_info.append(game_link, game_img, game_title, game_original_price)#필요한 값만 배열에 추가
  • api 중 krw로 표시된 게임과 달리 usd로 표시된 게임은 정렬의 용이함을 위해 usd가격을 krw로 환전한 부분이 있다. 이에 따라 usd 게임은 가격이 krw표기와 usd표기로 두개로 나뉘었다.
  • 하지만 사이트에 표시할때에는 usd표기로 표시해야 하므로 usd인 field값이 필요했다.
for s in db.info.find({"original_price_usd":{"$exists":True}}):
  • db에 해당 key 값이 있는지 체크하는 ‘$exists’:True를 사용했다.
  • 하지만 find는 커서값을 기준으로 ()안의 조건을 만족한 data를 찾아준다.
  • 커서는 MongoDB가 find() 를 통해 넘겨주는 결과의 집합이다.
  • 커서를 통해 클라이언트-사이드에서는 반복 처리 등 다양한 처리가 가능하다. DB가 넘겨주는 결과수를 제한할 수 있으며, 결과의 개수를 건너뛸 수 있으며, key 조합을 통해 결과를 분류하거나 검색 방향을 제어할 수 있다.
profile
할 수 있는 것이 늘어나는 즐거움

0개의 댓글