기상청 hp 들어가서 끝에 robots.txt를 붙이면 사용할 수 있는지 알 수 있는데 User-Agent는 *(모두) 사용 가능하고 Allow:/은 /가 보통은 상위를 이야기 하기 때문에 거의 뭐 다 사용하능하다고 보면 됨
import requests as req
from bs4 import BeautifulSoup as bs #정적웹용
url = "<https://www.weather.go.kr/w/weather/forecast/short-term.do?stnId=159>"
# headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36 Edg/133.0.0.0'}
web = req.get(url)
soup = bs(web.content, 'html.parser')
#위에서 여기까지 쭉 적어주기
# print(soup)
summary = soup.select('p.summary')
# print(summary) #배열로 가져옴
# print(summary.text)-> 이터러블해서 바꿀 수 없다함 오류남
# print(summary[0].text) -> 이렇게 적으면 겉의 대괄호가 벗겨지면서 해결 가능
for s in summary:
print(s.text.replace('○','\\n○'))
□ (종합) 대기 매우 건조, 기온 낮아 춥겠음, 강풍 및 풍랑 유의
○ (오늘, 21일) 구름많다가 오후에 맑아짐
○ (내일, 22일) 대체로 맑음
○ (모레, 23일) 대체로 맑겠으나, 경남서부내륙 가끔 구름많음
○ (글피, 24일) 대체로 맑음
# tb = soup.select_one('.table-col')
tb = soup.select('.table-col')[0]
# print(tb[0].text)
# print(tb.text)
data = tb.select('tr')
# print(data)
header = data[0].select('th')
line1 = ['최저기온'] + data[1].select('td')
line2 = ['최고기온'] + data[2].select('td')
raw_data = []
# print(header)
# print(line1)
# print(line2)
for h, l1, l2 in zip(header,line1,line2):
try:
out = h.text+': '+l1.text+' / '+l2.text
# raw_data.append(h.text, ':', l1.text, '/', l2.text) 원래는 이렇게 해야하는데 중복되니까 finally를 써도 됨
except:
out = h.text+' :'+l1+' / '+l2
# pass
finally:
print(out)
raw_data.append(out)
->예보요소 :최저기온 / 최고기온
평년(오늘): -5.1 ~ 2.1 / 9.0 ~ 11.7
어제(20일): -9.7 ~ -2.0 / 4.4 ~ 8.8
오늘(21일): - / 3 ~ 7
내일(22일): -7 ~ -3 / 4 ~ 7
모레(23일): -8 ~ -3 / 1 ~ 5
글피(24일): -9 ~ -4 / 5 ~ 8
import pandas as pd
# print(raw_data)
# 데이터 파싱작업
parsed_data = []
for entry in raw_data[1:]:
# print(entry.split(':'))
date, temps = entry.split(':')
low_temp, high_temp = temps.split('/')
parsed_data.append([date.strip(),low_temp.strip(),high_temp.strip()])
# parsed_data
#데이터프레임 생성
df = pd.DataFrame(parsed_data, columns=['날짜','최저기온','최고기온'])
# df.to_csv('weather.csv',index=False, encoding='utf-8') -엑셀에서 글자깨짐
df.to_csv('weather_x.csv',index=False, encoding='utf-8-sig')
=========================================
df = pd.DataFrame( [entry.split(':')[0].strip(),*entry.split(':')[1].strip().split('/')] for entry in raw_data[1:])
df.columns=['날짜','최저기온','최고기온']
df
위 아래 코드 같은거임
판다스 사용하면 이런 결과를 얻을 수 있음
서로 다른 함수나 모듈이 최소한의 의존성을 가지도록 설계하는 개념 이는 소프트웨어 개발에서 중요한 원칙 중 하나로 유지보수성과 확장성을 놓이는 데 도움을 줌
느슨한 연결의 특징
독립성(Independence) 한 함수가 다른 함수의 내부 구현을 몰라도 사용할 수 있음 특정 함수가 변경되어도 다른 함수에 미치는 영향이 적음
유지보수성(Maintainability) 함수 간 의존성이 낮아 수정이 용이함 코드 변경 시 예상치 못한 오류가 발생할 가능성이 낮음
재사용성(Reusability) 특정 기능을 하는 함수를 여러 곳에서 쉽게 활용할 수 있음 코드 중복을 줄이고 재사용 가능한 모듈을 만들 수 있음
텍스트 용이성(Testability) 독립적인 함수들은 단위 테스트(Unit Test)가 쉽고 효과적으로 가능함 의존성이 적기 때문에 특정 기능만 검증할 수 있음
우리 팀 서버 ssh pkteam@pdata.iptime.org -p 221 1234
서버 스푸핑 당하면
확인하고 rm known * 파일이름 어쩌고를 하면 된다
pkteam@TEAM01:~$ python3 -V
Python 3.10.12
pkteam@TEAM01:~$ pip3 -V
pip 22.0.2 from /usr/lib/python3/dist-packages/pip (python 3.10)
pkteam@TEAM01:~$ pip -V
pip 22.0.2 from /usr/lib/python3/dist-packages/pip (python 3.10)
pkteam@TEAM01:~$ pip install python-telegram-bot
PS C:\\Users\\Admin> ssh pkteam@pdata.iptime.org -p 221
pkteam@pdata.iptime.org's password:
Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.167.4-microsoft-standard-WSL2 x86_64)
* Documentation: <https://help.ubuntu.com>
* Management: <https://landscape.canonical.com>
* Support: <https://ubuntu.com/pro>
pkteam@TEAM01:~$ ssh pkteam@pdata.iptime.org -p 221
pkteam@pdata.iptime.org's password:
Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.167.4-microsoft-standard-WSL2 x86_64)
* Documentation: <https://help.ubuntu.com>
* Management: <https://landscape.canonical.com>
* Support: <https://ubuntu.com/pro>
pkteam@TEAM01:~$ python3 -V
Python 3.10.12
pkteam@TEAM01:~$ pip3 -V
pip 22.0.2 from /usr/lib/python3/dist-packages/pip (python 3.10)
pkteam@TEAM01:~$ pip -V
pip 22.0.2 from /usr/lib/python3/dist-packages/pip (python 3.10)
pkteam@TEAM01:~$ pip install python-telegram-bot
pkteam@TEAM01:~$ cat <<'end'> bot_pmj.py
> from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters, CallbackContext
import talk_pmj as tk
TOKEN = '7724568279:AAHGYVXEDLbGdRduaJxMrfGSX7lvwuh9QRw'
# TRIGGER_WORDS = {
# '안녕':'안녕하세요! 반가워용😊',
# '정보':'어떤 정보가 필요하세요?🤔',
# '기분':'오늘 기분이 좋아요😍'
# }
async def start(update, context):
await update.message.reply_text('안녕! 무엇을 도와드릴까요?')
async def monitor_chat(update, context):
user_text = update.message.text # 감지된 메시지들 ex.택배물건
chat_id = update.message.chat_id # 메시지가 온 채팅방 ex. 택배 배송지
for key, res in tk.TRIGGER_WORDS.items():
if key in user_text:
await context.bot.send_message(chat_id = chat_id, text = res)
break #한개의 키워드에만 반응
def main():
app = Application.builder().token(TOKEN).build()
# 명령어 핸들러 추가
app.add_handler(CommandHandler('start',start))
# 응답 핸들러 추가
main()__=='__main__':니다. 모니터링 중...')T & ~filters.COMMAND, monitor_chat))
> end
pkteam@TEAM01:~$ ls
bot_ajm.py bot_kys.py bot_lkj.py bot_pmj.py bot_yjs.py data
pkteam@TEAM01:~$ mv bot_pmj.py ./data
pkteam@TEAM01:~$ ls
bot_yjs.py data
pkteam@TEAM01:~$ cd data
pkteam@TEAM01:~/data$ ls
bot_ajm.py bot_kys.py bot_lkj.py bot_pmj.py bot_yjs.py nodered
pkteam@TEAM01:~/data$ cd ..
pkteam@TEAM01:~$ ls
data
pkteam@TEAM01:~$ cd data
pkteam@TEAM01:~/data$ nano bot_pmj.py
pkteam@TEAM01:~/data$ cat <<'end'> talk_pmj.py
> from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters, CallbackContext
import talk_pmj as tk
TOKEN = '7724568279:AAHGYVXEDLbGdRduaJxMrfGSX7lvwuh9QRw'
# TRIGGER_WORDS = {
'안녕':'안녕하세요! 반가워용😊',
'정보':'어떤 정보가 필요하세요?🤔',
'기분':'오늘 기분이 좋아요😍'
}
async def start(update, context):
await update.message.reply_text('안녕! 무엇을 도와드릴까요?')
async def monitor_chat(update, context):
user_text = update.message.text # 감지된 메시지들 ex.택배물건
chat_id = update.message.chat_id # 메시지가 온 채팅방 ex. 택배 배송지
for key, res in tk.TRIGGER_WORDS.items():
if key in user_text:
await context.bot.send_message(chat_id = chat_id, text = res)
break #한개의 키워드에만 반응
def main():
app = Application.builder().token(TOKEN).build()
# 명령어 핸들러 추가
app.add_handler(CommandHandler('start',start))
# 응답 핸들러 추가
main()__=='__main__':니다. 모니터링 중...')T & ~filters.COMMAND, monitor_chat))
> end
pkteam@TEAM01:~/data$ cat <<'end'> talk_pmj.py
pkteam@TEAM01:~/data$ nano bot
pkteam@TEAM01:~/data$ nano bot_pmj.py
pkteam@TEAM01:~/data$ cat talk_pmj.py
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters, CallbackContext
import talk_pmj as tk
TOKEN = '7724568279:AAHGYVXEDLbGdRduaJxMrfGSX7lvwuh9QRw'
# TRIGGER_WORDS = {
# '안녕':'안녕하세요! 반가워용😊',
# '정보':'어떤 정보가 필요하세요?🤔',
# '기분':'오늘 기분이 좋아요😍'
# }
async def start(update, context):
await update.message.reply_text('안녕! 무엇을 도와드릴까요?')
async def monitor_chat(update, context):
user_text = update.message.text # 감지된 메시지들 ex.택배물건
chat_id = update.message.chat_id # 메시지가 온 채팅방 ex. 택배 배송지
for key, res in tk.TRIGGER_WORDS.items():
if key in user_text:
await context.bot.send_message(chat_id = chat_id, text = res)
break #한개의 키워드에만 반응
def main():
app = Application.builder().token(TOKEN).build()
# 명령어 핸들러 추가
app.add_handler(CommandHandler('start',start))
# 응답 핸들러 추가
# ~은 TEXT는 하되, COMMAND는 하지마라
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, monitor_chat))
print('봇이 실행중입니다. 모니터링 중...')
app.run_polling()
if __name__=='__main__':
main()
pkteam@TEAM01:~/data$ python3 bot_pmj.py
Traceback (most recent call last):
File "/home/pkteam/data/bot_pmj.py", line 3, in <module>
import talk_db_pmj as tk
File "/home/pkteam/data/talk_db_pmj.py", line 3, in <module>
import talk_db as tk
ModuleNotFoundError: No module named 'talk_db'
pkteam@TEAM01:~/data$ python3 -m venv venv_pmj
The virtual environment was not created successfully because ensurepip is not
available. On Debian/Ubuntu systems, you need to install the python3-venv
package using the following command.
apt install python3.10-venv
You may need to use sudo with that command. After installing the python3-venv
package, recreate your virtual environment.
Failing command: /home/pkteam/data/venv_pmj/bin/python3
pkteam@TEAM01:~/data$ sudo apt install python3.10-venv
[sudo] password for pkteam:
pkteam@TEAM01:~/data$ python3 -m venv venv_pmj
pkteam@TEAM01:~/data$ . venv_pmj/bin/activate
-bash: venv_pmj/bin/activate: No such file or directory
pkteam@TEAM01:~/data$ . ./venv_pmj/bin/activate
-bash: ./venv_pmj/bin/activate: No such file or directory
pkteam@TEAM01:~/data$ rm -rf venv_pmj
pkteam@TEAM01:~/data$ ls
__pycache__ bot_kys.py bot_pmj.py nodered talk_db_pmj.py talk_lkj.py venv_kys
bot_ajm.py bot_lkj.py bot_yjs.py talk_ajm.py talk_kys.py venv_ajm venv_yjs
pkteam@TEAM01:~/data$ python3 -m venv venv_pmj
pkteam@TEAM01:~/data$ . venv_pmj/bin/activate
(venv_pmj) pkteam@TEAM01:~/data$ nano bot_pmj.py
(venv_pmj) pkteam@TEAM01:~/data$ cat <<'end'> bot_pmj.py
> from telegram import Update
> cat <<'end'> bot_pmj.pyication, CommandHandler, MessageHandler, filters, CallbackContext
> cat <<'end'> bot_pmj.py^C
(venv_pmj) pkteam@TEAM01:~/data$ nano bot_pmj.py
(venv_pmj) pkteam@TEAM01:~/data$ ls
__pycache__ bot_kys.py bot_pmj.py nodered talk_db_pmj.py talk_lkj.py venv_ajm venv_lkj venv_yjs
bot_ajm.py bot_lkj.py bot_yjs.py talk_ajm.py talk_kys.py talk_yjs.py venv_kys venv_pmj
(venv_pmj) pkteam@TEAM01:~/data$ rm talk_db_pmj.py
(venv_pmj) pkteam@TEAM01:~/data$ cat <<'end'> talk_pmj.py
> TRIGGER_WORDS = {
'안녕':'안녕하세요! 반가워용😊',
'정보':'어떤 정보가 필요하세요?🤔',
'기분':'오늘 기분이 좋아요😍'
}
> end
(venv_pmj) pkteam@TEAM01:~/data$ python3 bot_pmj.py
(venv_pmj) pkteam@TEAM01:~/data$ python3 bot_pmj.py
봇이 실행중입니다. 모니터링 중...
No error handlers are registered, logging exception.
^[[A^[[B^C(venv_pmj) pkteam@TEAM01:~/data$ python3 bot_pmj.py
봇이 실행중입니다. 모니터링 중...
PS C:\\Users\\Admin> ssh pkteam@pdata.iptime.org -p 221
pkteam@pdata.iptime.org's password:
Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.167.4-microsoft-standard-WSL2 x86_64)
* Documentation: <https://help.ubuntu.com>
* Management: <https://landscape.canonical.com>
* Support: <https://ubuntu.com/pro>
pkteam@TEAM01:~$ . venv_pmj/bin/activate
-bash: venv_pmj/bin/activate: No such file or directory
pkteam@TEAM01:~$ ls
data
pkteam@TEAM01:~$ cd
pkteam@TEAM01:~$ ls
data
pkteam@TEAM01:~$ cd data
pkteam@TEAM01:~/data$ . venv_pmj/bin/activate
(venv_pmj) pkteam@TEAM01:~/data$ python3 bot_pmj.py
봇이 실행중입니다. 모니터링 중...