728x90
◎ HTTP 이해하기
- Get 요청:데이터를 URL에 포함하여 전달(주로 리소스 요청에 사용)
- Post 요청: 데이터를 Form data에 포함하여 전달(주로 로그인에 사용)
※ HTML (Hyper Text Markup Language) : 웹사이트를 생성하기 위한 언어로 문서와 문서가 링크로 연결되어 있고, 태그를 사용하는 언어
◎ Requests 모듈
- http request/response를 위한 모듈
- HTTP method를 메소드 명으로 사용하여 request 요청 예) get, post
⑴ get 요청하기
# get 요청의 기본 구조
import requests
url = 'https://news.v.daum.net/v/20190728165812603' # 원하는 사이트를 불러올 수 있다.
resp =requests.get(url)
resp
resp.raise_for_status() # resp가 정상이면 실행이 되고 비정상이면 종료하는 언어
⑵ post 요청하기
# Post 요청의 기본 구조
url1 = 'https://www.kangcom.com/member/member_check.asp'
data = {
'id' : '****', #자신의 아이디
'pwd' : '*****' # 자신의 비밀번호
}
res = requests.post(url1,data=data)
res.text
⑶ Beautifulsoup 모듈 사용하기
from bs4 import BeautifulSoup # 라이브러리 불러오는 코드
############################3### html의 예시 #############
html = '''
<html>
<head>
<title>BeautifulSoup test</title>
</head>
<body>
<div id='upper' class='test' custom='good'>
<h3 title='Good Content Title'>Contents Title</h3>
<p>Test contents</p>
</div>
<div id='lower' class='test' custom='nice'>
<p>Test Test Test 1</p>
<p>Test Test Test 2</p>
<p>Test Test Test 3</p>
</div>
</body>
</html>'''
##########################################################
soup = BeautifulSoup(html) # BeautifulSoup 선언
soup.find("h3") # find 함수는 첫번째 태크를 찾아 반환
soup.find('div',custom='nice') # 원하는 값을 찾기 위해 주건을 주어 찾는다.
soup.find('div',class_='test') # class는 class_= 로 선언한다
attrs = {'id':'upper','class':'test'}
soup.find('div',attrs=attrs) # 여러 조건문일 때 사용
soup.find_all('div') # find_all은 조건에 맞는 모든 tag를 리스트로 반환
※ get_text 함수
- tag안의 value를 추출
- 부모tag의 경우, 모든 자식 tag의 value를 추출
tag = soup.find('h3')
tag.get_text() # value 값 추출
tag.get_text().strip() # 줄 바꿈 같은 부수적인 것 제거
※ attribute 값 추출하기
- tag에 attribute 이름을 [ ]연산을 통해 추출 가능
- 위의 html에서 <h3 title='Good Content Title'>Contents Title</h3> '<>'안에 있는 값 'Good Content Title'를 attribute라 하며 해당 값을 추출해 보겠습니다.
tag = soup.find('h3')
tag['title'] # attribute 값 추출
※ 꿀 tip들
# 밑에 있는 형제 타입 불러오는 코드
rank2 = rank1.next_sibling #안될 경우 밑에 코드 실행
rank2 = rank1.next_sibling.next_sibling
rank3 = rank2.next_sibling.next_sibling
rank2 = rank1.find_next_sibling("동일 태그명") # method 2
rank2 = rank1.find_next_siblings("동일 태그명") # rank1 기분으로 모든 형제 출력
# 위에 있는 형제 타입 불러오는 코드
rank2 = rank1.previous_sibling.previous_sibling
# 부모 타입으로 가는 코드
rank1.parent
Actual_Practice를 통한 학습
학습목표¶
- beautifulsoup 모듈 사용하기
- id, class 속성으로 tag 찾기
- CSS를 이용하여 tag 찾기
- 속성 값으로 tag 찾기
- 정규표현식으로 tag 찾기
- 개발자도구를 이용하여 동적으로 로딩되는 데이터 추출하기
In [3]:
import requests
from bs4 import BeautifulSoup
In [46]:
url = 'https://news.v.daum.net/v/20190728165812603'
res = requests.get(url)
- id, class 속성으로 tag 찾기
- 타이틀
- 작성자, 작성일
In [7]:
# 기사 제목 추출하기
url = 'https://news.v.daum.net/v/20190728165812603'
res = requests.get(url)
soup = BeautifulSoup(res.text)
title = soup.find('h3', class_='tit_view')
#title.get_text()
title.get_text()
Out[7]:
'일론머스크 "테슬라에서 넷플릭스·유튜브 즐길 날 온다"'
In [17]:
# soup.find_all('span',class_='txt_info')[0]
# soup.find_all('span',class_='txt_info')[1]
info = soup.find('span',class_='info_view') # 너무 많은 데이터가 겹칠때 사용
info.find('span',class_='txt_info').get_text()
Out[17]:
'이민우'
In [12]:
# 본문 내용 들고 오기
container = soup.find('div',id='harmonyContainer')
contents = ''
for p in container.find_all('p'):
contents += p.get_text().strip()
contents
Out[12]:
'[아시아경제 이민우 기자] 일론 머스크 테슬라 최고경영자(CEO)가 자사 전기 자동차 모델에 넷플릭스와 유튜브 등 온라인동영상서비스(OTT)를 탑재할 것이라고 예고했다. 단순히 자율 주행 전기차가 단순히 주행을 위한 정보를 알려주는 것을 넘어 각종 영상 콘텐츠를 즐기는 공간으로도 확장하겠다는 전략으로 풀이된다.27일(현지시간) 더버지 등 주요 외신들에 따르면 머스크 CEO는 자신의 트위터를 통해 이 같은 계획을 밝혔다. 그는 "자동차가 정차했을 때 넷플릭스와 유튜브를 감상할 수 있는 기능이 조만간 추가될 것"이라며 "편안한 좌석과 서라운드 사운드 오디오를 통해 영화관과 같은 느낌을 받을 수 있을 것"이라고 강조했다.테슬라가 이처럼 콘텐츠 방면으로 확장하려 든 것은 이번이 처음이 아니다. 지난달 세계 최대 게임쇼 E3에서는 이미 운전자가 \'폴아웃 쉘터\'라는 게임을 할 수 있을 것이라고 발표한 바 있다. 이후에도 최근 게임업체 아타리사(社)의 자동차 경주 게임 ‘폴포지션’, 슈팅게임 ‘템페스트’, ‘미사일커맨드’ 등 고전 게임을 제공하기도 했다. 운전대로 게임을 조작하는 방식으로, 차가 주차돼 있을 경우에만 즐길 수 있다.이번 영상 콘텐츠는 주행 중에도 감상할 수 있도록 하는 방안을 고려하고 있다. 테슬라 측은 규제당국이 자율주행에 대해 완전히 승인하면 차량이 움직일 때에도 승객이 동영상을 즐길 수 있을 것이라고 설명했다.하지만 아직까지 자율주행차의 안전에 대한 우려는 완전히 걷혀지지 않은 상황이다. 지난 2017년 차량공유 서비스 우버의 자율주행 시범차량이 보행자와 충돌한 사고가 발생한 바 있다. 게다가 당시 시험 운전자는 디즈니의 동영상 스트리밍 서비스인 \'훌루\'를 이용하고 있던 것으로 밝혀졌다.이민우 기자 letzwin@asiae.co.kr<ⓒ경제를 보는 눈, 세계를 보는 창 아시아경제 무단전재 배포금지>'
- CSS를 이용하여 tag 찾기
- select, select_one함수 사용
- css selector 사용법
- 태그명 찾기 tag
- 자손 태그 찾기 - 자손 관계 (tag tag)
- 자식 태그 찾기 - 다이렉트 자식 관계 (tag > tag)
- 아이디 찾기 #id
- 클래스 찾기 .class
- 속성값 찾기 [name='test']
- 속성값 prefix 찾기 [name ^='test']
- 속성값 suffix 찾기 [name $='test']
- 속성값 substring 찾기 [name *='test]
- n번째 자식 tag 찾기 :nth-child(n)
In [18]:
url = 'https://news.v.daum.net/v/20190728165812603'
res = requests.get(url)
soup = BeautifulSoup(res.text)
soup.select('h3') # 리스트 형식 반환
Out[18]:
[<h3 class="tit_view" data-translation="true">일론머스크 "테슬라에서 넷플릭스·유튜브 즐길 날 온다"</h3>,
<h3 class="tit_cp">아시아경제 주요 뉴스</h3>,
<h3 class="txt_newsview">많이본 뉴스</h3>,
<h3 class="txt_newsview">포토&TV</h3>,
<h3 class="txt_newsview">이 시각 추천뉴스</h3>]
In [19]:
soup.select('div#harmonyContainer p') # 자손 관계일 때 , id는 #으로 표현
Out[19]:
[<p class="link_figure"><img alt="일론 머스크 테슬라 최고경영자(CEO) [이미지출처=로이터연합뉴스]" class="thumb_g_article" data-org-src="https://t1.daumcdn.net/news/201907/28/akn/20190728165813230vjsq.jpg" data-org-width="550" dmcf-mid="NBMY3ZZhN4" dmcf-mtype="image" height="auto" src="https://img3.daumcdn.net/thumb/R658x0.q70/?fname=https://t1.daumcdn.net/news/201907/28/akn/20190728165813230vjsq.jpg" width="658"/></p>,
<p>[아시아경제 이민우 기자] 일론 머스크 테슬라 최고경영자(CEO)가 자사 전기 자동차 모델에 넷플릭스와 유튜브 등 온라인동영상서비스(OTT)를 탑재할 것이라고 예고했다. 단순히 자율 주행 전기차가 단순히 주행을 위한 정보를 알려주는 것을 넘어 각종 영상 콘텐츠를 즐기는 공간으로도 확장하겠다는 전략으로 풀이된다.</p>,
<p>27일(현지시간) 더버지 등 주요 외신들에 따르면 머스크 CEO는 자신의 트위터를 통해 이 같은 계획을 밝혔다. 그는 "자동차가 정차했을 때 넷플릭스와 유튜브를 감상할 수 있는 기능이 조만간 추가될 것"이라며 "편안한 좌석과 서라운드 사운드 오디오를 통해 영화관과 같은 느낌을 받을 수 있을 것"이라고 강조했다.</p>,
<p class="link_figure"><img alt="(출처=일론 머스크 트위터 계정 캡쳐)" class="thumb_g_article" data-org-src="https://t1.daumcdn.net/news/201907/28/akn/20190728165813670hwxf.png" data-org-width="550" dmcf-mid="NRhnb5SRpx" dmcf-mtype="image" height="auto" src="https://img1.daumcdn.net/thumb/R658x0.q70/?fname=https://t1.daumcdn.net/news/201907/28/akn/20190728165813670hwxf.png" width="658"/></p>,
<p>테슬라가 이처럼 콘텐츠 방면으로 확장하려 든 것은 이번이 처음이 아니다. 지난달 세계 최대 게임쇼 E3에서는 이미 운전자가 '폴아웃 쉘터'라는 게임을 할 수 있을 것이라고 발표한 바 있다. 이후에도 최근 게임업체 아타리사(社)의 자동차 경주 게임 ‘폴포지션’, 슈팅게임 ‘템페스트’, ‘미사일커맨드’ 등 고전 게임을 제공하기도 했다. 운전대로 게임을 조작하는 방식으로, 차가 주차돼 있을 경우에만 즐길 수 있다.</p>,
<p>이번 영상 콘텐츠는 주행 중에도 감상할 수 있도록 하는 방안을 고려하고 있다. 테슬라 측은 규제당국이 자율주행에 대해 완전히 승인하면 차량이 움직일 때에도 승객이 동영상을 즐길 수 있을 것이라고 설명했다.</p>,
<p>하지만 아직까지 자율주행차의 안전에 대한 우려는 완전히 걷혀지지 않은 상황이다. 지난 2017년 차량공유 서비스 우버의 자율주행 시범차량이 보행자와 충돌한 사고가 발생한 바 있다. 게다가 당시 시험 운전자는 디즈니의 동영상 스트리밍 서비스인 '훌루'를 이용하고 있던 것으로 밝혀졌다.</p>,
<p dmcf-pid="NUOWg8Qxyd" dmcf-ptype="general">이민우 기자 letzwin@asiae.co.kr</p>,
<p data-translation="true"><ⓒ경제를 보는 눈, 세계를 보는 창 아시아경제 무단전재 배포금지></p>]
In [20]:
soup.select('h3.tit_view') #class가 tit_view인 것 모두 반환
# soup.select('h3.tit_view')==soup.select('.tit_view')
Out[20]:
[<h3 class="tit_view" data-translation="true">일론머스크 "테슬라에서 넷플릭스·유튜브 즐길 날 온다"</h3>]
In [22]:
soup.select('h3')
Out[22]:
[<h3 class="tit_view" data-translation="true">일론머스크 "테슬라에서 넷플릭스·유튜브 즐길 날 온다"</h3>,
<h3 class="tit_cp">아시아경제 주요 뉴스</h3>,
<h3 class="txt_newsview">많이본 뉴스</h3>,
<h3 class="txt_newsview">포토&TV</h3>,
<h3 class="txt_newsview">이 시각 추천뉴스</h3>]
In [21]:
soup.select('h3[class="tit_view"]')
Out[21]:
[<h3 class="tit_view" data-translation="true">일론머스크 "테슬라에서 넷플릭스·유튜브 즐길 날 온다"</h3>]
In [23]:
soup.select('h3[class^="t"]') #t로 시작하는 것 모두 반환
Out[23]:
[<h3 class="tit_view" data-translation="true">일론머스크 "테슬라에서 넷플릭스·유튜브 즐길 날 온다"</h3>,
<h3 class="tit_cp">아시아경제 주요 뉴스</h3>,
<h3 class="txt_newsview">많이본 뉴스</h3>,
<h3 class="txt_newsview">포토&TV</h3>,
<h3 class="txt_newsview">이 시각 추천뉴스</h3>]
In [24]:
soup.select('h3[class$="_view"]') #view로 끝나는 것 모두 반환
Out[24]:
[<h3 class="tit_view" data-translation="true">일론머스크 "테슬라에서 넷플릭스·유튜브 즐길 날 온다"</h3>]
In [26]:
soup.select('span.txt_info:nth-child(1)')
Out[26]:
[<span class="txt_info">이민우</span>]
In [27]:
soup.select('span.txt_info:nth-child(2)')
Out[27]:
[<span class="txt_info">입력 <span class="num_date">2019. 07. 28. 16:58</span></span>]
- 정규표현식으로 tag 찾기
In [28]:
import re
In [29]:
soup.find_all(re.compile('h\d')) # h관련 태그 모야오기
Out[29]:
[<h1> <a class="link_daum" href="https://www.daum.net"> <img alt="Daum" class="thumb_g" height="19" src="//t1.daumcdn.net/media/news/news2016/retina/logo_daum.jpg" width="45"/> </a> <a href="//news.daum.net" id="kakaoServiceLogo"><span class="ir_wa">뉴스</span></a> </h1>,
<h2 class="screen_out">검색</h2>,
<h2 class="screen_out">뉴스 메인메뉴</h2>,
<h2 class="screen_out" id="kakaoBody">IT</h2>,
<h3 class="tit_view" data-translation="true">일론머스크 "테슬라에서 넷플릭스·유튜브 즐길 날 온다"</h3>,
<h4 class="screen_out">기사 도구 모음</h4>,
<h3 class="tit_cp">아시아경제 주요 뉴스</h3>,
<h3 class="txt_newsview">많이본 뉴스</h3>,
<h3 class="txt_newsview">포토&TV</h3>,
<h3 class="txt_newsview">이 시각 추천뉴스</h3>,
<h2 class="tit_direct">바로가기</h2>,
<h2 class="screen_out">서비스 이용정보</h2>]
In [30]:
soup.find_all('img' ,attrs={'src' : re.compile(".+\.png")})
Out[30]:
[<img alt="(출처=일론 머스크 트위터 계정 캡쳐)" class="thumb_g_article" data-org-src="https://t1.daumcdn.net/news/201907/28/akn/20190728165813670hwxf.png" data-org-width="550" dmcf-mid="NRhnb5SRpx" dmcf-mtype="image" height="auto" src="https://img1.daumcdn.net/thumb/R658x0.q70/?fname=https://t1.daumcdn.net/news/201907/28/akn/20190728165813670hwxf.png" width="658"/>]
In [39]:
soup.find_all('h3',class_=re.compile('.+view$')) # view로 끝나는 모든 값
Out[39]:
[<h3 class="tit_view" data-translation="true">일론머스크 "테슬라에서 넷플릭스·유튜브 즐길 날 온다"</h3>,
<h3 class="txt_newsview">많이본 뉴스</h3>,
<h3 class="txt_newsview">포토&TV</h3>,
<h3 class="txt_newsview">이 시각 추천뉴스</h3>]
- 댓글 개수 추출
- 댓글의 경우, 최초 로딩시에 전달되지 않음
- 이 경우는 추가적으로 AJAX로 비동기적 호출을 하여 따로 data 전송을 함
- 개발자 도구의 network 탭에서 확인(XHR: XmlHTTPRequest)
- 비동기적 호출: 사이트의 전체가 아닌 일부분만 업데이트 가능하도록 함
In [45]:
url = 'https://comment.daum.net/apis/v1/ui/single/main/@20190728165812603'
headers = {
'Authorization' : 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb3J1bV9rZXkiOiJuZXdzIiwiZ3JhbnRfdHlwZSI6ImFsZXhfY3JlZGVudGlhbHMiLCJzY29wZSI6W10sImV4cCI6MTYyNzg1OTM0NywiYXV0aG9yaXRpZXMiOlsiUk9MRV9DTElFTlQiXSwianRpIjoiYzU2ZGUwM2MtNGY4OS00ZTk2LThkMzItYWI0YWJlODM3NWIwIiwiZm9ydW1faWQiOi05OSwiY2xpZW50X2lkIjoiMjZCWEF2S255NVdGNVowOWxyNWs3N1k4In0.DiNXiy040zAjvCsSpxZsUYSmsEcQS3fB9kEquJSwDS0',
'Origin' : 'https://news.v.daum.net',
'Referer' : 'https://news.v.daum.net/v/20190728165812603',
'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'
}
resp = requests.get(url, headers=headers)
resp.json()
resp.json()['commentCount'] # 댓글 수 추출 함수
Out[45]:
{'post': {'id': 133493400,
'forumId': -99,
'postKey': '20190728165812603',
'flags': 0,
'title': '일론머스크 "테슬라에서 넷플릭스·유튜브 즐길 날 온다"',
'url': 'https://news.v.daum.net/v/NHT9NtZWBe',
'icon': 'https://img1.daumcdn.net/thumb/S1200x630/?fname=https://t1.daumcdn.net/news/201907/28/akn/20190728165813230vjsq.jpg',
'commentCount': 42, # 댓글 수
'childCount': 9,
'popularOpened': True}}
728x90
'Data scientist > PYTHON' 카테고리의 다른 글
Python_Seaborn (0) | 2021.07.29 |
---|---|
Python_Pandas (0) | 2021.07.28 |
Python_Numpy (0) | 2021.07.27 |
Python_데이터 입출력(IO) (0) | 2021.07.23 |
Python_function() (0) | 2021.07.22 |