크롤링&스크래핑 실습 - Scraping 편(1)


  • 스크래핑을 할 때 필요한 모듈 및 함수들을 알아보자.

    • urllib 라이브러리
    • requests 라이브러리

스크래핑 관련 함수

[builtwith, whois 라이브러리]

  • builtwith : 사용된 웹 기술 확인

  • whois : 웹사이트 소유자 확인

    image1

[urllib 라이브러리]

  • urllib.robotparser

    robots.txt를 읽고 주어진 봇의 접근권한 여부를 True/False로 출력

    from urllib import robotparser
    robot = robotparser.RobotFileParser()
    robot.set_url('https://www.google.com/robot.txt')
    robot.read()
    robot.can_fetch('*', 'https://www.google.com') #(agent이름, uri)
    '''
    True
    '''
    
  • urllib.parse

    URL주소 처리 관련

    ※ URL 파라미터는 key, value로 나타내어져 있음

    'https://www.google.com/search?q=%ED%8C%8C%EC%9D%B4%EC%8D%AC&oq=%ED%8C%8C%EC%9D%B4%EC%8D%AC&aqs=chrome..69i57j0l2j69i59j0j69i61l3.2641j0j7&sourceid=chrome&ie=UTF-8'
    # URI 뒤에 ?로 분리되어 있으며, 각 key/value는 &로 분리되어있음
      
    params = {
    'q' : '%ED%8C%8C%EC%9D%B4%EC%8D%AC',
    'oq' : '%ED%8C%8C%EC%9D%B4%EC%8D%AC',
    'aqs' : 'chrome..69i57j0l2j69i59j0j69i61l3.2641j0j7',
    'sourceid': 'chrome&ie=UTF-8'
    }
    
    1. urllib.parse.urlparse - breaks string into 6 parts

      image1

    2. urllib.parse.quote /.quote_plus / .unquote - 퍼센트코드 변환 관련

      quote vs. quote_plus = 띄어쓰기를 %20로 표현하거나 +로 표현해줌 => 사이트 별로 다르니 잘 확인해야 함

      image1

    3. urllib.parse.urlencode - 파라미터 주어질 때 key=value꼴로 변환

      image1

    4. urllib.parse.urljoin - URI + 파라미터를 합쳐 전체 주소 생성

      image1

  • urllib.request

    urlopen함수 통해 웹에 요청 보내고 HTTPResponse를 리턴값으로 받음

    from urllib import request
      
    resp = request.urlopen('https://www.google.com') 
      
    print(resp.geturl()) 
    print(resp.code) 
    print(resp.reason) 
    print(resp.getheaders()) 
    '''
    https://www.google.com
    200
    OK
    [('Date', 'Sun, 26 Jul 2020 12:39:00 GMT'),...('Content-Type', 'text/html; charset=ISO-8859-1'), ...]
    '''
    
    body = resp.read()
    body #bytestring 형태의 html 내용물 출력
    body.decode('UTF-8') #str으로 변환
    

    request.urlopen(‘주소’)의 경우, 무조건 get방식으로 가져옴 -> post방식 사용할 땐 requests.Request 사용해 구체적으로 명시

    url = 'http://httpbin.org/post'
    params = {
        'key':'value',
        'name':'한글'
    }
      
    resp = urlopen(request.Request(url=url,data=urlencode(params).encode('utf8'),
                                   method='POST')) #param넘김
    print(resp.headers)
    print(resp.read().decode('utf8')) #성공적으로 출력
    
  • urllib.response

    urllib.request로부터 internally 많이 쓰임

  • urllib.error

    defines exception class raised by urllib.request

    from urllib.error import HTTPError
      
    try:
        resp = request.urlopen('https://www.google.com/search?q=파이썬')
    except HTTPError as e:
        print(e.code, e.reason, e.headers)
      
    '''
    403
    Forbidden
    Content-Type: text/html; charset=UTF-8
    Date: Sun, 26 Jul 2020 13:03:18 GMT...
    '''
    

    forbidden의 경우 사람이 아닌 로봇이 접근해서 발생하는 경우가 대부분 -> user agent를 변경해준다






© by Jihye Kwon