빅데이터 서비스 교육/크롤링

크롤링 데이터 수집 및 웹페이지 제어

Manly 2022. 5. 13. 12:10
반응형

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)
len(title_list)
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&amp;office_id=003&amp;article_id=0011182575&amp;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&amp;office_id=003&amp;article_id=0011182532&amp;date=2022-05-13" onclick="clickcr(this,'wew.list','003_0011182532','2',event);">
 [올댓차이나]중국 증시 상승 출발…상하이지</a>,
 <a href="/world/market_news_view.naver?category=main&amp;office_id=008&amp;article_id=0004745304&amp;date=2022-05-13" onclick="clickcr(this,'wew.list','008_0004745304','3',event);">'
 버팀목' 애플·MS '흔들', '밈' 강</a>,
 <a href="/world/market_news_view.naver?category=main&amp;office_id=421&amp;article_id=0006089259&amp;date=2022-05-12" onclick="clickcr(this,'wew.list','421_0006089259','4',event);">
 [뉴욕개장] 美 연준 '공격적 금리 인상'</a>,
 <a href="/world/market_news_view.naver?category=main&amp;office_id=003&amp;article_id=0011181565&amp;date=2022-05-12" onclick="clickcr(this,'wew.list','003_0011181565','5',event);">
 [올댓차이나] 홍콩 증시, 뉴욕 증시 약세</a>,
 <a href="/world/market_news_view.naver?category=main&amp;office_id=003&amp;article_id=0011181418&amp;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&amp;office_id=003&amp;article_id=0011181270&amp;date=2022-05-12" onclick="clickcr(this,'wew.list','003_0011181270','7',event);">
 [올댓차이나]중국 증시 하락 마감…상하이지</a>,
 <a href="/world/market_news_view.naver?category=main&amp;office_id=003&amp;article_id=0011181037&amp;date=2022-05-12" onclick="clickcr(this,'wew.list','003_0011181037','8',event);">
 [올댓차이나] 대만 증시, 뉴욕 증시 약세</a>,
 <a href="/world/market_news_view.naver?category=main&amp;office_id=003&amp;article_id=0011180807&amp;date=2022-05-12" onclick="clickcr(this,'wew.list','003_0011180807','9',event);">
 [올댓차이나] 中 부동산 룽촹, 내년 10</a>,
 <a href="/world/market_news_view.naver?category=main&amp;office_id=003&amp;article_id=0011180288&amp;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