본문 바로가기

파이썬 python/데이터 수집 data collection

크롤링

크롤링 (Crawling)

  • 자동으로 웹페이지 정보를 수집하는 일

 

 

스크래핑 (Scraping)

  • 크롤링을 통해 수집한 정보를 분석해 필요한 정보만 추출하는 일

 

 

HTML(Hyper Text Markup Language)

  • 웹페이지에 필요한 구성 요소를 구성하는 Markup 언어
  • 태그를 이용해 화면의 레이아웃 구조와 텍스트, 요소 등을 표현함
html
<!DOCYTYPE HTML>
<html>
    <head>
        <title>웹문서의 제목</title>
        <meta charset="utf-8">
    </head>
    
    <body>
        웹문서의 내용(실제 브라우저에 표시되는 내용)
    </body>
</html>

 

 

CSS

  • HTML의 요소를 꾸며주는 스타일 시트
  • css 선택자를 이용해 html 요소에 접근하여 꾸며줌
  • css 선택자
    • 태그명으로 접근하는 예시 (a 태그에 접근: a)
    • 태그의 class 속성명으로 접근 (class = "btn": .btn)
    • 태그의 id 속성명으로 접근 (id = "btn": #btn)

 

html 페이지 예시

<!DOCTYPE html>

<html>
    <head>
        <meta charset="UTF-8">
        <title>HTML & CSS 연습</title>
        
        <style type="text/css">
        /* 나는 css 주석 입니다. */

        h2{
            border-bottom: 3px solid #000;
        } 
        .box{padding: 20px;border-bottom: 1px solid red;}

        #css-doc-link{display: inline-block;border: 2px dotted blue;}

        </style>
        
    </head>

    <body>
        <!-- 나는 HTML 주석 입니다. -->

        <!-- h 태그는 제목을 표시할 때 사용 하는 태그 h1 ~ h6 까지 있음 -->
        <h1>나의 HTML 페이지</h1>
        <h2>태그를 소개합니다.</h2>


        <!-- div 태그는 레이아웃을 나누는데 주로 쓰이는 태그 -->
        <div class="box">
            <h3 style="color:blue">하이퍼링크만들기</h3>

            <!-- a 태그는 링크를 걸어주는 태그 -->
            <a href="https://naver.com" target="_blank">네이버로 이동하기</a><br>
            <a href="https://www.google.com/" target="_blank">구글로 이동하기</a><br>
        </div>

        <div class="box">
            <h3 class="mytitle">목록 만들기</h3>

            <!-- ul 태그는 목록을 만드는 태그 -->
            <ul>
                <li class="mylang">넘파이</li>
                <li class="mylang">판다스</li>
                <li class="mylang">사이킷런</li>
                <li class="mylang">파이토치</li>
            </ul>
        </div>
        
        <div class="box">
            <h3>이미지 활용하기</h3>

            <!-- img 태그는 이미지를 삽입하는 태그 -->
            <img src="data/html_img.png">
            <br> <!-- 줄바꿈 태그 -->
            <a id="css-doc-link" href="https://developer.mozilla.org/ko/docs/Web/CSS" target="_blank">
                <img src="data/css_img.png">
            </a>
            
        </div>    
 
        <div class="box">
            <h3>문단 만들기</h3>

            <!-- p 태그는 문단을 만드는 태그 -->
            <p>
                기계 학습 또는 머신 러닝은 경험을 통해 자동으로 개선하는 컴퓨터 알고리즘의 연구이다.<br>
                인공지능의 한 분야로 간주된다. <br>
                컴퓨터가 학습할 수 있도록 하는 알고리즘과 기술을 개발하는 분야이다. <br>
                가령, 기계 학습을 통해서 수신한 이메일이 스팸인지 아닌지를 구분할 수 있도록 훈련할 수 있다.<br>
            </p>
            <p>
                심층 학습 또는 딥 러닝은 여러 비선형 변환기법의 조합을 통해 높은 수준의 추상화를 시도하는 기계 학습 알고리즘의 집합으로 정의되며,<br>
                큰 틀에서 사람의 사고방식을 컴퓨터에게 가르치는 기계학습의 한 분야라고 이야기할 수 있다.
            </p>
        </div>

    </body>
</html>

 

HTML & CSS 연습

나의 HTML 페이지

태그를 소개합니다.

목록 만들기

  • 넘파이
  • 판다스
  • 사이킷런
  • 파이토치

이미지 활용하기


문단 만들기

기계 학습 또는 머신 러닝은 경험을 통해 자동으로 개선하는 컴퓨터 알고리즘의 연구이다.
인공지능의 한 분야로 간주된다.
컴퓨터가 학습할 수 있도록 하는 알고리즘과 기술을 개발하는 분야이다.
가령, 기계 학습을 통해서 수신한 이메일이 스팸인지 아닌지를 구분할 수 있도록 훈련할 수 있다.

심층 학습 또는 딥 러닝은 여러 비선형 변환기법의 조합을 통해 높은 수준의 추상화를 시도하는 기계 학습 알고리즘의 집합으로 정의되며,
큰 틀에서 사람의 사고방식을 컴퓨터에게 가르치는 기계학습의 한 분야라고 이야기할 수 있다.

 

 

HTML 문자열을 파이썬에서 다루기

  • BeautifulSoup 라이브러리를 활용
    • HTML 문자열을 Element 객체로 변경 (문자열의 요소화)

 

 

powershell에서 가상 환경 들어가서 설치

 

pip install beautifulsoup4

 

 

적용하기

>>> from bs4 import BeautifulSoup

>>> soup = BeautifulSoup(html_str,'html.parser')
>>> type(soup)
bs4.BeautifulSoup

 

 

접근 - 태그명, 속성명, 속성값 이용

 

  • find("태그명", "속성 값 딕셔너리에 넣기")
    • 한개의 엘리먼트만 찾음

 

#el은 그냥 el이라는 데이터 안에 넣어줄려고 설정한거
>>> el = soup.find("p")
>>> el
<p>
                기계 학습 또는 머신 러닝은 경험을 통해 자동으로 개선하는 컴퓨터 알고리즘의 연구이다.<br/>
                인공지능의 한 분야로 간주된다. <br/>
                컴퓨터가 학습할 수 있도록 하는 알고리즘과 기술을 개발하는 분야이다. <br/>
                가령, 기계 학습을 통해서 수신한 이메일이 스팸인지 아닌지를 구분할 수 있도록 훈련할 수 있다.<br/>
</p>

>>> type(el)
bs4.element.Tag

 

 

#텍스트만 가져오기

>>> el.text
'\n                기계 학습 또는 머신 러닝은 경험을 통해 자동으로 개선하는 컴퓨터 알고리즘의 연구이다.
\n 인공지능의 한 분야로 간주된다. 
\n 컴퓨터가 학습할 수 있도록 하는 알고리즘과 기술을 개발하는 분야이다. 
\n 가령, 기계 학습을 통해서 수신한 이메일이 스팸인지 아닌지를 구분할 수 있도록 훈련할 수 있다.\n'


>>> el.get_text()
'\n                기계 학습 또는 머신 러닝은 경험을 통해 자동으로 개선하는 컴퓨터 알고리즘의 연구이다.
\n 인공지능의 한 분야로 간주된다. 
\n 컴퓨터가 학습할 수 있도록 하는 알고리즘과 기술을 개발하는 분야이다. 
\n 가령, 기계 학습을 통해서 수신한 이메일이 스팸인지 아닌지를 구분할 수 있도록 훈련할 수 있다.\n'

 

# 태그명 가져오기
>>> el.name
'p'


# 부모 요소
>>> el.parent
<div class="box">
<h3>문단 만들기</h3>
<!-- p 태그는 문단을 만드는 태그 -->
<p>
                기계 학습 또는 머신 러닝은 경험을 통해 자동으로 개선하는 컴퓨터 알고리즘의 연구이다.<br/>
                인공지능의 한 분야로 간주된다. <br/>
                컴퓨터가 학습할 수 있도록 하는 알고리즘과 기술을 개발하는 분야이다. <br/>
                가령, 기계 학습을 통해서 수신한 이메일이 스팸인지 아닌지를 구분할 수 있도록 훈련할 수 있다.<br/>
</p>
<p>
                심층 학습 또는 딥 러닝은 여러 비선형 변환기법의 조합을 통해 높은 수준의 추상화를 시도하는 기계 학습 알고리즘의 집합으로 정의되며,<br/>
                큰 틀에서 사람의 사고방식을 컴퓨터에게 가르치는 기계학습의 한 분야라고 이야기할 수 있다.
            </p>
</div>

 

 

# 자식 요소 가져오기

>>> el = soup.find("ul")
>>> el
<ul>
<li class="mylang">넘파이</li>
<li class="mylang">판다스</li>
<li class="mylang">사이킷런</li>
<li class="mylang">파이토치</li>
</ul>

# 이터레이터로 반환

>>> el.children
>>> for e in el.children:
>>>     print(e)
<li class="mylang">넘파이</li>


<li class="mylang">판다스</li>


<li class="mylang">사이킷런</li>


<li class="mylang">파이토치</li>

 

>>> el.text
'\n넘파이\n판다스\n사이킷런\n파이토치\n'

 

 

 

  • `find_all("태그명","속성명:값 딕셔너리")`
    • 여러개를 찾기 때문에 리스트로 반환해줌
>>> soup.find_all("p")
[<p>
                 기계 학습 또는 머신 러닝은 경험을 통해 자동으로 개선하는 컴퓨터 알고리즘의 연구이다.<br/>
                 인공지능의 한 분야로 간주된다. <br/>
                 컴퓨터가 학습할 수 있도록 하는 알고리즘과 기술을 개발하는 분야이다. <br/>
                 가령, 기계 학습을 통해서 수신한 이메일이 스팸인지 아닌지를 구분할 수 있도록 훈련할 수 있다.<br/>
 </p>,
 <p>
                 심층 학습 또는 딥 러닝은 여러 비선형 변환기법의 조합을 통해 높은 수준의 추상화를 시도하는 기계 학습 알고리즘의 집합으로 정의되며,<br/>
                 큰 틀에서 사람의 사고방식을 컴퓨터에게 가르치는 기계학습의 한 분야라고 이야기할 수 있다.
             </p>]

 

 

 

  • 속성명과 속성값을 "key:value"로 해서 딕셔너리로 넣어서 찾아보기
>>> el = soup.find("a",{"id":"css-doc-link"})
>>> el
<a href="https://developer.mozilla.org/ko/docs/Web/CSS" id="css-doc-link" target="_blank">
<img src="data/css_img.png"/>
</a>

 

css 선택자를 이용해 추출

  • 하나만 선택하기
# 태그명으로 선택하는 방법

>>> el = soup.select_one("a")
>>> el
<a href="https://naver.com" target="_blank">네이버로 이동하기</a>

>>> type(el)
bs4.element.Tag

 

# id 선택자를 이용한 방법

>>> soup.select_one("#css-doc-link")
<a href="https://developer.mozilla.org/ko/docs/Web/CSS" id="css-doc-link" target="_blank">
<img src="data/css_img.png"/>
</a>

 

# class 선택자를 이용한 방법

>>> soup.select_one(".mytitle")
<h3 class="mytitle">목록 만들기</h3>

 

  • 여러개 선택하기
    • 리스트로 반환
# body 태그 하위에 모든 p태그를 선택

>>> soup.select("body p")
[<p>
                 기계 학습 또는 머신 러닝은 경험을 통해 자동으로 개선하는 컴퓨터 알고리즘의 연구이다.<br/>
                 인공지능의 한 분야로 간주된다. <br/>
                 컴퓨터가 학습할 수 있도록 하는 알고리즘과 기술을 개발하는 분야이다. <br/>
                 가령, 기계 학습을 통해서 수신한 이메일이 스팸인지 아닌지를 구분할 수 있도록 훈련할 수 있다.<br/>
 </p>,
 <p>
                 심층 학습 또는 딥 러닝은 여러 비선형 변환기법의 조합을 통해 높은 수준의 추상화를 시도하는 기계 학습 알고리즘의 집합으로 정의되며,<br/>
                 큰 틀에서 사람의 사고방식을 컴퓨터에게 가르치는 기계학습의 한 분야라고 이야기할 수 있다.
             </p>]
             


# body 태그 바로 하위에 p태그를 선택

>>> soup.select("body > p")
[] # 바로 밑에 아무것도 없으니까 공백

 

# div 태그 하위에 있는 이런 이름을 가지고 있는 항목을 모두 선택
>>> soup.select("div .box")
[]


# div 태그이면서 클래스 명이 box 인 것만 선택
>>> soup.select("div.box")
[<div class="box">
 <h3 style="color:blue">하이퍼링크만들기</h3>
 <!-- a 태그는 링크를 걸어주는 태그 -->
 <a href="https://naver.com" target="_blank">네이버로 이동하기</a><br/>
 <a href="https://www.google.com/" target="_blank">구글로 이동하기</a><br/>
 </div>,

Output is truncated.

 

# a 항목 안에서 이름이 #css-doc-link 이거인거를 선택하겠다
# (= a 태그이면서 아이디명이 css-doc-link 인것을 선택하기)
#얘도 and 조건인걸로 생각하기 

>>> soup.select("a#css-doc-link")
[<a href="https://developer.mozilla.org/ko/docs/Web/CSS" id="css-doc-link" target="_blank">
 <img src="data/css_img.png"/>
 </a>]


# a 태그 하위에 있는 #css-doc-link 이런 이름을 가지고 있는 항목을 모두 선택

>>> soup.select("a #css-doc-link")
[] 
# a태그 하위에 저런 아이디를 가진 항목이 하나도 없어서 공백으로 출력

 

인코딩 에러 예시

 

>>> import requests

>>> url = "https://www.bobaedream.co.kr/list?code=import"
>>> res = requests.get(url)
>>> res.status_code # 늘 작동 잘 되나 안되나 확인
200


#인코딩되기 전 상태 = 디코딩상태여서 다 깨짐

>>> res.encoding
>>> print(res.text)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-Transitional.dtd" >
<html xmlns="http://www.w3.org/1999/xhtml" lang="ko">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  <meta name="viewport" content="width=1100, user-scalable=yes"/>
  <title>수입차게시판 | 보배드림 커뮤니티</title>
  <META NAME="KEYWORDS" CONTENT="ì¤‘ê³ ì°¨ 보배드림" />
  <META NAME="DESCRIPTION" CONTENT="ì¤‘ê³ ì°¨ 보배드림" />
  <META NAME="subject" CONTENT="ì¤‘ê³ ì°¨ 보배드림" />
  <META NAME="author" content="ì¤‘ê³ ì°¨ 보배드림" />
  <META NAME="copyright" CONTENT="ì¤‘ê³ ì°¨ 보배드림" />
  <Meta name="classification"		content="ì¤‘ê³ ì°¨ 보배드림" />
  <meta name="referrer" content="no-referrer-when-downgrade">	
Output is truncated.





# 깨짐 방지를 위하여 인코딩 된 content 사용

>>> soup = BeautifulSoup(res.content,'html.parser')
>>> soup
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-Transitional.dtd" >

<html lang="ko" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<meta content="IE=edge" http-equiv="X-UA-Compatible"/>
<meta content="width=1100, user-scalable=yes" name="viewport"/>
<title>수입차게시판 | 보배드림 커뮤니티</title>
<meta content="중고차 보배드림" name="KEYWORDS"/>
<meta content="중고차 보배드림" name="DESCRIPTION"/>
<meta content="중고차 보배드림" name="subject"/>
<meta content="중고차 보배드림" name="author"/>
<meta content="중고차 보배드림" name="copyright"/>
<meta content="중고차 보배드림" name="classification"/>
<meta content="no-referrer-when-downgrade" name="referrer"/>

Output is truncated.


# 인코딩 상태의 res.content를 BeautifulSoup에 담아줌

>>> soup = BeautifulSoup(res.content,'html.parser')
>>> soup

 

 

xpath (XML Path Language)

  • XML이나 HTML의 요소를 선택할 때 사용
  • xpath 구성 요소
    • //로 시작 (최상위 엘리먼트라는 의미)
    • 중간에 있을 경우 하위에 모든 엘리먼트를 찾겠다는 의미
    • /: 바로 위 엘리먼트를 찾겠다는 의미
    • *: 모든 태그라는 의미
    • [@id  = "id name"]: id가 id name 인 엘리먼트
    • div [3]
      • 같은 레벨의 div 태그 중 3번째 엘리먼트를 선택
      • 1부터 시작함

 

 

 

 

powershell에서 가상 환경 들어가서 설치

 

pip install lxml

 

>>> import lxml.html
>>> print(html_str)
<!DOCTYPE html>

<html>
    <head>
        <meta charset="UTF-8">
        <title>HTML & CSS 연습</title>
        
        <style type="text/css">
        /* 나는 css 주석 입니다. */

Output is truncated.

 

 

>>> root = lxml.html.fromstring(html_str)
>>> root
<Element html at 0x1c0b668b400>

 

 

xpath 메소드 (선택된 요소들을 리스트로 반환)

  • XML이나 HTML의 요소를 선택할 때 사용
  • xpath의 구성 요소
  • // 로 시작 (최상위 엘리먼트라는 의미)
    • 참고) 중간에 있을 경우에는 하위에 모든 엘리먼트를 찾겠다는 의미
  • /: 바로 하위 엘리먼트를 찾겠다는 의미
  • *: 모든 태그라는 의미
  • [@id = "id name"]: id가 id name인 엘리먼트
  • div [3]
    • 같은 레벨의 div 태그중에 3번째 엘리먼트를 선택
    • 1부터 시작

 

 

 

powershell에서 가상 환경 들어가서 설치

 

pip install lxml.html

 

>>> print(html_str)
<!DOCTYPE html>

<html>
    <head>
        <meta charset="UTF-8">
        <title>HTML & CSS 연습</title>
        
        <style type="text/css">
        /* 나는 css 주석 입니다. */

        h2{
            border-bottom: 3px solid #000;
        } 
        .box{padding: 20px;border-bottom: 1px solid red;}

        #css-doc-link{display: inline-block;border: 2px dotted blue;}

        </style>
        
    </head>

    <body>
        <!-- 나는 HTML 주석 입니다. -->
...

    </body>
</html>

Output is truncated.

>>> root = lxml.html.fromstring(html_str)
>>> root
<Element html at 0x1c0b668b400>

 

 

  • xpath 메소드
    • 선택된 요소들을 리스트로 반환
>>> root.xpath("//html/title") # css : html > title
[]

>>> lst = root.xpath("//html//title") # css: html title
>>> lst
[<Element title at 0x1c0b04085e0>]

>>> lst[0].txt
'HTML & CSS 연습'

 

 

  • 모든 요소들 중에서 class 값이 box인 요소들을 찾자
>>> root.xpath("//*[@class='box']") # css : .box
[<Element div at 0x1c0b3ddc7c0>,
 <Element div at 0x1c0b5a41900>,
 <Element div at 0x1c0b5a41810>,
 <Element div at 0x1c0b5a419a0>]

 

>>> root.xpath("//div[@class='box']") # css : div.box
[<Element div at 0x1c0b3ddc7c0>,
 <Element div at 0x1c0b5a41900>,
 <Element div at 0x1c0b5a41810>,
 <Element div at 0x1c0b5a419a0>]

 

 

  • 요소의 순번을 이용해서 찾기
>>> root.xpath('//ul/li[2]')[0].text
'판다스'

 

 

  • id 속성을 이용해서 찾기
root.xpath[@id="id name"]

 

 

User Agent

  • 브라우저의 종류에 대한 정보
  • 요청시 header 영역에 담김

 

>>> res = requests.get("https://www.onoffmix.com/")
>>> res.status_code
500

 

 

 

 

powershell에서 가상 환경 들어가서 설치

 

pip install fake_useragent

 

>>> from fake_useragent import UserAgent
>>> ua = UserAgent()

>>> ua.random
'Opera/6.05 (Windows XP; U)  [en]'

>>> headers = {
>>>     "user-agent" : ua.random
>>> }

>>> res = requests.get("https://www.onoffmix.com/",headers=headers)
>>> res.status_code
503
#200이었던게 503으로 바뀜


>>> res.text
'\t\t<!DOCTYPE html>\n<html lang="ko">\n<head>\n    <meta charset="UTF-8">\n    <meta 
# 옆으로 길게 출력된다

ㅇㅇ 옆으로 길게 출력된다고 알고 있어라 너무 길어서 지웠다

 

 

 

랜더링 (Rendering)

  • 객체(object)를 2차원 화면인 하나의 장면으로 바꾸어 표현하는 것
  • 화면에 표시할 웹 페이지를 만드는 과정

 

 

SSR (Server Side Rendering) & CSR(Client Side Rendering)

  • SSR
    • 서버로부터 완전하게 만들어진 HTML을 받아와 페이지 전체를 렌더링

 

  • CSR
    • 사용자 요청에 따라 필요한 데이터만 응답받아 클라이언트측 브라우저에 렌더링

 

Selenium

  • 프로그래밍을 통해 브라우저를 사용할 수 있도록 해주는 웹사이트 테스트 도구
  • 사용자가 인터넷 브라우저를 통해 특정 웹사이트에 접속해 사용하는 것처럼 동작 지원
  • 웹 테스트 자동화 도구
  • ver 3.0 (단점)
    • os 버전에 맞는 드라이버를 다운로드 해야한다
    • 업데이트하면 버전에 맞게 드라이버를 다시 다운로드 해야한다
  • ver 4.0 (업그레이드)
    • WebDriver Manager가 자동으로 Web browser의 버전을 확인하고 OS와 버전에 맞는 webdriver를 다운로드하고 실행

 

 

 

 

pip install webdriver-manager
pip install selenium

 

 

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium .webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup

 

 

>>> options = webdriver.ChromeOptions()
>>> options.add_argument('--start-maximized')

>>> driver = webdriver.Chrome(
>>>     service=Service(ChromeDriverManager().install()),
>>>     options=options
>>> )


>>> driver.quit()

>>> driver = webdriver.Chrome(
>>>     service=Service(ChromeDriverManager().install()),
>>>     options=options
>>> )

>>> driver.get("https://www.youtube.com")

>>> driver.implicitly_wait(5)
>>> page_source = driver.page_source

>>> driver.quit()

 

 

>>> print(page_source)

# 길어서 잘랐다
<html style="font-size: 10px;font-family: Roboto, Arial, sans-serif;" lang="ko-KR" system-icons="" typography="" typography-spacing="" darker-dark-theme="" darker-dark-theme-deprecate=""><head><script data-original-src="/s/player/cfa9e7cb/player_ias.vflset/ko_KR/endscreen.js" nonce="ulzpmNprgqTEQ0p58mFnBg" src="/s/player/cfa9e7cb/player_ias.vflset/ko_KR/endscreen.js"></script><script data-original-src="/s/player/cfa9e7cb/player_ias.vflset/ko_KR/captions.js" nonce="ulzpmNprgqTEQ0p58mFnBg" src="/s/player/cfa9e7cb/player_ias.vflset/ko_KR/captions.js"></script><script data-original-src="/s/player/cfa9e7cb/player_ias.vflset/ko_KR/inline_preview.js" nonce="ulzpmNprgqTEQ0p58mFnBg" src="/s/player/cfa9e7cb/player_ias.vflset/ko_KR/inline_preview.js"></script><meta http-equiv="origin-trial" content="Ash03CRZ76itNFXlh04s/Kx5TBY+uSojTNLnxUHnV26xBFl3D+0epAJQ98cRF8WLbalbrCwfmJ4GSLOYXit09g0AAABteyJvcmlnaW4iOiJodHRwczovL3lvdXR1YmUuY29tOjQ0MyIsImZlYXR1cmUiOiJQcml2YWN5U2FuZGJveEFkc0FQSXMiLCJleHBpcnkiOjE2ODgwODMxOTksImlzU3ViZG9tYWluIjp0cnVlfQ=="><script nonce="ulzpmNprgqTEQ0p58mFnBg">var ytcfg={d:function(){return window.yt&&yt.config_||ytcfg.data_||(ytcfg.data_={})},get:function(k,o){return k in ytcfg.d()?ytcfg.d()[k]:o},set:function(){var a=arguments;if(a.length>1)ytcfg.d()[a[0]]=a[1];else for(var k in a[0])ytcfg.d()[k]=a[0][k]}};
window.ytcfg.set('EMERGENCY_BASE_URL', '\/error_204?t\x3djserror\x26level\x3dERROR\x26client.name\x3d1\x26client.version\x3d2.20230515.01.00');</script><script nonce="ulzpmNprgqTEQ0p58mFnBg">(function(){window.yterr=window.yterr||true;window.unhandledErrorMessages={};window.unhandledErrorCount=0;
window.onerror=function(msg,url,line,columnNumber,error){var err;if(error)err=error;else{err=new Error;err.stack="";err.message=msg;err.fileName=url;err.lineNumber=line;if(!isNaN(columnNumber))err["columnNumber"]=columnNumber}var message=String(err.message);if(!err.message||message in window.unhandledErrorMessages||window.unhandledErrorCount>=5)return;window.unhandledErrorCount+=1;window.unhandledErrorMessages[message]=true;var img=new Image;window.emergencyTimeoutImg=img;img.onload=img.onerror=function(){delete window.emergencyTimeoutImg};
var combinedLineAndColumn=err.lineNumber;if(!isNaN(err["columnNumber"]))combinedLineAndColumn+=":"+err["columnNumber"];var stack=err.stack||"";var values={"msg":message,"type":err.name,"client.params":"unhandled window error","file":err.fileName,"line":combinedLineAndColumn,"stack":stack.substr(0,500)};var thirdPartyScript=!err.fileName||err.fileName==="<anonymous>"||stack.indexOf("extension://")>=0;var replaced=stack.replace(/https:\/\/www.youtube.com\//g,"");if(replaced.match(/https?:\/\/[^/]+\//))thirdPartyScript=
true;else if(stack.indexOf("trapProp")>=0&&stack.indexOf("trapChain")>=0)thirdPartyScript=true;else if(message.indexOf("redefine non-configurable")>=0)thirdPartyScript=true;var baseUrl=window["ytcfg"].get("EMERGENCY_BASE_URL","https://www.youtube.com/error_204?t=jserror&level=ERROR");var unsupported=message.indexOf("window.customElements is undefined")>=0;if(thirdPartyScript||unsupported)baseUrl=baseUrl.replace("level=ERROR","level=WARNING");var parts=[baseUrl];for(var key in values){var value=values[key];
if(value)parts.push(key+"="+encodeURIComponent(value))}img.src=parts.join("&")};
(function(){function _getExtendedNativePrototype(tag){var p=this._nativePrototypes[tag];if(!p){p=Object.create(this.getNativePrototype(tag));var p$=Object.getOwnPropertyNames(window["Polymer"].Base);for(var i=0,n=void 0;i<p$.length&&(n=p$[i]);i++)if(!window["Polymer"].BaseDescriptors[n])try{p[n]=window["Polymer"].Base[n]}catch(e){throw new Error("Error while copying property: "+n+". Tag is "+tag);}try{Object.defineProperties(p,window["Polymer"].BaseDescriptors)}catch(e$0){throw new Error("Polymer define property failed for "+
Object.keys(p));}this._nativePrototypes[tag]=p}return p}function handlePolymerError(msg){window.onerror(msg,window.location.href,0,0,new Error(Array.prototype.join.call(arguments,",")))}var origPolymer=window["Polymer"];var newPolymer=function(config){if(!origPolymer._ytIntercepted&&window["Polymer"].Base){origPolymer._ytIntercepted=true;window["Polymer"].Base._getExtendedNativePrototype=_getExtendedNativePrototype;window["Polymer"].Base._error=handlePolymerError;window["Polymer"].Base._warn=handlePolymerError}return origPolymer.apply(this,
arguments)};var origDescriptor=Object.getOwnPropertyDescriptor(window,"Polymer");Object.defineProperty(window,"Polymer",{set:function(p){if(origDescriptor&&origDescriptor.set&&origDescriptor.get){origDescriptor.set(p);origPolymer=origDescriptor.get()}else origPolymer=p;if(typeof origPolymer==="function")Object.defineProperty(window,"Polymer",{value:origPolymer,configurable:true,enumerable:true,writable:true})},get:function(){return typeof origPolymer==="function"?newPolymer:origPolymer},configurable:true,
enumerable:true})})();}).call(this);

 

 

 

>>> driver = webdriver.Chrome(
>>> service=Service(ChromeDriverManager().install()),
>>>     options=options
>>> )

#유튜브 들어가기
>>> driver.get("https://www.youtube.com")

#아거는 로딩 될때까지 기다리는거지 html완전히 그렫질때까지 기다려 주는건 아님 확실히 기다리려면 time.sleep 사용 
# (유튜브처럼 엄청 큰 사이트만 나머지는 이거 사용해도 ㄱㅊ)
>>> driver.implicitly_wait(5)

# 유튜브 들어가서 키워드 입력하기 input이면서 id가 serach인것 진행
>>> driver.find_element(By.CSS_SELECTOR, "input#search").send_keys("강형욱 레전드")
>>> time.sleep (3)

# 그다음 돋보기 누르기
>>> driver.find_element(By.CSS_SELECTOR, "button#search-icon-legacy").click()
>>> time.sleep(10)

>>> xpath_str = ""
>>> driver.find_element(By.XPATH,xpath_str).click()
>>> time.sleep(5)
>>> driver.quit()

 

이렇게 실행하면 사이트에 들어가져요!!

'파이썬 python > 데이터 수집 data collection' 카테고리의 다른 글

크롤링 예제 & 실습  (0) 2023.06.10