누구나 할 수 있는 크롤링 #2

Eugene Lim
8 min readJul 20, 2024

--

python 설치, 실제로 parsing 하는 부분은 1편 참고

슬랙 워크스페이스 만들기

이제 슬랙 워크스페이스를 하나 만든다. 그 다음 핸드폰에 슬랙앱을 깔고 아까 만들어둔 워크스페이스를 등록해두면 슬랙봇을 메시지가 왔을 때, 푸시 알림까지 받을 수 있다.

우리는 슬랙 web hook api를 사용할 예정이다. 아래 링크로 접속해서 설정 가이드를 따른다

  1. 슬랙 워크스페이스를 만들고
  2. Enable incoming webhooks 설정한다
    dashboard로 이동해서, “Create New App” 버튼을 클릭한다
  3. From scratch 선택

4. 다음 화면에서 내가 만들 앱(슬랙봇)의 이름을 적고

5. 아래 Select a workspace를 선택하면 내가 방금 만들었던 workspace를 선택한다.

6. 다음 화면에서 “Incoming Webhooks”를 선택한다

7. Activate Incoming Webhooks -> ON으로 켜주고

8. ON으로 켜면 테스트할 수 있는 커맨드를 준다. 한 번 테스트 해보려고 하는데, {YOUR_WEBHOOK_URL_HERE} 뭔가 넣어줘야 하는 것 같다.

아래에 보면 채널을 연결해줘야한다.

curl -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}' YOUR_WEBHOOK_URL_HERE

General 채널을 연결해주고 돌아오면 테스트커맨드가 갱신되어 있는 것을 확인할 수 있다. 커맨드를 실행해보자.

만약 슬랙앱도 설치해두었다면, 이렇게 메시지가 오는 것을 확인할 수 있다.

9. 이제 이전 시간에 만들었던 코드에서 직접 slack api를 호출해보자. 우리는 이미 requests 라이브러리를 쓰고 있기 때문에 슬랙메시지를 쏘는 함수도 쉽게 만들 수 있다.

def send_message_to_slack(message):
slack_url = "{아까 설정했던 slack webhook url}"
headers = {
'Content-Type': "application/json",
}
slack_data = {
"text": message
}
response = requests.post(
slack_url,
data=json.dumps(slack_data),
headers=headers
)
print(response)

send_message_to_slack("test message") # 한 번 테스트 해보자!

이제 내가 원하는 데이터를 slack message로 만들어서 보내기만 하면 된다.
discount ≥ 30 이라는 조건을 넣어서 한 번 슬랙 메시지로 쏴보자.

if discount >= 30:
send_message_to_slack(str(name) + '\n' + str(sale) + '\n' + str(discount) + '%', "")

구현은 끝난 것 같다. 이제 특정 시간대에 이 함수를 한 번 실행하게 하는 자동화도 추가할 예정이다.

full code 보기 >>

Firebase Function 에 올려보자

먼저 firebase에 계정을 만들고, 새 프로젝트도 하나 만든다.

왼쪽 메뉴 -> 모든 제품 -> Functions 선택

“프로젝트 업그레이드" 클릭해서 Blaze 요금제로 올린다. 과금이 될 수 있는데 한달에 몇백원 수준으로 나오므로 테스트비용으로는 나쁘지 않을 듯하다.

Function을 쓰려면 Cloud Firestore도 사용해야하므로 여기도 설정해준다.

기본옵션으로 한다

Firebase Console Client 설치하기

macos는 brew로 설치하기를 권장한다.

$ brew install firebase-cli
.. 설치가 끝나면
$ firebase login # 크롬브라우저가 뜨고, firebase를 만들었던 계정으로 로긴함
$ firebase projects:list # 만들었던 프로젝트를 확인한다

이제 function으로 올릴 디렉토리를 만들고 파이어베이스를 사용하기 위해 준비를 한다

$ firebase init
Firestore, Functions 두 개를 선택(스페이스)하고 다음(엔터)
우리는 이미 프로젝트를 만들었으므로 기존 프로젝트 선택
Python 선택

그 이후 모두 기본옵션으로 선택하면 프로젝스 설정이 끝난다. 그리고 디렉토리를 들어가보면 파일이 만들어져있는 것을 볼 수 있다.

vscode에서 이 디렉토리를 열고 아까 우리가 작업했던 내용을 넣어준다.

  1. 우리가 사용하는 라이브러리명시
    requirements.txt 파일에 다음을 추가한다.
firebase_functions~=0.1.0
requests==2.31.0
beautifulsoup4==4.12.2

2. 앞에서 작업했던 파일을 옮겨온다. 파일명을 “my_spider.py”로 추가했다.

3. main.py를 열어보면 이미 코드가 몇 줄 있다.

# Welcome to Cloud Functions for Firebase for Python!
# To get started, simply uncomment the below code or create your own.
# Deploy with `firebase deploy`
from firebase_functions import https_fn
from firebase_admin import initialize_app
from my_spider import check_web # 우리가 작성했던 파일과 함수명
from firebase_functions import scheduler_fn # scheduler를 쓰기 위해 추가

initialize_app() # 주석을 제거해준다
#
#
# @https_fn.on_request()
# def on_request_example(req: https_fn.Request) -> https_fn.Response:
# return https_fn.Response("Hello world!")

# 매일 오전 9시 호출하도록 설정했다
@scheduler_fn.on_schedule(
schedule="every day 09:00",
timezone=scheduler_fn.Timezone("Asia/Seoul"),
)
def schedule_crawling(event: scheduler_fn.ScheduledEvent) -> None:
check_web() # 우리가 만들어둔 함수 호출한다

이렇게 작업은 끝났다.

서버에 올려보자.

$ firebase deploy

--

--