기본적인 apod 기능을 구현하기 위해 웹 크롤링 파트 구현을 하였다.
1. 구현한 기능
~apod라는 명령어를 입력하면, 그 날의 apod 정보를 크롤링해서 메시지를 보낸다. 가시성을 위해 discord의 embed 형식을 사용하였다.
2. 구현 코드 및 설명
크롤링 방법 자체는 여러 웹사이트에도 나와있지만, 나는 BeautifulSoup4를 사용했다. 아래의 공식문서를 주로 참고하면서, 필요할 경우 구글링을 하였다.
전체 코드는 다음과 같다. 기능 구현에만 초점을 두었기 때문에, 아직 번잡하다.
import discord
import requests
from bs4 import BeautifulSoup
bot_token = '봇 토큰'
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)
url = "https://apod.nasa.gov/"
response = requests.get(url)
@client.event
async def on_ready():
print(f'Logged in as {client.user.name}')
@client.event
async def on_message(message):
if message.author == client.user:
return
#~apod
if message.content('~apod'):
#~apod today
response.encoding = 'utf-8' #인코딩 설정
response_html = response.text #html 파일 추출
response_soup = BeautifulSoup(response_html, features='lxml') #soup 객체로 변환
apod_date = response_soup.body.center.p.next_sibling.get_text().replace("\n", "")
apod_title = response_soup.select_one('center > b').get_text()
apod_explanation = response_soup.select_one('body > p').get_text().replace("\n", " ")[14:]
apod_image = response_soup.select_one('body center p a img')['src']
apod_embed = discord.Embed(title="Astronomy Picture of the Day", url="https://apod.nasa.gov/", description=f"{apod_date}")
apod_embed.set_image(url="https://apod.nasa.gov/apod/" + apod_image)
apod_embed.add_field(name=apod_title, value=apod_explanation)
await message.channel.send(embed = apod_embed)
#~apod YY-MM-DD
if message.content("~apod 00-00-00"):
print()
#~apod alarm
if message.content("~apod alarm"):
print()
#~apod help
if message.content("~apod help"):
print()
client.run(bot_token)
기본적인 크롤링 과정은 다음과 같다.
0. robots.txt 확인하기
크롤링 전, 해당 사이트가 크롤링을 금지하고 있는지 확인한다. 꼭 지켜야 하는 건 아니지만, 웹사이트에서 권장하는 방식이 무엇인지 확인하기 위해 가능하면 크롤링 전 한 번 보고 넘어가는 편이다.
apod 사이트는 모든 페이지에 대한 접근을 허용한다.
1. requests 모듈로 GET 요청 보내기
url = "https://apod.nasa.gov/"
response = requests.get(url)
requests 모듈을 사용해 웹사이트에 GET 요청을 보낸다. response에는 상태 코드(200, 404...)와 html이 포함되어 있다.
2. GET한 결과인 response에서 html 코드를 가져와 BeautifulSoup 객체를 생성한다.
response.encoding = 'utf-8' #인코딩 설정
response_html = response.text #html 파일 추출
response_soup = BeautifulSoup(response_html, features='lxml') #soup 객체로 변환
3. BeautifulSoup 객체에서 필요한 내용이 들어있는 태그를 찾아가 각 변수에 할당해준다.
apod_date = response_soup.body.center.p.next_sibling.get_text().replace("\n", "")
apod_title = response_soup.select_one('center > b').get_text()
apod_explanation = response_soup.select_one('body > p').get_text().replace("\n", " ")[14:]
apod_image = response_soup.select_one('body center p a img')['src']
각 메서드에 대한 내용은 공식 문서에서 확인할 수 있다.
4. discord embed를 만든 후 원하는 대로 변수를 추가해주고, message를 보낸다.
apod_embed = discord.Embed(title="Astronomy Picture of the Day", url="https://apod.nasa.gov/", description=f"{apod_date}")
apod_embed.set_image(url="https://apod.nasa.gov/apod/" + apod_image)
apod_embed.add_field(name=apod_title, value=apod_explanation)
await message.channel.send(embed = apod_embed)
3. 참고 사이트
https://velog.io/@chaejm55/%EB%B2%88%EC%99%B82.-embed-%EC%9D%B4%EB%AF%B8%EC%A7%80
'프로젝트' 카테고리의 다른 글
[pymyrep] python pep8, docstring (0) | 2023.10.03 |
---|---|
[discord.py] 1. 기본 Discord Bot 만들기 (0) | 2023.02.19 |