Extra Form
라이선스 MIT

안녕하세요?


지난 주말에 친구의 부탁으로 정부기관 사이트(gosi.kr)를 파싱해서 텔레그램 봇으로 새글알림을 하는 코드를 짜봤습니다.


텔레그램 봇과 관련해서는 매우 허접하지만 이미 작년에도 제가 스포어에 글을 올렸기 때문에


원래 작성한 코드를 조금 변형해서 PC통신이나 텍스트 기반 브라우저처럼 열람하고 싶은 게시글 번호를 입력하면 


해당 게시글의 내용을 출력해주는 것으로 수정했습니다.


해당 웹페이지는 정부기관의 공고와 관련된 것으로서 


저작권법 등 관련법률에 저촉되지 않는다고 생각되어서 코드를 올립니다.



소스는 파이썬 3.7에서 작성되었으며 


다른 스포어 회원님들께서 기본적으로 알고계실 수준의 아주 기초적인 BeautifulSoup과 정규식을 사용했습니다.


작성하고보니 파이썬이 추구하는 아름답고 간결한 코딩과는 굉장히 거리가 멀지만 

(아스날의 아름다운 축구를 보다가 이란의 침대축구를 보는 것처럼 가슴이 답답해지는군요 -_-;;;)


일단 2018년 9월 현재 기준으로 오류 없이 돌아가는 데에 의의를 두겠습니다 ㅠㅠ


1~10까지 게시글 번호를 input으로 입력받은 후 그 문자열을 정수로 바꿔서


해당 게시글을 출력하는 부분에서 여러 유형의 오류가 발생하던데요.


len 함수와 아스키코드로 최대한 걸러내긴 했는데 제가 미처 발견하지 못한 버그가 있을 수도 있겠네요 ㅜㅜ


아쉽게도 게시글 목록의 페이지 넘김과 첨부파일 다운로드는 아직 지원하지 않습니다 T.T



제가 한가지 궁금한 점이 파싱하려는 페이지가 POST 방식으로 페이지 이동을 할 때 


저는 파이어폭스 개발자도구에서 Convert form POSTs to GETs로 URL을 알아낸 후에 


숫자 네자리로 된 파라미터를 정규식으로 파싱해서 


URL과 파라미터를 조합하는 방식으로 파싱하려는 페이지에 접근했는데요. 


상당히 조잡하고 주먹구구식 방법이지만 제 수준에서는 뾰족한 방법이 없더군요 ㅠㅠ


스포어의 고수님들께서 알고계시는 더 깔끔한 방법은 없을지 여쭤봅니다 ^^


허접한 글 읽어주셔서 감사합니다!



추신: 파이참을 추천해주신 humit 님께 감사합니다 ^-^



import urllib.request
import re
from bs4 import BeautifulSoup

url = "https://www.gosi.kr/cop/bbs/selectBoardList.do?bbsId=BBSMSTR_000000000131"
response = urllib.request.urlopen(url)

soup = BeautifulSoup(response, 'html.parser')
results = soup.select("span.nobr")

a = 1
for result in results:
    print(a, "\b. ", end='')
    print(result.string)
    a+=1

links = soup.find_all('a', href=True)
link_result = []

for link in links:
    if link.get('href') == "#":
        continue
    this = link.get('href')
    this2 = re.search('\'[1-9][0-9]{3}\'', this)
    if this2:
        link_result.append(this2.group()[1:5])
    else:
        continue


order = "m"
while order != "q" and order !="Q":
    order = input("목록(l), 나가기(q) >> ")
    if order == "l" or order == "L":
        a = 1
        for result in results:
            print(a, "\b. ", end='')
            print(result.string)
            a+=1

    elif order == "q" and order !="Q":
        print ('종료합니다.\n')

    elif len(order) > 1 and order != "10":
        print ('잘못 입력하였습니다.\n')
        continue

    elif order == "10" or (ord(order) >= 48 and ord(order) <=57):
        order2 = 0 - int(order)
        codenumber = link_result[order2]

        url1 = "https://www.gosi.kr/cop/bbs/selectBoardArticle.do;jsessionid=+xTTfDIqxVVspsCsttQPVTnn.node_cybergosiwas11?bbsId=BBSMSTR_000000000131&nttId="
        url2 = "&bbsTyCode=BBST01&bbsAttrbCode=BBSA01&authFlag=Y&examgubunPosblAt=Y&anonymous=&examGubuncd=&searchCnd=0&searchWrd=&pageIndex=1"
        url3 = url1 + codenumber + url2

        response2 = urllib.request.urlopen(url3)
        soup2 = BeautifulSoup(response2, 'html.parser')
        results2 = soup2.select("div.board_con p")

        for result2 in results2:
            print(result2.text)
 
    else:
        print ('잘못 입력하였습니다.\n')
        continue


Who's 이니스프리

profile

당분간 일신상의 사정으로 쪽지나 댓글로 답변을 드리기 어렵습니다. 죄송합니다.

 

CSVpuymXAAAVVpd.jpg

  • profile
    title: 황금 서버 (30일)humit 2018.09.15 08:01
    단순히 1부터 10까지의 숫자만 인식하길 원한다면 아래와 같은 방법도 있겠네요.

    avail_input = [str(i) for i in range(1, 11)]
    if order not in avail_input:
    print("잘못 입력하셨습니다.")
  • profile
    이니스프리 2018.09.15 08:14
    역시 humit 님 같은 고수님의 코딩은 간결하고 아름답군요! ^-^

    제가 range() 함수를 사용하려고 시도해봤는데

    str(i) 부분을 누락해서 그런지 if 문에서 제대로 작동을 안 하더군요 ㅠㅠ

    humit 님께서 str() 함수를 알려주신 덕분에 구글링해서 공부했습니다!

    주말에 시간을 내서 내장함수를 더 공부해야겠네요~

    번번이 감사합니다 ^-^

    그럼 humit 님께서도 좋은 주말 되세요~!
  • profile
    네모 2018.09.15 17:46
    이런 방법도 있습니다.

    if not order.isdigit() or 1 > int(order) or 10 < int(order):
    print("잘못 입력하셨습니다.")
  • profile
    이니스프리 2018.09.15 19:35
    역시 현직 개발자분들께선 대단하시네요!!

    저도 그 부분 코드를 짜면서 "이렇게 하는 것보다 훨씬 좋은 방법이 있을텐데"라고 생각했는데 말이죠 ㅠㅠ

    제가 고민했던 부분을 정말 간결하게 처리해주셔서 감사합니다!

    isdigit() 메소드란 것이 있었군요~

    네모 님 덕분에 덕분에 많이 배우고 갑니다!

    그럼 네모 님께서도 즐거운 주말 저녁 되세요 ^-^

    다시 한 번 감사드립니다 :)

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
78 코드 AWSCLI, in a single file (portable, linux) file Seia 2021.04.10 162
77 코드 [Python-Gnuboard] 파이썬으로 구현한 그누보드 자동 글쓰기 함수 1 file 이니스프리 2021.04.08 1205
76 코드 [Python] 휴일지킴이 약국을 크롤링하여 Folium 지도에 마커로 표시하는 PyQt 윈도우 앱 7 file 이니스프리 2021.03.13 1140
75 코드 도박 중독자를 위한 광고 차단 규칙 file 제르엘 2020.08.21 288
74 코드 [Python] 유튜브 영상을 다운받아 일정 간격으로 캡쳐하여 10장씩 merge하기 3 file 이니스프리 2020.05.27 1037
73 자료 [Autohotkey] 매분 정각에 전체화면을 캡쳐하는 스크립트 4 file 이니스프리 2020.05.22 1095
72 코드 [Python/Telegram] Studyforus 알림봇 (댓글, 스티커 파싱) 7 file 이니스프리 2020.05.15 642
71 코드 [Python] url 주소로부터 IP 주소 알아내기 title: 황금 서버 (30일)humit 2020.02.20 2047
70 코드 [Python] 네이버 실시간 검색어 3 title: 황금 서버 (30일)humit 2020.01.23 1120
69 코드 Koa에서 자동으로 라우팅 채워주기 Seia 2020.01.22 434
68 코드 JavaScript에서 파이썬 문자열 처리 함수 중 하나 (바인딩)를 구현 7 Seia 2020.01.20 460
67 코드 [Python] Google Image Search 결과를 받아오기 file 이니스프리 2019.12.09 945
66 코드 [파이썬] Requests를 사용한 네이버 카페 크롤링 - 일정수 이상의 리플이 달린 게시글만 텔레그램 알림 3 file 이니스프리 2019.11.17 4162
65 코드 [JS] 클라이언트단 GET Parameter Hanam09 2019.11.16 464
64 코드 [Python] 싸이월드 미니홈피 백업 스크립트 1 이니스프리 2019.11.07 2162
63 코드 [Python] PIL을 이용한 Animated GIF의 리사이징 file 이니스프리 2019.11.03 1095
62 코드 [PyQt] sir.kr에서 스크랩한 게시글을 보여주는 윈도우앱 (검색 및 정렬 가능) 7 file 이니스프리 2019.08.09 995
61 코드 [아미나] Dropbox API를 이용한 이미지 호스팅 보드스킨 12 file 이니스프리 2019.07.13 1369
60 코드 [Python] 네이버 모바일 이미지 검색에서의 이미지 파일을 멀티스레드로 다운받고 1개의 파일로 병합 11 file 이니스프리 2019.07.12 1374
59 코드 [PHP/Javascript] 아미나에 자동으로 게시글을 생성하고 Ajax로 전송하여 결과를 표시하기 2 file 이니스프리 2019.07.09 771
Board Pagination Prev 1 2 3 4 Next
/ 4