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