TIL

[TIL] 4일차_실시간 검색어 Crawling

Molybdenum_j 2023. 2. 28. 14:45

실시간 검색어 크롤링

web Crawler - 웹 페이지의 데이터를 모아주는 소프트웨어

 

▶크롤링 작업을 위한 외부 모듈 설치

CodeLion $ pip install requests

▶ 함수와 모듈

함수(Fuction) - 자주 사용하는 코드를 묶어놓고 사용 할 수 있게 해주는 것을 의미(반복작업을 줄여줌)

모듈(Module) - 함수들을 모아놓은 파일(그외)

 

▶requests 모듈

- get 함수 : return 응닶값~

- requests.get(url) = get 요청을 보내는 기능(put, post, delete..)

- return : requests. response <- server에서 응답 받은 값

import requests

print(requests.get)

 

터미널

CodeLion $ python codelion.py

<function get at 0x7fbf95dbb700> -> requests모듈 안에 있는 get 함수는 함수가 맞다

* server는 응답을 하는 존재

* client는 요청을 하는 존재

 

그외에도

response.text
response.url
response.content
response.encoding
response.headers
response.json
response.links
response.ok
response.status_code

 

▶BeautifulSoup(데이터(html, XML), 파싱방법)

= html을 분석가능한 형태로 가공하는 것을 도와줌

   Parsing -> 문자열을 분석해 의미가 있는 데이터로 변경(html.parser를 사용할 예정)

import requests

from bs4 import BeautifulSoup -> bs4라는 모듈안에 BeautifulSoup라는 함수를 사용하겠다.

url = "http://www.daum.net/"
response = requests.get(url)

# print(response.text)

print(BeautifulSoup(response.text, 'html.parser'))

 

 

 

type() -> ()안에 type을 알려줌 (list, dictionary...)
type(response.text) -> 'str' -> 문자열
type(BeautifulSoup(response.text, 'html.parser')) -> bs4.BeautifulSoup

 


에디터

import requests

from bs4 import BeautifulSoup

url = "http://www.daum.net/"
response = requests.get(url)

# print(type(response.text))

soup = BeautifulSoup(response.text, 'html.parser')

- print(soup.title)
-> 터미널
    CodeLion $ python codelion.py
    <title>Daum</title> -> <title> = response.text문서에 있는 title을 가져오는 태그

 


- print(soup.title.string)
-> 터미널
    CodeLion $ python codelion.py
    Daum



- print(soup.span)
-> 터미널
    CodeLion $ python codelion.py
    <span class = "ico_vert inner_shortcut">주요 서비스 바로가기</span> -> 상단의 span태그만 출력됨



- print(soup.findAll('span'))

-> 터미널
    CodeLion $ python codelion.py
    많은 span 태그가 출력됨

 

 

BeautifulSoup 매서드
https://www.crummy.com/software/BeautifulSoup/bs4/doc.ko/

 

 
import requests

from bs4 import BeautifulSoup

url = "http://www.daum.net/"
response = requests.get(url)

# print(type(response.text))

soup = BeautifulSoup(response.text, 'html.parser')
file = open("daum.html", "w") -> daum.html 이라는 파일이 만들어짐
file.write(response.text) -> response.text라는 html 텍스트를 이 파일에 쓰겠다.
file.close()

print(soup.title)

print(soup.title.string)

print(soup.span)

print(soup.findAll('span'))

-> 파일 트리에 daum.html 생성됨.
<a class="link_favorsh @6" href="...">멋쟁이 사자처럼</a>


▶ 실시간 검색어 출력

 
from bs4 import BeautifulSoup
import requests
from datetime import datetime  -> 오늘 날짜가 출력됨

url = "http://www.daum.net/"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
rank = 1 -> 순위를 출력시킴

results = soup.findAll('a','link_favorsh')

print(datetime.today().strftime("%Y년 %m월 %d일의 실시간 검색어 순위입니다.\n"))

for result in results:
    print(rank,"위 : ",result.get_text(),"\n") 
    rank+=1

-> 2022년 12월 31일의 실시간 검색어 순위입니다. 라는 글과 함께 실시간 검색어 순위가 나타남

▶ 실시간 검색어 데이터를 파일로 출력

 

​open(파일, 모드)
모드(r=read, w=write, a=append)

 

from bs4 import BeautifulSoup
import requests
from datetime import datetime

url = "http://www.daum.net/"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
rank = 1

results = soup.findAll('a','link_favorsh')

search_rank_file = open("rankresult.txt","w")

print(datetime.today().strftime("%Y년 %m월 %d일의 실시간 검색어 순위입니다.\n"))

for result in results:
    search_rank_file.write(str(rank)+"위:"result.get_text()+"\n")
    print(rank,"위 : ",result.get_text(),"\n") 
    rank+=1

-> 파일트리에 rankresult.text파일이 생겼고 실시간 검색어 순위가 들어있음

▶ 실시간 검색어 응용하기(naver)

 
from bs4 import BeautifulSoup
import requests
from datetime import datetime

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
url = "https://datalab.naver.com/keyword/realtimeList.naver?age=20s"
response = requests.get(url,headers=headers) ->headers안에 로봇이 아님을 알려주는 내용을 보냄
soup = BeautifulSoup(response.text, 'html.parser')
rank = 1

results = soup.findAll('span','item_title') -> 네이버는 변경해야됨

search_rank_file = open("rankresult.txt","w")

print(datetime.today().strftime("%Y년 %m월 %d일의 실시간 검색어 순위입니다.\n"))

for result in results:
    search_rank_file.write(str(rank)+"위:"result.get_text()+"\n")
    print(rank,"위 : ",result.get_text(),"\n") 
    rank+=1