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

6주차 수업시간에 사용한 코드입니다.

맨 위 주석에 간단한 설명이 적혀있어요.

천준수
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개 더보기
          신재용
          12월 10일 22:25 · 멀티캠

          5주차 스터디에서 작성한 코드입니다.

          신재용
          12월 3일 22:28 · 멀티캠

          4주차 수업시간에 작성한 beautifulsoup 태그 예외처리 함수입니다.


          def get_text(tag, replace="N/A"):
              if not tag:
                  return replace
              return tag.text


          자세히 보기
          신재용
          11월 27일 00:09 · 멀티캠

          3주차 챌린지2 답안입니다.

          # requests 라이브러리를 불러온다.
          import requests
          # bs4에서 BeautifulSoup만 불러온다.
          from bs4 import BeautifulSoup
          
          # 안티크롤링을 회피하기 위해 헤더의 User-Agent 요소를 가짜로 만든다.
          h = {"User-Agent": "Mozilla/5.0"}
          
          # range(1, 4) : [1, 2, 3] 형태의 리스트를 반환
          # i에 차례대로 1, 2, 3이 할당됨
          for i in range(1, 4):
              # headers 인수를 h로 지정해 ycombinator 뉴스 페이지를 요청한다.
              raw = requests.get("https://news.ycombinator.com?p=" + str(i), headers=h)
          
              # 의미 없는 html 문자열을 파싱해 의미를 가지는 객체로 만든다.
              html = BeautifulSoup(raw.text, "html.parser")
          
              # class가 athing인 모든 요소를 선택해 list 형태로 반환한다.
              # list 형태이기 때문에 articles[0], articles[1]... 처럼 인덱싱 가능
              articles = html.select(".athing")
          
              # articles list에서 요소를 하나씩 꺼내서 article에 할당한다.
              for article in articles:
                  # article 요소에서 class가 rank인 첫번째 요소를 선택한다.
                  rank = article.select_one(".rank").text
                  title = article.select_one(".storylink").text
                  print(rank, title)


          자세히 보기
          신재용
          11월 26일 23:59 · 멀티캠

          간단한 파일 입출력 사용법입니다.

          # 파일에 쓰기
          
          # open 모드 r: 읽기, w: 쓰기, a: 이어쓰기
          f = open("test.txt", "a")
          
          # 파일에 한 줄 쓰기
          f.write("hello world")
          print("hi world", file=f)
          
          # 파일 닫기
          f.close()
          
          
          #########################################
          
          # 파일 읽기
          
          # open 모드 r: 읽기, w: 쓰기, a: 이어쓰기
          f = open("test.txt", "r")
          
          for line in f.readlines():
              print(line.strip())
          
          # 파일 닫기
          f.close()
          
          
          


          자세히 보기
          정인영
          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월 18일 22:17 · 멀티캠

                1.링크드인에서  채용정보를 수집

                (HR, 인사, 직원경험 등 관련부분 24시간 기준)

                https://www.linkedin.com


                2. 키워드 분석

                 1) Jop description에 자주 나오는 단어

                 2) 해당 공고가 속한 업계

                 3) 1)과 2)의 상관관계 분석


                 3. 24시간 단위로 수행하며, 데이터가 누적되어 기간별로 비교분석이 되면 좋겠음

                자세히 보기
                신재용
                11월 18일 23:19

                우선 스터디에서 다루는 내용은 Python을 이용해 웹 페이지를 수집하는 1번까지입니다.

                제가 링크드인을 잘 다루지 못하기 때문에 정확히 찾아내지는 못했는데, 말씀하신 HR, 인사, 직원경험 등에 대한 정형화된 데이터가 있다면 어렵지 않게 수집이 가능합니다.

                키워드분석은 재량껏 진행해주셔야 하는데, 마지막 주차에는 2-1)의 빈도분석까지만 구현하는걸 목표로 잡으시길 추천드립니다. 우리 스터디의 천준수님은 빈도분석을 위해 형태소 분석을 고려하시는것 같습니다. 

                기간별로 데이터를 누적시키기 위해서는 엑셀을 사용하시길 추천드립니다. 추후에 개인적으로 진행하는 프로젝트가 고도화되면 다른 데이터베이스가 필요해지겠지만, 초기 단계에서는 엑셀이 빠르게 테스트하고 시각화해보기 가장 좋은 데이터베이스라고 생각합니다.

                좋아요 0
                  신재용
                  11월 18일 21:09 · 멀티캠

                  [공지]

                  3주차 강의자료를 아래 두 개의 문서로 대체합니다.

                  기존 3주차, 4주차 강의자료에서 중요도가 떨어지는 부분을 제외했고, 실습중 사용할 웹페이지가 개편되어 새로 코드를 작성했습니다.

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

                  https://www.notion.so/WEEK3-2-433361edc51e4e788e5d9001cb444176

                  자세히 보기
                  안길현
                  11월 17일 20:56 · 멀티캠

                  1.네이버 부동산 사이트 '매물'에서 정보를 수집한다

                  https://land.naver.com/ 

                  (지도형식의 사이트인데 웹크롤링이 가능할까요?)


                  2.범주에 해당되는 정보를 불러온다

                  (1차)매출검색에서 정보 필터

                  ex)아파트오피스텔-아파트-매매-6억 이하

                  (2차)지역에서 정보 필터

                  ex)서울시-강서구-가양동-최근입주순 상위 5순위까지


                  3.랭킹순으로 상위 3순위 매물 정보 수집

                  ex)매물명, 매매가, 아래하단의 정보, 중개부동산


                  4.매일 아침 10시에 자동으로 1~3번 과정 반복하며 업데이트(엑셀 출력)


                  자세히 보기
                  신재용
                  11월 18일 20:56

                  1. 지도의 검색 결과 페이지처럼 수집 도중에 클릭이 필요한 페이지의 수집기도 5주차 과정을 마치고나면 구현 하실 수 있습니다. 

                  2번과 3번 내용의 경우 제가 제대로 이해했는지는 모르겠습니다만..

                  https://m.land.naver.com/map/37.5681:126.8454:14:1150010400/APT:OPST/A1?dprcMax=60000&

                  위의 URL로 접속해보시면 강서구 가양동의 6억 이하 아파트, 오피스텔 매물을 보여줍니다.

                  URL에 이미 필터에 관한 많은 정보가 담겨있고, 결과를 보기 위해 약간의 클릭만 더해주면 되므로 충분히 구현 가능할것 같습니다.

                  참고로 PC보다 모바일 페이지가 더 깔끔해보여서 m.land.naver.com을 이용했습니다.

                  좋아요 1
                  천준수
                  11월 16일 17:55 · 멀티캠

                  1. 글로우픽 사이트에서 화장품 리뷰를 수집

                  - https://www.glowpick.com/beauty/ranking?id=142&level=3

                    (예시: 마일드선크림 카테고리)

                  - 리뷰를 분석하고자 하는 랭킹에 있는 특정 제품 지정


                  2. 수집된 데이터를 형태소 분석하여 주요 키워드를 뽑아낸다.

                  - 1차 목표: 단순 키워드 빈도분석

                  - 2차 목표: 키워드에 대한 긍부정 분석

                  (키워드 전후 단어까지 카운팅하여 ex. [끈적임 없이/끈적임 심해서] 를 구분할 수 있게끔)


                  3. 단어 사전은 사용하면서 직접 업데이트 가능하면 좋겠음.

                  자세히 보기
                  신재용
                  11월 17일 20:38

                  좋은 주제같습니다.

                  글로우픽 리뷰 페이지는 5주차가 지나면 스터디에서 익히는 내용을 적용해서 무리없이 수집할수 있습니다. 

                  다만 이 페이지에서 리뷰를 추가 로딩하는 방법이 페이지 기반이 아니고, 무한스크롤(마지막 리뷰까지 로드된 후 스크롤을 더 내리면 추가로 로드하는 방법) 기반이기 때문에 이 부분 구현할때 시간이 꽤 들것 같기도 합니다. 이 부분은 스터디에서 다루지 않거든요.

                  3시간 짜리 미니프로젝트인 만큼, 1번 + 2번의 1차 목표까지 구현하는걸 우선 목표로 삼으면 좋겠습니다. 이미 나와있는 라이브러리들 이용해서 빈도수 체크까지 하는건 큰 무리 없을것 같습니다.

                  좋아요 0
                    성기영
                    11월 16일 09:21 · 멀티캠

                    1. 주요 2개의 Website에서 해외 신제품 출시 정보를 수집한다.

                    - (1) 서구권: https://1beautynews.ru/ 

                    - (2) 일본: https://www.cosme.net/news


                    2. 수집한 data를 동일한 data frame으로 저장한다. (excel)

                    - 위 1-(1) Website의 경우, 정형화된 구조가 아니라서 가능할지 모르겠습니다.


                    3. 매일 아침 9시에 자동으로 1-2번의 과정을 수행한다.

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

                    말씀하신대로 1-(1)의 사이트는 정형화된 구조가 아니라 1-(2) 사이트와 비슷한 형식의 데이터를 뽑아내기는 어려울 것으로 보입니다. 1-(1) 사이트에서 매일 같은 결과를 얻을 수 있는 요소는 기사 제목과, 태그의 첫번째 요소에 위치한 브랜드 이름 뿐입니다. 글 내용을 수집할 때는, '출시'나 '발매'같은 단어가 들어가는 문장을 수집한다던지, 어느정도 타협이 필요할것 같네요.

                    우선 마지막날 실습때는 1-(2) 사이트를 기준으로 크롤러를 작성해 보시고, 추후에 ㄱ 개선해 나가시는걸 추천드립니다. 1-(2) 사이트만으로도 스터디에서 익힌 내용들을 실습해보기 좋은 주제인것 같습니다.

                    좋아요 0
                      신재용
                      11월 12일 21:36 · 멀티캠

                      [과제]

                      6주차 미니프로젝트 기획하기

                      ex)

                      1. 나이키 한정판 발매 사이트를 수집한다.

                      https://www.nike.com/kr/launch/?type=upcoming&activeDate=date-filter:AFTER

                      2. 수집한 데이터에 한정판 신발이 있다면 텔레그램 메시지로 전송한다.

                      3. 매일 아침 10시에 자동으로 1~2번의 과정을 수행한다.

                      ------------------------------------------------------------------------------

                      제출해주시면 실현 가능성을 검토하겠습니다.

                      경우에 따라 크롤링이 도저히 불가능한 사이트가 있습니다.

                      자세히 보기
                      천준수
                      11월 11일 13:37 · 멀티캠

                      <과제1>

                      tr.athing 

                      span.rank 

                      a.storylink 

                      span.sitestr

                      <과제2>

                      ul.lst_thum li

                      ul.lst_thum li a strong 

                      span.writer

                      자세히 보기
                      신재용
                      11월 11일 15:03

                      딱히 흠잡을데 없이 잘 작성해 주셨습니다!

                      좋아요 0
                        참여자 네이버 정복 파이썬 크롤링
                        너무 고민말고 물어보세요!
                        kakao 카카오톡 상담
                        kakao 적성 테스트
                        부담없이 채팅 상담하세요. 친절한 코알라가 대기중입니다:)