ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 웹 크롤링 - BeautifulSoup 기초 개념
    빅데이터/BeautifulSoup 2021. 12. 9. 09:44

     

     

     

    01 웹 크롤링 및 스크래핑 개요

    • 웹 크롤링 (Web Crawling)
      웹 크롤러가 정해진 규칙에 따라 복수 개의 웹 페이지를 브라우징하는 작업
    • 웹 스크래핑 (Web Scraping)
      웹 페이지 상에서 원하는 콘텐츠 정보를 컴퓨터로 하여금 자동으로 추출 및 수집하는 기술
      (주로 웹페이지의 구성요소의 콘텐츠나 속성값을 읽어와서 작업이 이루어 짐(HTML/CSS 등))
    • Python에서는 BeautifulSoup/Scrapy를 주로 많이 씀

     

    02 Crawling 저작권

    • 모든 사이트가 크롤링을 허용하는것은 아니다. 각각의 사이트에서 크롤링 봇이나 사람이 아닌것에 대한 접근이 있으면 사이트에서 차단을 하게 된다.
    • 이때 차단과 관계없이 크롤링을 진행하도록 가능하게 하는것이 'User-agent' 상태. 이를 바꿔주면 사람이 크롤링 하는 것 처럼 만들 수 있다.
      (자세한 사항은 다음 링크 참조:https://blog.naver.com/kiddwannabe/221185808375)

     

    03 웹페이지 구성 기술

    • 모든 웹페이지의 기본은 HTML/CSS로 이루어진다. 즉 마크업 언어로 이루어져 있고 이는 태그를 사용하여 작성이 되어 진다. 
    • 웹페이지 크롤링/스크래핑을 통해 데이터를 추출시에는 추출하려는 콘텐츠의 태그를 찾아서 속성의 값이나 콘텐츠 부분을 추출하여야 한다.
    • HTML은 보통 각각의 영역에 큰 태그로 이루어 진다 (<head>, <body>, <p> 등등)
    • CSS는 HTML을 꾸며주는 언어로 큰 태그안에 속성으로 표시가 된다 (<h2 id="t1">, <p class=""> 등등)
    • JS 언어도 있다. JS는 HTML/CSS로 이루어진 웹페이지를 동적으로 표현하기 위한 언어이다. 

     

    04 웹 콘텐츠 요청 

    • urllib 패키지
      URL 문자열과 웹 요청에 관련된 모듈들을 제공
      주요 urllib 모듈 2가지
      
      urllib.request - URL 문자열을 가지고 요청 기능 제공
      - URL문자열을 가지고 HTTP 요청 수행
      - 웹 서버로부터 받은 응답을 래핑하는 객체
      - 응답 헤더나 응답 바디의 내용을 추출하는 메서드 제공
      
      urllib.parse - URL 문자열을 파싱하여 해석하는 기능 제공​
      - urllib.parse.urlencoded() 
      → 딕셔너리 형태로 지정된 값을 정해진 규격의 'Query' 문자열 또는 파라미터 문자열로 리턴

    - urllib을 사용하여 이미지 다운로드

    from urllib.request import urlretrieve
    
    url="https://imgnews.pstatic.net/image/477/2021/08/03/0000312553_001_20210803133918005.jpg?type=w647"
    savename = "C:\devtools\pythonworkspace/image00.jpg"
    urlretrieve(url, savename)
    print("Saved")

    - urllib을 사용하여 일기예보 뽑기

    from urllib.request import urllib.parse
    
    API = "https://www.weather.go.kr/weather/forecast/mid-term-rss3.jsp?"
    values = {'stnId':'159'}
    params = urllib.parse.urlencode(values)
    url = API + params
    
    print("url=", url)
    
    url= https://www.weather.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=159
    
    
    
    data = urllib.request.urlopen(url).read()
    text = data.decode('utf-8')
    print(text)
    
    <?xml version="1.0" encoding="utf-8" ?>
    <rss version="2.0">
    <channel>
    <title>기상청 육상 중기예보</title>
    <link>http://www.kma.go.kr/weather/forecast/mid-term_06.jsp</link>
    <description>기상청 날씨 웹서비스</description>
    <language>ko</language>
    <generator>기상청</generator>
    <pubDate>2021년 12월 09일 (목)요일 06:00</pubDate>
     <item>
    <author>기상청</author>
    <category>육상중기예보</category>
    <title>경상남,북도 육상 중기예보 - 2021년 12월 09일 (목)요일 06:00 발표</title>
    ...
    1. API 특성상 각 지역의 기상예보를 받고싶으면 API 주소 + 지역번호가 들어가야 하므로 API 세팅
    2. urlencoded() 를 쓰기 위하여 딕셔너리값 설정 (values)
    3. 파리미터로 넘기는 값 설정(params)
    4. 최종 URL 완성
    5. urllib.request.urlopen().read()를 써서 내용을 읽어 옴
    6. 최종적으로 decode()를 하여 utf-8로 변경

     

     

     

    05 RQUESTS 활용

    • urllib과 큰 차이는 없으나 주로 requests를 많이 사용 한다. 그 이유는 requests.get()의 활용 때문
    • HTTP 프로토콜과 관련된 기능을 지원
    • requests의 대표 함수는 아래와 같다
      HTTP 요청을 서버에 보내고 응답을 받아오는 기능을 주로 지원한다.&amp;nbsp;
    • requests 실습
      import requests
      
      params = {'catagory':'여행', 'page':100}
      url = "http://unico2013.dothome.co.kr/crawling/exercise.php"
      r = requests.get(url, params = params)
      r.encoding = "utf-8"
      print(r.text)
      
      <!DOCTYPE html>
      <html>  
        <head>    
         <meta charset="utf-8">    
         <title>TEST</title>  
        </head>  
        <body>   
          <h1>전달된 카테고리와 페이지가 없네요!!</h1>   
        </body>
      </html>​
       

    import urllib.request
    import urllib.parse
    params = urllib.parse.urlencode({'category': '역사 ', 'page':25})
    url = "http://unico2013.dothome.co.kr/crawling/exercise.php?%s" % params
    
    print(url)
    
    with urllib.request.urlopen(url) as f:
        print(f.read().decode('utf8'))
        
    <!DOCTYPE html>
    <html>  
      <head>    
       <meta charset="utf-8">    
       <title>TEST</title>  
      </head>  
      <body>   
        <h1 style='color : red'>카테고리 : 역사 </h1>
        <h2 style='color : blue'>페이지 : 25</h2>   
      </body>
    </html>

     

     

Designed by Tistory.