ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 220725_데이터분석_웹크롤링_4주_1일차(복기)
    카테고리 없음 2022. 7. 25. 19:51

    크롤링(Crawling), 스크래핑(Scraping)

    • 웹 크롤링은 기존의 복사본 만들기,  웹 스크래핑은 분석을 위한 특정 데이터를 추출 or 새로운 것을 만든다.
    • crawling은 다 긁어오는 것, scraping은 필요한 부분을 잘라오는 것
    • 스크래핑을 하기 위해선 크롤링 선행이 필요함

     

    1. 웹사이트 크롤링

    • 텍스트, 영상, 음성, 그림 등..  **저작권** 문제 주의
    • 트래픽을 유발하므로 일반적으로 허용하지 않음

        - https://www.google.com/robots.txt
        - https://www.naver.com/robots.txt

     

    User-agent: 대상 웹 크롤링 봇의 이름. *이면 전체 대상
    Disallow: 접근 허용 않는 경로. 
    Allow: 접근을 혀용하는 경로. 
    Crawl-delay: 한번 접근 후 다음 접근이 제한되는 시간
    Sitemap: 사이트맵 파일의 URL

    이외 인터넷 상에 공개된 데이터라고 하더라도 저작권(copyright)이 있습니다. 침해 여부를 확인 필수

     

    2. 오픈 API를 통해서 가져오기

     

     

    socket을 이용한 HTTP 통신

    • 서버와 클라이언트 양방향 연결이 이루어지는 통신
    • 일반적으로는 웹 페이지(html)를 주로 요청
    • 그림 파일(jpg, png, ...)일 수도 있다고 함
    import socket
    
    serverAddress = socket.gethostbyname('info.cern.ch')       # info.cern.ch의 아이피주소 불러와
    serverPort = 80                                            # 소켓번호는 80이야
    
    sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM ) # 소켓구멍하나만들고 스트림타입 쓴다
    sock.connect( (serverAddress, serverPort) )                # 아이피주소, 소켓번호로 연결해
    
    method = 'GET'                                             # 메소드 가져왔니?
    request_header = f'{method} /index.html HTTP/1.1\r\n'
    request_header += 'Host: info.cern.ch\r\n'
    request_header += '\r\n'
    
    sock.send( request_header.encode() )                       # 정보보낸다
    response = sock.recv(1024)                                 # 정보 받는다
    print( response.decode() )                                 # 디코딩해서 출력해줘
    
    sock.close()
    # response
    HTTP/1.1 200 OK Date: Mon, 25 Jul 2022 08:29:39 GMT Server: Apache Last-Modified: Wed, 05 Feb 2014 16:00:31 GMT ETag: "286-4f1aadb3105c0" Accept-Ranges: bytes Content-Length: 646 Connection: close Content-Type: text/html <html><head></head><body><header> <title>
    http://info.cern.ch
    </title> </header> <h1>
    http://info.cern.ch
    - home of the first website</h1> <p>From here you can:</p> <ul> <li><a href="
    http://info.cern.ch/hypertext/WWW/TheProject.html
    ">Browse the first website</a></li> <li><a href="
    http://line-mode.cern.ch/www/hypertext/WWW/TheProject.html
    ">Browse the first website using the line-mode browser simulator</a></li> <li><a href="
    http://home.web.cern.ch/topics/birth-web
    ">Learn about the birth of the web</a></li> <li><a href="
    http://home.web.cern.ch/about
    ">Learn about CERN, the physics laboratory where the web was born</a></li> </ul> </body></html>

     

    HTTP/1.1 버전 200 OK
    날짜: 월요일, 2022년 7월 25일 08:29:39 GMT
    서버: Apache Last-Modified: 2014년 2월 5일 수요일 16:00:31
    GMTag: "286-4f1aadb3105c0"
    수락-범위: 바이트
    내용-길이: 646
    연결: 닫기
    내용-타입: text/html </head> <body> <header> <body>
    http://info.cern.ch
    </filename> </filename> <h1>
    http://info.cern.ch
    - 첫 번째 웹사이트의 홈 </h1> <p> 여기에서 다음을 할 수 있습니다. </p> <ul> <li> <a href="
    http://info.cern.ch/hypertext/WWW/TheProject.html
    ">첫 번째 웹 사이트를 찾습니다/a></li><li><a href="
    http://line-mode.cern.ch/www/hypertext/WWW/TheProject.html
    ">라인 모드 브라우저 시뮬레이터를 사용하여 첫 번째 웹 사이트를 검색합니다. </a> </li> <li> <a href="
    http://home.web.cern.ch/topics/birth-web
    ">웹의 탄생에 대해 알아보기 <li> <a href="
    http://home.web.cern.ch/about
    ">웹이 탄생한 물리학 연구소 CERN에 대해 알아보십시오. </a> </li> </ul> </body> </html>

     

    쉽게 생각해보자.

    주소를 알고 있다는 가정하에 소켓이라는 알맞은 구멍을 통해 연결이 가능하고
    그 연결에 사용했던 html의 정보와
    입력대비 출력의 구조에 대해서 말하고 있는 간단한 코드다

     

    솔직히 아직 눈에 익진 않는다... :( 

    암기과목의 느낌이라 반복학습을 통해서 규격을 머릿속에 넣을 수 있을 것 같다.

     

     

     

    라이브러리를 이용한 HTTP 통신

    • 소켓 프로그래밍을 직접 하지 않고도 편하게 HTTP 통신을 구현
    • urllib, requests

      1 ) urllib을 통한 HTTP 통신

    • 파이썬 기본 패키지
    • 따로 설치 없이 바로 사용이 가능
    import urllib.request
    
    url = 'http://info.cern.ch'
    
    request = urllib.request.Request(url) # 요청
    response = urllib.request.urlopen(request) # 응답
    print(response.read().decode())

     

      2 ) urllib을 통한 파일 저장

    • urllib은 리퀘스트 객체를 생성할 때, 헤더값을 직접 정의
    • fake_agent를 이용해서 user-agent 헤더의 값을 크롬 크라우저의 값과 동일하게 설정
    !pip install fake_useragent
    
    import urllib.request
    from fake_useragent import UserAgent 
    
    agent = UserAgent()
    header = {'User-Agent' : agent.chrome }
    
    url = 'https://upload.wikimedia.org/wikipedia/ko/thumb/4/4a/%EC%8B%A0%EC%A7%B1%EA%B5%AC.png/230px-%EC%8B%A0%EC%A7%B1%EA%B5%AC.png'
    
    request = urllib.request.Request(url) # 요청
    response = urllib.request.urlopen(request) # 응답
    print(response.read())

     

    user agent는 HTTP 요청을 보내는 디바이스와 브라우저 등 사용자 소프트웨어의 식별 정보를 담고 있는 request header의 한 종류이다. 임의로 수정될 수 없는 값이고, 보통 HTTP 요청 에러가 발생했을 때 요청을 보낸 사용자 환경을 알아보기 위해 사용한다.

     

      3 ) urllib.request.urlretrieve를 통한 파일 저장

     

    import urllib.request
    from fake_useragent import UserAgent 
    
    agent = UserAgent()
    header = {'User-Agent' : agent.chrome }
    
    url = 'https://upload.wikimedia.org/wikipedia/ko/thumb/4/4a/%EC%8B%A0%EC%A7%B1%EA%B5%AC.png/230px-%EC%8B%A0%EC%A7%B1%EA%B5%AC.png'
    path = 'download.jpg'
    
    # request = urllib.request.Request(url) # 요청
    # response = urllib.request.urlopen(request) # 응답
    urllib.request.urlretrieve(url, path) # 응답

     

    위와 동일하게 agent를 크롬과 동일하게 fake 값으로 맞추고

    url과 경로를 받아 코랩 내부에 저장하였다.

     

     

     

     

     

     

    구글에서 임의로 가져온 짱구 사진을

    파이썬 내부에서도 가져다 쓸 수 있게 만들었다

     

    데이터 시각화랑은 또 다르게

     

    마케팅 관점에서 해당 제품의 광고가 걸려있으면 

    이런식으로 제품 이미지를 가져와

    보고서 만드는데 도움이 될 것 같다.

     

     

     

     

     

      4 )  requests을 통한 HTTP 통신

     

    # 로컬에서 사용하는 경우 따로 설치를 해주는 것이 좋다.
    !pip install requests
    
    
    import requests
    
    url = 'https://ssl.pstatic.net/melona/libs/1400/1400990/5ae21c88965f9fc8b2fd_20220630151118867_3.png'
    
    response = requests.get(url)
    
    with open('banner.jpg', 'wb') as f:
        f.write(response.content)

     

     

    banner.jpg의 url을 찾아와

     

    리퀘스트 겟에 넣고 

     

    파이썬 파일 만들기( open() ) 을 통하여

    banner.jpg를 만들어 url을 콘텐츠로 넣는 개념.

     

     

     

    결과적으로 도달하고싶은 목적지에 방식의 차이가 있을 뿐 다양한 방법이 존재하는 것 같다.

     

     

     

    개발자를 양성하는 첫번째는 사용법에 대한 교육
    자주 쓰면 더이상 사용법을 보지 않아도 될 정도로 능숙해지며
    사용법을 까먹었을 땐 구글링을 통해 보완하는 방식으로
    능숙해져 사용법을 쓰지 않아도 업무가 가능한 영역이 늘어날 수록 전문가가 되고
    개발이라는 이름에 걸맞게 창의적 요소가 추가된다면 전문가 사이에서 급수가 높아지지 않을까싶다.

     

     

     

     

     

     

     

Designed by Tistory.