g2g-crawling06: div.noresult-main-title

div.noresult-main-title 업데이트(20220304)

크롤링하는 페이지에 새로운 문제가 발생했다.

div.noresult-main-title 태그로 인해 server랑 currency 값을 불러올 수 없었다.

noresult

URL에서 가져올 수 있겠지만 우선 함수를 빠져나가는 방식으로 업데이트 했다.

1
2
3
4
5
6
def get_data():
...

if (soup.find("div", class_="noresult-main-title").string == "The offer you try to view is no longer available."):
driver.close()
return False

if return을 추가하니 해당 페이지가 정상 title로 복구됐다… 작동 확인도 못해봤다.

g2g-crawling05: 엑세스 키 관리 문제

엑세스키 노출

파일 하나에서 함수를 모두 관리했었고, 당연 문제가 됐다.

이전 업데이트 때 깜빡하고 GCP acc 키가 제거되지 않은 상태로 push 해버린 것.

조취(20220303)

당장 연결 권한을 바꿔야한다.
그 이후, 같은 실수가 발생하지 않도록 관리방법이 추가되야한다.

불특정된 사람들이 깃헙을 유심히 볼만한 정도는 아니라 다행이라 생각한다.

엑세스키 제거 후 재발급

commit을 일일히 삭제하는 방법을 생각했지만, 어딘가엔 데이터가 남을 가능성이 있어 GCP에서 서비스 키를 새로 발급받았다.

이걸로 일단 노출된 키로 접근하는 불상사는 막았다.

새로운 py 파일 생성

source를 계속 업데이트 한다면 역시 까먹어도 문제 없도록 엑세스 함수를 숨기거나 따로 관리해야한다.

기존에 사용하던 crawl_URL_boost.py에서 SQL에 접근하는 데이터가 들어있는 connecting, dataInsertPsycopg2, accGBQ을 crawl_acc_sql.py 파일로 옮겨 개인 모듈로 관리한다.

crawl_acc_sql.py에 사용되는 모듈들을 boost에서 옮겨담는다.

crawl_acc_sql.py
1
2
3
4
5
import pandas_gbq
import psycopg2
from psycopg2 import connect, extensions
import psycopg2.extras as extras
from google.oauth2 import service_account

crawl_URL_boost.py에는 crawl_acc_sql 모듈을 추가함에 따라 기존 함수들도 모듈에 맞춰 수정했다.

crawl_URL_boost.py
1
2
3
4
5
6
7
8
9
import crawl_acc_sql as accsql


if __name__ == "__main__":

conn = accsql.connecting()
accsql.dataInsertPsycopg2(conn, data=df)

accsql.accGBQ(df)

혹시 모를 에러를 대비해 .backup 로컬 폴더에 수정된 날짜를 파일명에 추가해 이전 버전을 백업했다.

새로운 sql을 추가하지 않는 이상 crawl_acc_sql.py를 편집할 일은 없으므로 계정 키를 항상 지워서 업로드해야하는 불편함이 줄었다.

내부링크

g2g-crawling04: 동적페이지 로드 문제 발생

동적 페이지 자동 크롤링을 새벽마다 돌리면서 URL이 변경되지 않는 동작의 경우 요소를 찾을 때 까지 대기하는 코드가 때때로 에러를 일으킨다.

다음에 error가 식별됐을 때 Error 명을 식별해서 try - except 구문으로 예외처리하고 time.sleep 함수를 넣어준 다음 try 재귀 함수를 돌리는 코드를 추가 작성해 업데이트할 예정이다.

try & 재귀함수 추가(20220228)

get_data() 함수에 try - except로 구성된 재귀함수 try_clickable()을 추가했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def get_data():

def try_clickable(xpath_name):
try:
i = 0
soup = soup_wait_clickable(xpath_name)

seller.extend(get_data_seller(
"a.flex.prechekout-non-produdct-details > div.seller-details.m-l-sm > div.seller__name-detail"))
price.extend(get_data_seller(
"div.hide > div > div > div > div > div > span.offer-price-amount"))
stock.extend(get_data_stock())
except IndexError as e:
i += 1
print(e+str(i))
time.sleep(1)
soup = try_clickable(xpath_name)
return soup

클릭 동작이 들어간 soup_wait_clickable 부분만 업데이트 했지만, 만약 클릭 동작이 필요없는 페이지에서도 IndexError가 발생한다면 앞부분에도 추가해야한다.

getdata[함수] 요소 추가(20220304)

다른 문제로 데이터를 재확인하다가 중복 데이터가 지난 업데이트인 2월 28일부터 들어있음을 확인했다.

1
SELECT * FROM poe where date = '2022-03-04' order by currency, server, seller;

으악 아니야

일단 당장 새로 갈아끼울 수 있는 3/4 데이터만이라도 삭제한다

1
2
3
4
5
--PostgreSQL
delete from poe where date = '2022-03-04';

--GBQ
delete from DB_G2G.poe where date = '2022-03-04';

ㅈ됨. 나중에 데이터를 쓸 때 2/27이나 3/4 데이터를 사용해서 어떻게든 처리해야겠지

처음 문제는 time.sleep() 값이 부족한줄 알고 4까지 넣어봤지만 여전히 중복 데이터가 들어갔다.
아무래도 get_data에서 처리하는 soup 변수가 문제있는거같다.
28일에 백업해둔 코드를 실행해보고 문제가 발생하지 않아 확신했다.

try 함수를 넣으면서 soup의 위치가 get_data.try_clickable()로 들어감..
기존 soup는 get_data()에 위치했으며, get_data.get_data_seller(selector) or get_data.get_data_stock()에 적용 시 문제 없이 get_data의 soup로 들어갔다.

하지만 이제 내가 넣어야하는 soup는 get_data.try_clickable() 아래에 있는 soup를 넣어야했다.

따라서 getdata 함수를 아래와 같이 요소를 추가했다.

1
2
3
4
5
def get_data():
def get_data_seller(soup,selector):
...
def get_data_stock(soup):
...

마찬가지로 getdata 함수를 사용하는 구문에도 soup 요소를 추가했다.

2022-02-28 ~ 2022-03-03 오또케…

외부링크

g2g-crawling03: G2G poe 현거래 매물 수집시작

저번 토요일(02/05) poe 리그 시작일에 맞춰 한국시간 06시마다 매일 현거래 매물 데이터를 postSQL과 GBQ에 수집중이다.

postSQL

pandas_gbq python과 google bigquery 연동하기

GBQ

2, 3 시즌 이상 데이터가 쌓이면 반복되는 데이터로 머신 러닝을 돌려 유저가 빠지는(혹은 매물이 폭락하는) 기간을 예상할 수 있을 것이다.

그 전에 google data studio를 이용해서 대쉬보드도 관리할 예정이다.

g2g-crawling01: 크롤링 g2g 종목 선정

현거래 매물 크롤링을 통해 얻을 수 있는 정보는 간단하게 가격 범위와 판매자 인원으로 볼 수 있다.

판매 가격은 대쉬보드로 활용할 수 있을거 같다.

하지만 결국 어느 시점에 게임(혹은 신규 컨텐츠)의 수명이 어느 순간까지 지속되는지 예측하는 등 프로모션, 마케팅적으로 아웃풋이 나오는게 중요하다.
따라서 신규 컨텐츠 출시 간격이 나름 규칙적인, 그리고 신규 컨텐츠 발매마다 서버가 초기화되서 재화 가치도 고정되지 않는 게임인 POE에 대한 현거래 data를 크롤링하기로 했다.

전 세계가 공유하고 모드만 바뀌는 서버 구성이므로 모든 서버를 수집할 예정이고, 시각화 혹은 예측 모델을 만들 때 업자 매물을 제거하기 편하게 리그가 종료된 시점에도 수집을 계속한다.

신규 컨텐츠가 나올 때 항상 20:00 UTC(05:00 KOR)에 서버가 열리므로 1시간 뒤인 새벽 6시에 매일 수집한다.

외부링크

g2g-crawling00: javascript 동적페이지 크롤링

현거래 매물 거래 현황을 수집하려 한다.
전 세계를 대상으로하는 게임의 거래 데이터를 수집할 예정이니 세계 규모의 사이트 중 유명한 현거래 사이트인 G2G를 크롤링할 예정이다.

G2G를 크롤링 하는데 request로 html을 가져오니 사이트 구조만 긁어오고 텍스트 내용이 들어간 태그들은 가져오지 못했다.

문제는 request의 경우 사이트에서 바로 html 코드를 긁어오기 때문에 유저의 행동에 따라 혹은 서버에서 요청을 받고 정보를 불러오는 javascript 동적페이지에 대한 대응을 할 수 없던거였다.

my work

외부링크