전체 스터디
전체 스터디
  • 전체보기
  • 질문
  • 숙제
내 스터디
  • 스터디에 참여해보세요!
다른 스터디
  • 파이썬 기초 스터디
  • 네이버 정복 파이썬 크롤링
  • 페이스북 만드는 웹개발
  • 데이터사이언스 12시간 입문기
  • 파이썬 구글 Sheet 연동
  • 엑셀서당 - 훈장님의 기초 엑셀 트레이닝
  • 고전게임을 만들며 배우는 코딩의 기초
  • 내 업무를 거의 자동화하는 방법
  • SQL 입문 4시간
  • QR 코드 프로그래밍
  • 비전공자 개발지식 총정리
  • 초고속 퍼포먼스 마케터
  • 왓챠 함께 만들기
  • 퍼블리셔 초고속 입문기
  • 한국형 커뮤니티 만들기
  • airbnb 프론트엔드 카피 프로젝트
  • 워드프레스로 쿠팡 만들기
정광현

강의자료 코드 복사하라는데 어디서하나요?

최도근
1월 11일 14:51

특별히 어디서 복사하실 필요 없구요, 코드가 매우 짧으니 직접 타이핑해서 옮기시면 됩니다:)

좋아요 0
    lucky guy
    3월 13일 13:30

    아니 강의에선 코드 복사하라고 하더니..뭐죠..





    좋아요 0
      천준수
      12월 16일 17:38 · 멀티캠

      강의자료 5주차 숙제 중에 다음의 영화 예매순위 페이지에서 데이터 수집하는게 있었는데.. 해당 페이지는 접속이 안되어서

      https://movie.daum.net/premovie/released 로 들어가서 데이터 수집을 시도해보았는데, 제가 잘못한 것인지.. select로 원하는 데이터 선택이 안되는 것 같습니다.

      제대로 수집이 되는지 확인하려고 i로 카운트를 해보려고 했는데 수집이 안되는 것 같습니다 ㅜㅜ


      import requests from bs4 

      import BeautifulSoup raw = requests.get("https://movie.daum.net/premovie/released", headers = {'User-Agent':'Mozilla/5.0'}) 

      html = BeautifulSoup(raw.text, 'html.parser')

      i = 1 

      movies = html.select("ul.list_movie li")

      for m in movies: 

           print(i)

           i += 1


      자세히 보기
      신재용
      12월 16일 18:16

      daum같은 경우에는 User-Agent에 Mozilla/5.0처럼 불완전한 형태의 문자열이 들어올 경우 결과를 제대로 보내주지 않는 안티크롤링 코드가 심어져 있습니다.

      daum 일부 도메인들은 Mozilla/5.0을 쓸 바에 아예 안 넣으면 돌아갈때도 있는데요. 영화 도메인은 완전한 형태의 User-Agent를 넣어야 동작하네요. 일단 아래 붙여드린 User-Agent를 사용해주세요. 제가 브라우저에 추출한 실제 User-Agent입니다.

      {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Safari/537.36'}


      https://www.notion.so/WEEK3-9f008766023944fda6d94ad55741b243

      위의 강의자료 맨 마지막 즈음에 user-agent를 생성해주는 라이브러리에 대해 짧게 소개해드렸습니다. 다음 시간에 짧게 한번 더 언급하고 넘어가면 좋을것 같네요.

      좋아요 0
        천준수
        12월 16일 17:00 · 멀티캠

        복습하다가 궁금한게 생겨서 질문드립니다.

        저희가 raw =  requests.get() 함수로 데이터를 가져와서

        raw.text를 출력하면 태그 등이 다 살아있는데

        예를 들어, titles = html.select() 함수로 가져온 데이터를

        titles[0].text 로 출력하면 titles[0]에서 태그를 지우고 문자만 남겨주는 이유가 뭔가요?

        같은 메서드 함수인데 작동하는 원리가 다른 것 같아서.. 데이터 타입에 따라 text 가 다르게 작동하는 것인지 갑자기 궁금해서 질문드립니다.


        자세히 보기
        신재용
        12월 16일 17:29
        print(type(raw)) # <class 'requests.models.Response'>
        print(type(titles[0])) # <class 'bs4.element.Tag'>

        raw와 titles[0]는 다른 type을 가지는 객체입니다. raw는 requests의 결과를 담는 객체고, titles[0]는 BeautifulSoup으로 파싱이 완료된 결과를 담는 객체입니다.

        서로 다른 type의 객체인데 text라는 같은 이름의 요소를 가지고 있어서 헷갈리신것 같아요.



        좋아요 0
          신재용
          12월 16일 17:55

          네네 괄호가 안 붙었으니 함수는 아닙니다. 

          text같은건 프로그래밍 언어마다 부르는 말이 조금씩 다른데요, 파이썬에서는 보통 멤버변수, 속성 정도로 부릅니다. 메서드는 객체 안에 있는 함수고, 멤버변수는 객체 안에 있는 변수입니다.

          raw와 titles[0]에서 .text라는 똑같은 이름의 멤버변수를 사용하는건 그냥 우연입니다.

          requests 라이브러리와 BeautifulSoup4 라이브러리를 만든 사람이 각각 다르죠? 다른 사람이 다른 라이브러리에 각각 text라는 멤버변수를 정의했고, 서로 다른 목적으로 만들어진 라이브러리인만큼 기능이 다른 거라고 이해하시면 됩니다.

          아마 text라는 말 자체가 워낙 흔한 말이기 때문에 파이썬 자체와 연관이 있는거라고 헷갈릴수도 있는데요. 만약에 requests 라이브러리 제작자가 문자열을 담는 멤버변수를 text라는 말 대신에 potato 라는 말을 써서 정의했으면 사용자도 마찬가지로 .potato라는 이름으로 접근해야 합니다.

          좋아요 0
            천준수
            12월 16일 17:44

            아 헷갈렸네요. 함수가 되려면 ()가 뒤에 붙어야하는데 .text는 괄호가 안붙으니 함수는 아닌거죠? 근데 객체 뒤에 붙어서 데이터를 변환해주니까 함수처럼 느껴졌던 것 같습니다. 그러면 .text 같은거는 뭐라고 부르나요..? 사실 raw에 .text가 붙는거랑 titles[0]에 .text가 붙을 때 역할이 달라지는 것 같아서 아직 좀 헷갈리네요 ㅜㅜ 

            좋아요 0
              댓글 1개 더보기
              정인영
              11월 24일 17:35 · 멀티캠

              파이썬 코드 관련 질문이 있습니다.

              기존 sql 코드에서 + str(number) 을 사용해서 바인드 변수형으로 사용하고자 합니다.


              단, 여기서 숫자형 타입을 시간 형으로 변경을 하고자 하는데

              기본 단위는 seconds입니다.

              예를 들어 10을 입력을 받으면 00:00:10 으로 변경 후 sql 코드와 plus를 하고자 합니다.


              파이썬에서 이를 표현할 수 있을까요?

              아니면 db에서 함수를 사용해야하는 것일까요?


              자세히 보기
              신재용
              11월 25일 11:12

              제가 잘 이해한지 모르겠지만 sql 코드는 string 형식이겠죠?

              time 모듈을 사용해서 seconds string을 time 형식으로 바꿨다가, 다시 time 형식을 string 형식으로 바꾸는 방법을 사용할 수 있습니다.

              import time
              n = 10
              s = time.strftime("%H:%M:%S", time.gmtime(n)) 
              
              print(type(s), s)

              모듈을 사용하고 싶지 않으시다면 연산을 통해 변환하도록 직접 로직을 작성해도 괜찮습니다.

              좋아요 0
                신재용
                11월 25일 17:08

                네네 time 모듈은 내장모듈이라 문제 없이 동작할거에요.

                혹시 로직을 만드실거면

                ONE_DAY = 86400
                ONE_HOUR = 3600
                ONE_MINUTE = 60
                
                seconds = 10
                
                seconds %= ONE_DAY
                hour = seconds // ONE_HOUR
                seconds %= ONE_HOUR
                minutes = seconds // ONE_MINUTE
                seconds %= ONE_MINUTE
                    
                print("%02d:%02d:%02d" % (hour, minutes, seconds))


                저희가 안 배운 포매팅 문법도 있긴 한데, 저런 식으로 작성하시면 될것 같습니다.

                좋아요 0
                  정인영
                  11월 25일 16:21

                  감사합니다 재용님!! 저런 식으로 하면 되겠네요.
                  sql 코드는 str 타입 맞습니다.

                  prod에 반영가능한지 확인해보고 배포할 수 있겠네요.

                  만약 모듈이 없다면, 입력받은 값을 변환해서 str 값을 리턴하는 펑션을 만들어야겠네요.. 혹은 db에서 변환할 수 있는 함수를 찾던가요

                  좋아요 0
                    댓글 1개 더보기
                    이민준

                    파이썬으로 나온 결과갑을 가지고 구글 시트로 연동하 후에 시각화 할수 있을 까요?

                    최도근
                    11월 12일 16:02

                    시각화 작업은 구글 시트 내에서는 어렵습니다.

                    그 데이터를 다시 파이썬으로 가져오셔서, 파이썬을 이용하여 시각화 하는건 당연히 가능합니다:)

                    좋아요 0
                      최명환

                      스테이지4에서

                      gspread.exceptions.APIError: {'code': 403, 'message': 'The caller does not have permission', 'status': 'PERMISSION_DENIED'}

                      이런 에러가 납니다.


                      https://spreadsheets.google.com/feeds

                      이 주소에서는 아래 메시지가 나왔습니다.


                      현재 파일을 열 수 없습니다. 주소를 확인한 다음 다시 시도해 주세요.


                      자세히 보기
                      최도근
                      10월 10일 14:46

                      시트에서도 공유권한을 설정하셔야 합니다. 혹시 지금은 해결 되셨는지요!

                      좋아요 0
                        최명환
                        9월 24일 00:29

                        import gspread from oauth2client.service_account import ServiceAccountCredentials scope = ['https://spreadsheets.google.com/feeds'] creds = ServiceAccountCredentials.from_json_keyfile_name('key.json', scope) client = gspread.authorize(creds) sheet_url = 'https://docs.google.com/spreadsheets/d/1IZs-C6doyjn5n5BTrAdE2Wtl8nK-3EvVZC7csXduQQ8/edit#gid=0' doc = client.open_by_url(sheet_url) sheet1 = doc.worksheet('시트1') cnt = int(sheet1.cell(1, 2).value) print('기존 행수:', cnt) sheet1.insert_row(['내용1', '내용2'], 3) sheet1.update_cell(1, 2, str(cnt + 1))

                        좋아요 0
                          최명환
                          9월 24일 00:29

                          코드파일 내용입니다. 동영상보고 타이핑해서 만들었습니다. 

                          좋아요 0
                            댓글 2개 더보기

                            week 6 요약 자료 올립니다!

                            송세린

                            안녕하세요 질문 드립니다!

                            stage 4 코드를 입력하고 런 했는데 에러가 뜹니다!

                            "/Users/serene/PycharmProjects/google yon seub/venv/bin/python" "/Users/serene/PycharmProjects/google yon seub/stage04.py" Traceback (most recent call last): File "/Users/serene/PycharmProjects/google yon seub/stage04.py", line 2, in <module> from oauth2_client.service_account import ServiceAccountCredentials ModuleNotFoundError: No module named 'oauth2_client.service_account' Process finished with exit code 1 


                            이렇게 뜨고 에러가 나는데 어떻게 해야될까요 ㅠㅠ


                            이게 안되는 원인이, 사용자인증 정보 만들고 나서 client email을 구글시트 공유에 붙여넣기 하고 나면 메일로 도메인을 찾지 못해서 추가하지 못했다고 뜨는데 그거랑 관련 있는지 궁금합니다

                            자세히 보기
                            최도근
                            7월 28일 16:46

                            필요한 패키지(oauth2)가 설치가 되지 않은 상태입니다.

                            패키지 설치 확인해주세요!

                            좋아요 0

                              Name 부분을 정리할때

                              df.loc[ df['Name'].str.contains('Mr\.'), 'Name'] = 'Mr.'

                              에서 '\'가 들어가는 이유가 뭔지 궁금합니다!

                              자세히 보기
                              최도근
                              7월 14일 19:38

                              pandas의 .contains(X)에서 X자리에 찾는 문자열을 넣을 수 있죠? 일반적인 숫자, 알파벳, 한글은 그냥 넣어도 되지만 .은 다른 기능도 숨어 있습니다. 

                              이런 특수문자 앞에 \를 넣어주면 그 기능을 없애고 실제 문자만 검색합니다. 

                              mr\. → mr.
                              mr\[3\] → mr[3]
                              우측이 실제 검색되는 문자열 

                              보다 정교한 검색이 가능하도록 몇몇 특수문자에 특수한 기능이 딸려 있는데 그걸 다시 없애는 기능이예요.(심화: 정규식 참고)

                              좋아요 0

                                레벨업 부분에서 질문드립니다!

                                f= open('test.csv', 'w)

                                f=open('test.csv','r') 

                                의 차이가 파일을 불러오는건 동일한데 위의 경우에는 파일 작성이고 

                                밑의 경우에는 읽기전용으로 보면 되는건가요?


                                또, f.readline() 은 한줄씩 프린트 하는건가요?!

                                자세히 보기
                                최도근
                                7월 14일 19:40

                                답변이 늦어 죄송합니다, 못보고 넘어갔습니다.

                                아래의 경우는 읽기만 하는게 맞습니다:)

                                readline은 한줄씩 읽는 것(불러들이는 것)입니다.

                                좋아요 0

                                  WEEK4 요약자료 올립니다!

                                  Week 3 요약입니다!

                                  고한석
                                  6월 8일 23:38 · 경희)KHU알라 part2

                                  아래에서 알려주신 방법으로 해결이 되지 않아 파일을 올려 질문 드립니다!!

                                  최도근
                                  6월 11일 12:17

                                  해결법:
                                  address_box = driver.find_element_by_css_selector( "div.box_search input#keyword.input_country.ui-autocomplete-input")를
                                  address_box.clear() 위에 추가할 것

                                  search = driver.find_element_by_css_selector("button#searchButton")를
                                  search.click() 바로 위로 옮길 것

                                  문제 원인:
                                  동적페이지는 매 클릭(무언가 페이지에 변화를 주는 행위)마다 페이지 변동이 생깁니다. 페이지 변동이 생겼다는 건, 이전에 선택한 무언가도 변할 수 있다는 것 입니다.

                                  (1) A 시점에 address_box를 find해서 찾음
                                  (2) 무언가 click
                                  (3) A 시점에 찾은 address_box는 더이상 존재하지 않음(페이지가 바뀌었으므로)
                                  (4) 따라서 address_box를 다시 find 해줘야함

                                  좋아요 0

                                    파이썬 상에서는 수집이 되는데 엑셀로는 왜 수집이 안될까요?

                                    최도근
                                    6월 8일 21:56

                                     print는 콘솔(검은바탕, 흰색글자가 나오는 하단 화면부)에 출력하고 sheet.명령어는 excel로 출력합니다.

                                    sheet에 출력하는 부분을 누락하셨겠죠?

                                    좋아요 0
                                      김민지
                                      6월 8일 21:04

                                      코드에서 잘못된 것 찾았습니다..ㅎㅎ해결했어요!

                                      좋아요 0
                                        고한석
                                        6월 8일 19:15 · 경희)KHU알라 part2

                                        질문있습니다!

                                        셀레니움에서 반복해서 데이터를 가져오고 싶은데 오류가 뜨네요..

                                        sheet는 따로 지정을 했었고, 캡처 편의상 잠깐 뺏었어요

                                        여기서 오류가 있는 라인은 clear()구문 입니다.

                                        delete버튼 click(), refresh() 등 할 수 있는 건 다 해본 것 같아요..

                                        자세히 보기
                                        최도근
                                        6월 8일 22:04

                                        우선 아래 두가지 방법 중 하나를 시도해보세요!

                                        일시적으로, 혹은 아직 해당 input을 다룰 준비가 안되었을때 나타나는 오류입니다.

                                        (1) clear() 바로 위에서 time.sleep을 이용해 충분한 시간을 기다려보세요.

                                        (2) clear() 바로 위에서
                                        new WebDriverWait(driver, timeout).ignoring(StaleElementReferenceException.class).until(ExpectedConditions.elementToBeClickable(By.id("address box의 선택자")));

                                        그래도 해결이 안된다면 코드파일 자체를 업로드해주세요!

                                        좋아요 1
                                        고한석
                                        6월 8일 23:38

                                        정말 감사합니다!! 하지만 문제가 해결되지 않아 새로운 질문으로 업로드 합니다ㅠㅠ 감사합니다.

                                        좋아요 0
                                          너무 고민말고 물어보세요!
                                          kakao 카카오톡 상담
                                          kakao 적성 테스트
                                          부담없이 채팅 상담하세요. 친절한 코알라가 대기중입니다:)