실전형 인공지능 분석, 빅데이터 분석, 앱 개발에 대해 경험한 내용을 여러분과 공유하고 싶습니다.
부족한 점이 있더라도 많이 응원해주시면, 더 열심히 노력해보겠습니다. 감사합니다.
강의
수강평
- 코딩없이 시작하는 엑셀 크롤링. WEB부터 ChatGPT API까지
- 코딩없이 시작하는 엑셀 크롤링. WEB부터 ChatGPT API까지
- [Python 초보] Flutter로 만드는 ChatGPT 음성번역앱
- [Python 초보] Flutter로 만드는 ChatGPT 음성번역앱
- [Python 초보] Flutter로 만드는 ChatGPT 음성번역앱
게시글
질문&답변
나라장터 URL 수집
POST로 바뀌면서 API체계를 따라가다 보니 내용이 많이 복잡해졌습니다. 참고하실 수 있도록 아래에 코드 추가해드립니다. 시기를 보아서 이 부분은 강의에서 내리거나 update하도록 하겠습니다.조달청API도 3개월 후에 정지된다는 메일을 받은 적이 있는데요. 안정성을 고려해서 조치하겠습니다. 미리 조치하지 못해 죄송합니다. POST통신을 하게 되면Header값처럼 별도로 POST통신에 사용하는 값을 전달해주어야 데이터에 접근할 수 있습니다. 나라장터의 경우 이 항목이 매우 많아 코드가 복잡함을 양해해주시기 바랍니다. let Payload = Text.ToBinary( "{""dlBidPbancLstM"":{""untyBidPbancNo"":"""",""bidPbancNo"":"""",""bidPbancOrd"":"""",""prcmBsneUntyNoOrd"":"""",""prcmBsneSeCd"":""0000 조070001 조070002 조070003 조070004 조070005 민079999"",""bidPbancNm"":""인공지능"",""pbancPstgDt"":"""",""ldocNoVal"":"""",""bidPrspPrce"":"""",""ctrtDmndRcptNo"":"""",""dmstcOvrsSeCd"":"""",""pbancKndCd"":""공440002"",""ctrtTyCd"":"""",""bidCtrtMthdCd"":"""",""scsbdMthdCd"":"""",""fromBidDt"":""20241208"",""toBidDt"":""20250107"",""minBidPrspPrce"":"""",""maxBidPrspPrce"":"""",""bsneAllYn"":""Y"",""frcpYn"":""Y"",""rsrvYn"":""Y"",""laseYn"":""Y"",""untyGrpGb"":"""",""dmstNm"":"""",""pbancPicNm"":"""",""odnLmtLgdngCd"":"""",""odnLmtLgdngNm"":"""",""intpCd"":"""",""intpNm"":"""",""dtlsPrnmNo"":"""",""dtlsPrnmNm"":"""",""slprRcptDdlnYn"":"""",""lcrtTyCd"":"""",""isMas"":"""",""isElpdt"":"""",""oderInstUntyGrpNo"":"""",""esdacYn"":"""",""infoSysCd"":""정010029"",""contxtSeCd"":""콘010006"",""bidDateType"":""R"",""brcoOrgnCd"":"""",""deptOrgnCd"":"""",""isShop"":"""",""srchTy"":""0"",""cangParmVal"":"""",""currentPage"":"""",""recordCountPerPage"":""10"",""startIndex"":1,""endIndex"":10}}" ), Source = Json.Document( Web.Contents("https://www.g2b.go.kr/pn/pnp/pnpe/BidPbac/selectBidPbacScrollTypeList.do", [ Headers = [ #"authority" = "www.g2b.go.kr", #"method" = "POST", #"path" = "/pn/pnp/pnpe/BidPbac/selectBidPbacScrollTypeList.do", #"scheme" = "https", #"accept" = "application/json", #"accept-encoding" = "gzip, deflate", #"accept-language" = "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,zh-CN;q=0.6,zh;q=0.5,zh-TW;q=0.4,zh-HK;q=0.3", #"content-type" = "application/json;charset=UTF-8", #"cookie" = "WHATAP=x2amc4safu1krv; XTVID=A2501071301227329; Path=/; infoSysCd=%EC%A0%95010029; _harry_ref=https%3A//www.google.com/; _harry_url=https%3A//www.g2b.go.kr/; _harry_fid=hh-1701578081; _harry_lang=ko-KR; system_language=ko; poupR23AB0000013415=done; poupR23AB0000013414=done; lastAccess=1736223179861; JSESSIONID=NWU3ZmNhMmEtODkyZC00YjdiLWExMzEtNmFjZWQyZDE4Zjk0; _harry_hsid=A250107165624222833; _harry_dsid=A250107165624222403; XTSID=A250107165624222203; xloc=1707X960; globalDebug=false; XTVID=A2501071301227329", #"menu-info" = "{""menuNo"":""01175"",""menuCangVal"":""PNPE001_01"",""bsneClsfCd"":""%EC%97%85130026"",""scrnNo"":""00941""}", #"origin" = "https://www.g2b.go.kr", #"priority" = "u=1, i", #"referer" = "https://www.g2b.go.kr/", #"sec-ch-ua" = """Google Chrome"";v=""131"", ""Chromium"";v=""131"", ""Not_A Brand"";v=""24""", #"sec-ch-ua-mobile" = "?0", #"sec-ch-ua-platform" = """Windows""", #"sec-fetch-dest" = "empty", #"sec-fetch-mode" = "cors", #"sec-fetch-site" = "same-origin", #"submissionid" = "mf_wfm_container_tacBidPbancLst_contents_tab2_body_sbmPbancBidPbancLst", #"target-id" = "btnS0004", #"user-agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36", #"usr-id" = "null" ], Content = Payload ] ) ), result = Source[result], #"테이블로 변환됨" = Table.FromList(result, Splitter.SplitByNothing(), null, null, ExtraValues.Error), #"확장된 Column1" = Table.ExpandRecordColumn(#"테이블로 변환됨", "Column1", {"prcmBsneSeCd", "prcmBsneSeCdNm", "pbancSeYnNm", "scsbdMthdDtlsCrtrNm", "scsbdMthdCd", "scsbdMthdDtlsCrtrNo", "bidPbancUntyNoOrd", "pbancSttsNm", "pbancSttsCd", "untyBidPbancNo", "untyBidPbancOrd", "bidPbancUntyNo", "bidPbancUntyOrd", "bidPbancNm", "oderInstUntyGrpNo", "oderInstUntyGrpNm", "dmstNm", "pbancPstgDt", "linkInstPbancLnkUrl", "untyBidPbancRegTyCd", "bidMthdCd", "aagrSbmsnElctHdwrSeCd", "rowNum", "prcmBsneUntyNo", "prcmBsneUntyOrd", "bidClsfNo", "bidPrgrsOrd", "bsneClsfCd", "prcmBsneUntyOdn3Val", "prcmBsneUntyOdn4Val", "prcmBsneUntyOdn5Val", "prcmBsneUntyOdn6Val", "prcmBsneUntyOdn7Val", "pbancPicId", "pbancPicNm", "lastPbancYn", "currentPage", "recordCountPerPage", "nextRowYn", "sessUsrIpar", "prgrsUntyPrcmBsneNo", "orderByYn", "gupBsneUntNo", "gupBsneUntNm", "stepBsneUntNo", "stepBsneUntNm", "prssBsneUntNo", "prssBsneUntNm", "bsnePrssPrgrsSeCd", "bsnePrssPrgrsSeNm", "prcsDt", "bsneFlowNo", "prcsRsn", "menuCangVal", "cangParmVal", "resultCode", "resultMsg"}, {"prcmBsneSeCd", "prcmBsneSeCdNm", "pbancSeYnNm", "scsbdMthdDtlsCrtrNm", "scsbdMthdCd", "scsbdMthdDtlsCrtrNo", "bidPbancUntyNoOrd", "pbancSttsNm", "pbancSttsCd", "untyBidPbancNo", "untyBidPbancOrd", "bidPbancUntyNo", "bidPbancUntyOrd", "bidPbancNm", "oderInstUntyGrpNo", "oderInstUntyGrpNm", "dmstNm", "pbancPstgDt", "linkInstPbancLnkUrl", "untyBidPbancRegTyCd", "bidMthdCd", "aagrSbmsnElctHdwrSeCd", "rowNum", "prcmBsneUntyNo", "prcmBsneUntyOrd", "bidClsfNo", "bidPrgrsOrd", "bsneClsfCd", "prcmBsneUntyOdn3Val", "prcmBsneUntyOdn4Val", "prcmBsneUntyOdn5Val", "prcmBsneUntyOdn6Val", "prcmBsneUntyOdn7Val", "pbancPicId", "pbancPicNm", "lastPbancYn", "currentPage", "recordCountPerPage", "nextRowYn", "sessUsrIpar", "prgrsUntyPrcmBsneNo", "orderByYn", "gupBsneUntNo", "gupBsneUntNm", "stepBsneUntNo", "stepBsneUntNm", "prssBsneUntNo", "prssBsneUntNm", "bsnePrssPrgrsSeCd", "bsnePrssPrgrsSeNm", "prcsDt", "bsneFlowNo", "prcsRsn", "menuCangVal", "cangParmVal", "resultCode", "resultMsg"}) in #"확장된 Column1"
- 0
- 4
- 103
질문&답변
나라장터 URL 수집
안녕하세요? 개편이 크게 되었네요. ^^ 가장 큰 변화가 기존에는 통신 방식이 GET이었는데요. POST로 바뀌었네요.개발자도구에서 파일 형식을 Doc가 아닌 JS로 하면 selectBidPbacScrollTypeList.do를 보실 수 있는데요. 이 파일을 클릭해보시면 원하시는 정보가 JSON형식으로 들어 있습니다.따라서 이 파일을 수집하셔야 하는데요. Headers를 보시면 Request Method가 POST로 되어있습니다.(사진) (사진) POST통신은 사실 강의 범위 밖의 내용이라 개편 후 사이트에 맞게 추가 테스트를 해야 답을 드릴 수 있겠습니다. 그나마 엑셀 다운로드 기능이 추가 되어 바로 데이터를 다운로드 할 수 있게 되었으니, 이 기능을 이용해보시는 것을 권해드립니다. 감사합니다.
- 0
- 4
- 103
질문&답변
나라장터 URL 수집
안녕하세요?크롤링은 상대방 웹사이트의 구조에 맞춰서 데이터를 가져오기 때문에,개편을 하면 대부분 구조가 바뀌어 이전 방식으로 수집이 안되는 경우가 많습니다. 저도 개편된 구조를 한 번 살펴보고 다시 답변 드리도록 하겠습니다. 감사합니다.
- 0
- 4
- 103
질문&답변
[질문] 네이버쇼핑 - 로그인이 필요한 제품에 가격 가져오기
안녕하세요?좋은 질문해주셔서 감사합니다. API는 여러 개 신청할 수 있습니다. 올려주신 화면만 보면, 휴대폰 인증이 안되어 있는 것으로 보입니다. 한 번 확인 부탁 드리겠습니다. 그리고, 위 업체정보와 가격정보 내용은 API가 제공하지 않는 정보입니다.API는 상품목록(상품검색결과 화면을 생각하시면 될 것 같습니다.) 중 일부 정보를 제공합니다.따라서, 추가정보 수집을 원하시면 웹페이지 크롤링 작업을 하셔야 합니다. (아래 예시 참고)그런데, 엑셀로 로그인을 하는 크롤링은 난이도가 많이 올라가서, 엑셀 파워쿼리로 하시는 것보다는 파이썬 Selenium등을 이용해서 수집하는 것이 일반적입니다. 로그인이 없는 경우라면, 아래 그림처럼 수집이 가능합니다.상품이 여러개인 경우는 강의 내용 중 섹션6의 반복처리 부분을 참고하셔서 뒷 부분의 제품고유번호를 반복처리하실 수 있겠습니다.https://search.shopping.naver.com/catalog/13505853937(사진) 감사합니다.
- 0
- 1
- 31
질문&답변
음성인식 하는 마이크 시간이 짧은거 같아요
안녕하세요? 오서현님.다음 질문에서 한글음성 입력이 된 것을 확인해서, 이 질문을 해결상태로 전환하겠습니다. 혹시라도 미해결되신 사항이 있으시면 번거로우시더라도 다시 한번 질문을 올려주시면 감사하겠습니다.
- 1
- 2
- 178
질문&답변
음성 통신 테스트 안됨
시간이 경과하여 해결되신 것으로 파악하고 해결처리 하겠습니다. 혹시라도 미해결 상태이시면 번거로우셔도 다시 한번 질문해주시면 감사하겠습니다.
- 0
- 3
- 81
질문&답변
음성인식 번역
안녕하세요?입력이 2개인 것을 보니 번역기를 만드시는 중인 것 같은데요. 우선 '번역기 구조'와 '번역기 기능' 강의를 참고해주시구요.음성인식은 아래 코드를 보시면 localeId 부분에서 음성입력 언어를 설정하게 되어 있습니다. 이 부분을 한 번 확인해주시고, 이 부분의 전환이 isTranslate, 즉, 한/영 아이콘 터치에 의해 전환되기 때문에 이 부분도 잘 동작하고 있는지 함께 확인해주시면 감사하겠습니다. 해보시고 잘 안되시거나, 제가 상황을 잘못 파악한 부분이 있으면 번거로우시더라도 다시 한번 질문에 올려주세요. 감사합니다. void startRecordAudio() async { _collectedText = ''; await _speechToText.listen( onResult: _onSpeechResult, // partialResults: true, listenFor: Duration(seconds: 60), localeId: isTranslate ? "en_US" : "ko_KR", ); }
- 0
- 2
- 93
질문&답변
음성 통신 테스트 안됨
안녕하세요? 다른 패키지 사용 방법을 안내해드리겠습니다.아래 내용 참고해서 수정해보세요. 성공하시길 바라겠습니다.이렇게 해도 안되면 번거로우시더라도 다시 한 번 알려주세요. 함께 확인하겠습니다.아래에 패키지 부분과 record_audio함수 부분을 적어드리오니, 성공하시기 바라겠습니다.기존 scipy 패키지 가져오는 부분 주석처리 또는 삭제새롭게 sounddevice와 wave 패키지 가져오기record = 행을 아래 코드로 수정record = sd.rec(int(seconds * fs), samplerate=fs, channels=2, dtype='int16')기존 record_audio함수 부분write(audio_input_path, fs, record)이 부분을 아래 with문 포함 5줄로 교체 수정부분 전체 코드입니다.from openai import OpenAI from pathlib import Path import sounddevice as sd # from scipy.io.wavfile import write from playsound import playsound import sounddevice as sd import wave client = OpenAI() def record_audio(): fs = 44100 # 샘플링 레이트 seconds = 3 # 녹음 시간 print("녹음을 시작합니다...") record = sd.rec(int(seconds * fs), samplerate=fs, channels=2, dtype='int16') sd.wait() # 녹음이 끝날 때까지 기다립니다 print("녹음이 완료되었습니다.") audio_input_path = 'audio_input.wav' with wave.open(audio_input_path, 'wb') as wf: wf.setnchannels(2) wf.setsampwidth(2) wf.setframerate(fs) wf.writeframes(record) return audio_input_path
- 0
- 3
- 81
질문&답변
chatgpt api 연결안되는거 같아요
안녕하세요? 오서현님. 다비입니다.앞서 인프런AI인턴도 답변드린 것처럼 일단은 API Key오류로 보여집니다.OpenAI API 유료계정세팅이 잘 되었는지 확인해주세요.사용하시는 API Key가 Open AI 관리페이지에 유효한 상태인지 확인해주세요.API key 환경 설정이 잘 되어 있는지 명령프롬프트에서 확인(echo %OPENAI_API_KEY% 실행)해주세요. (섹션3의 인증키등록 강의 참고)1, 2, 3에 이상이 없는데도 안되신다면, 2번 줄 clinet = OpenAI() 이 부분을 아래 내용을 바꿔서 해보시기 바랍니다. client = OpenAI(api_key='오서현님인증키를 이곳에 입력',)4번까지해도 계속 문제가 발생한다면, 번거로우시더라도 작성하신 코드를 올려주시면 같이 살펴볼 수 있겠습니다.부디 해결되시길 바라겠습니다.
- 0
- 2
- 243
질문&답변
pip install 오류가 해결이 안되네요...
안녕하세요? 계속 scipy에서 문제가 발생한다면, 다른 패키지를 이용해서 음성파일을 저장하실 수 있습니다. 정상적으로 테스트되었습니다.아래에 패키지 부분과 record_audio함수 부분을 적어드리오니, 성공하시기 바라겠습니다.기존 scipy 패키지 가져오는 부분 주석처리 또는 삭제새롭게 sounddevice와 wave 패키지 가져오기record = 행을 아래 코드로 수정record = sd.rec(int(seconds * fs), samplerate=fs, channels=2, dtype='int16')기존 record_audio함수 부분 write(audio_input_path, fs, record) 이 부분을 아래 with문 포함 5줄로 교체 from openai import OpenAI from pathlib import Path import sounddevice as sd # from scipy.io.wavfile import write from playsound import playsound import sounddevice as sd import wave client = OpenAI() def record_audio(): fs = 44100 # 샘플링 레이트 seconds = 3 # 녹음 시간 print("녹음을 시작합니다...") record = sd.rec(int(seconds * fs), samplerate=fs, channels=2, dtype='int16') sd.wait() # 녹음이 끝날 때까지 기다립니다 print("녹음이 완료되었습니다.") audio_input_path = 'audio_input.wav' with wave.open(audio_input_path, 'wb') as wf: wf.setnchannels(2) wf.setsampwidth(2) wf.setframerate(fs) wf.writeframes(record) return audio_input_path
- 0
- 2
- 2.9K