ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python webCrawling 웹크롤링이란? requests / BeautifulSoup / select_one /
    Python 2022. 7. 18. 14:15
    반응형

    big data

    디지털 환경에서 생성되는 수치, 문자, 이미지, 영상 데이터를 

    모두 포함하는 대규모 데이터

     

    Five v

     

    데이터 분석 과정

    1. 데이터 수집 & 저장

    - 웹페이지 , iot,  open api 등

    - RDBMS & NOSQL

     

    2. 데이터 처리 & 분석

    - hive, mahout 등

     

    3. 데이터 시각화 & 응용

    - 그래프 등

     

     

    수집 데이터 형태

    1. 정형 

    - 데이터 베이스의 정해진 규칙에 맞게 데이터를 들어간 데이터 중 수치 만으로 의미 파악이 쉬운 데이터

    ex) RDBMS, EXCEL 등

     

    2. 반정형

    - 고정된 필드에 저장된 데이터는 아니지만, 메타 데이터 및 스키마를 포함하는 데이터

     

    ex) XML, HTML, JSON , CSV등

    3. 비정형

    - 고정된 필드에 저장되어 있지 않는 데이터

    ex) SNS, 영상, 이미지, 음성, 텍스트  등 

     

    웹 크롤링? (Web Crawling)

    - 웹 사이트의 내용에 접근하여 원하는 정보를 추출해 내는 행위

     

    웹 페이지에서 데티어 수집할 떄 생각할 것들

    - web page가 어떤 구조(HTML)로 되어있는지

    - 어떻게(CSS Selector) 원하는 데이터를 추출할 것인지

     

    웹 크롤링의 순서

    1. 웹사이트의 html문서 요청

    2. 크롤러를 이용하여 데이터 추출

    3. 추출한 데이터를 가공 및 저장

     

    웹 크롤링을 위한 라이브러리

    1. requests

    - 접근할 웹 페이지의 데이터를 요청/응답 받기 위한 라이브러리

    2. BeautifulSoup

    - html 문서에서 원하는 데이터를 추출하기 쉽게 해주는 라이브러리 

     

    requests 라이브러리

    - 웹 페이지의 HTML문서를 요청/응답받기 위한 라이브러리

    페이지 가져오기

    import requests as req
    --라이브러리를 사용하기 위한 추가
    #구글 홈페이지로 테스트
    url = 'https://www.google.co.kr'
    # url에 https가 꼭 붙어야한다.
    req.get(url)
    # Response [200]이 나와야 정상적인 응답 이외의 코드는 오류
    res = req.get(url)
    res.text
    #문자열 타입의 HTML문서 데이터

     

    돈가스검색

    선택한 부분이 검색어가 들어가는 부분이다.  

    저 부분을 지우고 >> get(url)사용하기

    gl_search_url = 'https://www.google.co.kr/search?&sxsrf=ALiCzsYmG9b2vJeVLl_B6Uua8n3J4WVJYA%3A1658110693026&ei=5cLUYsaSAcedseMPgMOhoAw&ved=0ahUKEwiGmezWr4H5AhXHTmwGHYBhCMQQ4dUDCA4&uact=5&oq=%EC%B9%98%EC%A6%88%EB%8F%88%EA%B0%80%EC%8A%A4&gs_lcp=Cgdnd3Mtd2l6EAMyBAgAEAoyBAgAEAoyBAgAEAoyBAgAEAoyBAgAEAoyBAgAEAoyBAgAEAoyBAgAEAoyBAgAEAoyBAgAEAo6BAgAEEc6CggAEB4QBxAKECo6CggAEB4QDxAHEAo6BAgjECc6BQgAEIAEOgcIABCABBAKOggIABAeEAcQCkoECEEYAEoECEYYAFCtuQFYkMQBYNjGAWgCcAJ4AYABjQGIAasGkgEDMS42mAEAoAEByAEKwAEB&sclient=gws-wiz'
    
    #url가져오는변수명 = req.get(url변수, params={"추가할객체":"검색할단어"})
    res = req.get(gl_search_url, params={"q":"돈까스"})
    
    res.text

     

     

     

    BeautifulSoup 라이브러리

    - 응답받은 HTML문서 내의 데이터를 추출할 수 있는 라이브러리
    1. 문자열 HTML >> 파이썬 객체로 변환
    2. HTML객체를 반환하는 함수를 이용하여 데이터 수집

     

    import requests as req
    from bs4 import BeautifulSoup as bs
    
    nv_url = 'https://search.naver.com/search.naver?sm=tab_hty.top&where=nexearch&query=%ED%83%80%EC%BD%94%EC%95%BC%EB%81%BC&oquery=%ED%83%80%EC%BD%94%EC%95%BC%EB%81%BC&tqi=hWgbedprvmZssDVmtjZssssssU4-299136'
    #타코야끼 검색 url
    res = req.get(nv_url)
    
    #bs(변환할 데이터, 변환방식) : 문자열 html문서 >> 파이썬 객체로 변환
    # 변환방식 : lxml > html.parser > html5lib
    html = bs(res.text, 'lxml')

     

     

    원하는 부분 가져오기

     

    태그 사용

    #변환한데이터변수명.select_one('태그명').text
    html.select_one('title').text

     

    클래스 선택자 사용

    #select_one(css선택자) : 선택자와 일치한 하나의 html객체를 반환

    # 클래스 선택자를 이용하여 데이터 수집
    # 양쪽 끝 공백제거 : strip()
    html.select_one('a.lnk_head').text.strip()

     

    같은 선택자의 인덱스로 가져오기

    # select (CSS선택자) : 선택자와 일치한 모든 html객체를 반환(리스트)

    adList = html.select('a.lnk_head')
    adList[14].text

     

    선택자 다 가져오기 (for)

    for s1 in adList:
        print(s1.text.strip())
    
    for i in range(15):
        print(adList[i].text.strip())

     

    실습

    import requests as req #웹페이지 요청/응답 라이브러리
    from bs4 import BeautifulSoup as bs #응답받은 데이터 추출 라이브러리
    
    header = {
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
    } # 요청하는 브라우저의 정보를 설정
    
    news_url = 'https://n.news.naver.com/mnews/article/031/0000686189?sid=101' # url
    
    res = req.get(news_url, headers=header)
    # url로 서버와 연결
    
    html = bs(res.text, 'lxml')
    #HTML문서 >> 파이썬객체로 변환
    
    head = html.select_one('.media_end_head_headline').text
    # 선택자를 이용해 데이터 하나 가져오기
    
    newsList = html.select_one('#dic_area').text
    # 선택자를 이용해 데이터 가져오기
    
    print(head,"\n")
    # header출력
    
    print(newsList)
    #newList출력
    반응형

    댓글

Designed by Tistory.