import requests as req
from bs4 import BeautifulSoup as bs
import pandas as pd
한달 동안의 영화데이터 수집
반복문, range를 사용해서 range(20220401, 20220431): #끝값 포함x 30일원하면 ->31로
url='https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=cur&tg=0&date='+ str(i)로
1~30일간 url을 통해 한달간 영화데이터 수집
이때 title_list=[] score_list=[] rank_list=[] 를 for문 안에 넣으면 빈배열로 계속 초기화 되니까 조심.
title_list=[]
score_list=[]
rank_list=[]
for i in range(20220401, 20220431): #끝값 포함x 30일원하면 ->31
url='https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=cur&tg=0&date='+ str(i)
res = req.get(url)
soup = bs(res.text,'lxml')
title = soup.select('div.tit5 > a')
score=soup.select('td.point')
for j in range(len(title)):
title_list.append(title[j].text.strip())
score_list.append(score[j].text.strip())
rank_list.append(j+1)
1200
dic = {'순위':rank_list,'영화제목':title_list, '평점':score_list}
df = pd.DataFrame(dic)
df = df.set_index('순위')
df
영화제목 평점
순위
1 씽2게더 9.41
2 패왕별희 디 오리지널 9.31
3 극장판 주술회전 0 9.27
4 해피 투게더 9.19
5 코다 9.16
... ... ...
46 앵커 7.25
47 모비우스 7.20
48 명당 7.06
49 앰뷸런스 6.93
50 82년생 김지영 6.67
1200 rows × 2 columns
날짜를 range로 1년? 32일 33일 34일 없는 날짜까지 반복문에 들어가게 된다.
그래서
Pandas 활용하여 날짜 생성
date = pd.date_range(start = '2022-01-01', end='2022-05-12') # 날짜는 끝값도 포함해서 12일까지 나온다.
date
DatetimeIndex(['2022-01-01', '2022-01-02', '2022-01-03', '2022-01-04',
'2022-01-05', '2022-01-06', '2022-01-07', '2022-01-08',
'2022-01-09', '2022-01-10',
...
'2022-05-03', '2022-05-04', '2022-05-05', '2022-05-06',
'2022-05-07', '2022-05-08', '2022-05-09', '2022-05-10',
'2022-05-11', '2022-05-12'],
dtype='datetime64[ns]', length=132, freq='D')
days = date.strftime('%Y%m%d') # 소문자y하면 2022가아니라 22로 나온다
리스트 형태로 담겨있다.
Index(['20220101', '20220102', '20220103', '20220104', '20220105', '20220106',
'20220107', '20220108', '20220109', '20220110',
...
'20220503', '20220504', '20220505', '20220506', '20220507', '20220508',
'20220509', '20220510', '20220511', '20220512'],
dtype='object', length=132)
tqdm_notebook >> 진행사항을 볼 수 있는 함수
from tqdm import tqdm_notebook as tn
1/1 ~ 5/12까지 영화데이터 수집
title_list=[]
score_list=[]
rank_list=[]
for i in tn(days): #tn()으로 진행상황 나타냄, 끝값 포함x 30일원하면 ->31
url='https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=cur&tg=0&date='+ i
res = req.get(url)
soup = bs(res.text,'lxml')
title = soup.select('div.tit5 > a')
score=soup.select('td.point')
for j in range(len(title)):
title_list.append(title[j].text.strip())
score_list.append(score[j].text.strip())
rank_list.append(j+1)
위와 같은 창이 나오면서 반복문의 진행상황을 알 수 있다.
len(title_list)
3940
iframe : 웹페이지안에 웹페이지
iframe의 URL은 iframe의 src에서 찾아야 한다.
네이버 웹페이지에서 트렌스 쇼핑 이라는 글자를 가져오려고 했을때 (트렌드쇼핑을 iframe으로 이루어짐)
url = 'https://www.naver.com'
res = req.get(url)
soup = bs(res.text, 'lxml')
soup.select('a.ls_link')
-> naver url로는 안나오고
url을 iframe의 src주소 + 앞에 생략된 naver.com을 붙여서 아래와 같이 url지정 해야 나온다
url = 'https://naver.com/shoppingbox/shoppingboxnew/main.nhn?mode=plusdeal&domain=N'
res = req.get(url)
soup = bs(res.text, 'lxml')
soup.select('a.ls_link')
[<a class="ls_link" href="https://trenditem.shopping.naver.com"
onclick="nclk_v2(event, 'stc.shopping');" target="_parent">트렌드쇼핑</a>]
태그삭제
네이버에 광주 날씨 검색 후 현재 온도 가져오기
url='https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=%EA%B4%91%EC%A3%BC%EB%82%A0%EC%94%A8'
res=req.get(url)
soup=bs(res.text,'lxml')
soup.select('div.temperature_text')[0].text
' 현재 온도19.0° '
현재온도와 , 섭씨표기를 지우려면
위아래의 현재온도, 섭씨 span태그를 지우면 19 숫자만 가져 올 수 있다.
span = soup.select('div.temperature_text > strong > span')
[<span class="blind">현재 온도</span>,
<span class="celsius">°</span>,
<span class="blind">예측 온도</span>,
<span class="celsius">°</span>,
<span class="blind">예측 온도</span>,
<span class="celsius">°</span>,
<span class="blind">예측 온도</span>,
<span class="celsius">°</span>,
<span class="blind">예측 온도</span>,
<span class="celsius">°</span>]
span = soup.select('div.temperature_text > strong > span')
# extract 태그삭제하는 함수
for i in span:
i.extract()
soup.select('div.temperature_text > strong > span')
[]
삭제 되었다
soup.select('div.temperature_text')[0].text 현재 온도만 나오게 된다.
' 19.0 '
삭제할때는 주의해서 삭제 할 태그만 정확히 지정해야한다.
네이버 금융탭 뉴스기사 크롤링
url = 'https://finance.naver.com/world/'
res = req.get(url)
soup = bs(res.text,'lxml')
soup.select('div.list_area > ul > li > p > a')
[<a href="/world/market_news_view.naver?category=main&office_id=003&article_id=0011182575&date=2022-05-13" onclick="clickcr(this,'wew.list','003_0011182575','1',event);">
[올댓차이나] 위안화 기준치 1달러=6.7</a>,
<a href="/world/market_news_view.naver?category=main&office_id=003&article_id=0011182532&date=2022-05-13" onclick="clickcr(this,'wew.list','003_0011182532','2',event);">
[올댓차이나]중국 증시 상승 출발…상하이지</a>,
<a href="/world/market_news_view.naver?category=main&office_id=008&article_id=0004745304&date=2022-05-13" onclick="clickcr(this,'wew.list','008_0004745304','3',event);">'
버팀목' 애플·MS '흔들', '밈' 강</a>,
<a href="/world/market_news_view.naver?category=main&office_id=421&article_id=0006089259&date=2022-05-12" onclick="clickcr(this,'wew.list','421_0006089259','4',event);">
[뉴욕개장] 美 연준 '공격적 금리 인상'</a>,
<a href="/world/market_news_view.naver?category=main&office_id=003&article_id=0011181565&date=2022-05-12" onclick="clickcr(this,'wew.list','003_0011181565','5',event);">
[올댓차이나] 홍콩 증시, 뉴욕 증시 약세</a>,
<a href="/world/market_news_view.naver?category=main&office_id=003&article_id=0011181418&date=2022-05-12" onclick="clickcr(this,'wew.list','003_0011181418','6',event);">
[올댓차이나] 훙하이 1~3월 순익 5%↑</a>,
<a href="/world/market_news_view.naver?category=main&office_id=003&article_id=0011181270&date=2022-05-12" onclick="clickcr(this,'wew.list','003_0011181270','7',event);">
[올댓차이나]중국 증시 하락 마감…상하이지</a>,
<a href="/world/market_news_view.naver?category=main&office_id=003&article_id=0011181037&date=2022-05-12" onclick="clickcr(this,'wew.list','003_0011181037','8',event);">
[올댓차이나] 대만 증시, 뉴욕 증시 약세</a>,
<a href="/world/market_news_view.naver?category=main&office_id=003&article_id=0011180807&date=2022-05-12" onclick="clickcr(this,'wew.list','003_0011180807','9',event);">
[올댓차이나] 中 부동산 룽촹, 내년 10</a>,
<a href="/world/market_news_view.naver?category=main&office_id=003&article_id=0011180288&date=2022-05-12" onclick="clickcr(this,'wew.list','003_0011180288','10',event);">
[올댓차이나] 4월 대만 IT매출 48조원</a>]
news_list = []
for i in soup.select('div.list_area > ul > li > p > a'):
news_list.append(i.text)
news_list # 기사 제목만 리스트에
['[올댓차이나] 위안화 기준치 1달러=6.7',
'[올댓차이나]중국 증시 상승 출발…상하이지',
"'버팀목' 애플·MS '흔들', '밈' 강",
"[뉴욕개장] 美 연준 '공격적 금리 인상'",
'[올댓차이나] 홍콩 증시, 뉴욕 증시 약세',
'[올댓차이나] 훙하이 1~3월 순익 5%↑',
'[올댓차이나]중국 증시 하락 마감…상하이지',
'[올댓차이나] 대만 증시, 뉴욕 증시 약세',
'[올댓차이나] 中 부동산 룽촹, 내년 10',
'[올댓차이나] 4월 대만 IT매출 48조원']
Selenium
웹 페이지를 제어하기 위한 모듈
!pip install selenium chrome driver 설치
pip install selenium
from selenium import webdriver as wb
Chrome 버전에 맞는 드라이버를 다운받아서 jupyter 폴더에 넣고
url = 'https://www.naver.com/'
driver = wb.Chrome()
driver.get(url)
# 이때는 웹페이지를 제어하고있어서 전에 멜론처럼 보안때문에 headers 지정 할 필요가 없다.
driver.find_element_by_css_selector() -> 한개만 가져올때
driver.find_elements_by_css_selector() -> 여러개 가져올때
put = driver.find_element_by_css_selector('#query')
put.send_keys('123') -> 검색창에 123이 써진다
put = driver.find_elements_by_css_selector('#query')
put[0].send_keys('123') -> 검색창에 123이 써진다 (elements를 썼을경우)
엔터 제어
from selenium.webdriver.common.keys import Keys
put.send_keys(Keys.ENTER)
클릭제어
네이버에서 검색을 실행하기위한 클릭제어
btn = driver.find_element_by_css_selector('#search_btn')
버튼의 id를 찾아서 driver.find_element_by_css_selector 를 변수 btn에 담고
클릭은 bnt.click()으로. bnt.send_keys()가 아니라 click 함수가 따로 있다.
구글페이지에서 광주날씨 검색
url = 'https://www.google.com/'
driver = wb.Chrome()
driver.get(url)
search = driver.find_element_by_css_selector('.gLFyf.gsfi')
search.send_keys('광주날씨')
search.send_keys(Keys.ENTER)
'빅데이터 서비스 교육 > 크롤링' 카테고리의 다른 글
크롤링 (0) | 2022.05.18 |
---|---|
크롤링 이미지 가져오기 (0) | 2022.05.17 |
크롤링 웹페이지 데이터 수집 (0) | 2022.05.16 |
크롤링 기초 (0) | 2022.05.12 |