교육/멋쟁이사자처럼 AI School 7기

TIL 3. [심화] 같이 푸는 Python

삶은돼지고기 2022. 9. 16. 21:48
728x90

# 크롤러 알아보기
웹 페이지의 데이터를 모아주는 소프트웨어

웹 크롤링
크롤러를 사용해 웹 페이지의 데이터를 추출해 내는 행위

모듈안에 있는 함수 사용
모듈명.함수이름

server: 요청에 대한 응답
client: 서버에 요청을 보내고 응답값을 받는사람

requests.get(url) # 서버에 요청을 보내는 함수
이것만 실행하면 안됨 url이 어디 서버에서 가져오는지 정의되어있지 않음
url = "http://www.daum.net"
print(requests.get(url))

결과물 : Response [200] -> 응답이 됐다는것 하지만 응답결과가 우리가 원하는 것이 아님

response 변수에 저장
response = requests.get(url)
print(response.text) -> 응답 받은 리스폰스 변수 안에 택스트 출력

모듈.함수(파라미터)
return: requests.response


Beautiful soup -> 우리가 가져온 데이터를 기반으로 의미있는 데이터로 변경으로 도와줌

from bs4 import BeautifulSoup # bs4라는 모듈에서 BeautifulSoup라는 기능만 import

import requests
from bs4 import BeautifulSoup

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

print(BeautifulSoup(response.text, 'html.parser')
#겉으로는 그냥 위의 print(response.text)와 똑같음

type함수로 차이점 확인
print(type(response.text))
-> 'str' 타입

print(type(BeautifulSoup(response.text, 'html.parser'))
-> 'bs4.BeautifulSoup' 출력

BeautifulSoup-> respones.text의 문자열들을 모두 떼어 BeautifulSoup의 통에 정리해주는것

#BeautifulSoup 활용

BeautifulSoup(데이터,파싱방법)

parsing: 우리의 데이터를 의미있게 변경하는 방법
즉 어떤 문자, 문자열들을 분석해서 의미가 있는 데이터로 변경
이 parsing을 도와주는게 parser 

soup = BeautifulSoup(response.text, 'html.parser') #변수에 저장

print(soup.title) # 저장한 변수에 title만 가져오기
print(soup.title.string) #문자만 가져오기
print(soup.span) #html 문서에 있는 가장 상단에 위치한 span 태그 하나만 출력
print(soup.findAll('span'))# 모든 span 태그 출력


#더 편하게 볼수있도록 파일에 저장하고 파일 열기

file = open("daum.html", "w")
file.write(response.text)
file.close()

파일로 파악해보니
모든 실시간 검색어들은 a태그이고
class가 Link_favorsch라는 클래그 사짐

#실시간 검색어 가져오기
# html 문서에서 모든 a태그를 가져오는 코드
print(soup.findAll("a")

#findAll사용하되 클래스까지 함께 출력하는 조건 생성
print(soup.findAll("a","link_favorsch")
-> 아직도 불필요한 정보들이 너무 많음

#보기 좋게 출력하기(반복문 사용)
results = soup.findAll("a","link_favorsch")
for result in results:
print(result.get_text(),"|n") #줄바꿔서 출력, 태그 정보들 다 빠지고 텍스트만 출력

from bs4 import BeautifulSoup
import requests

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

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

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

#몇월 몇일의 실시간 검색어 인지 출력
from datetime import datetime

print(date.time.today())
-> 하지만 이상한게 너무 많이 나옴

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

#파일로 불러오기
open(파일, 모드)
r = read 읽기모드
w = write 쓰기모드
a = append 기존의 파일에 추가하는 모드

for result in results:
    search_rank_file.write(str(rank)+"위:"+result.get_text()+"\n") -> 쓰기모드 파일이 하나 생성됨
    print(rank,"위 : ",result.get_text(),"\n") -> 이거는 그냥 따로 출력
    rank += 1



#네이버 웹 크롤링하기 
url = "https://datalab.naver.com/keyword/realtimeList.naver?age=20s" # 위에것에서 주소변경
results = soup.findAll('span','item_title') # 실시간 검색어에서 공통되는 # span - item_title 로 변경

오류가남 -> 네이버같은 경우 크롤링로봇에 대한 접근을 막아놨음 그렇기에 다른방법 사용해야함
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'} 구문 추가해야함

response = requests.get(url,headers=headers) 로 변경

# 네이버 크롤링 최종 코드

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)
soup = BeautifulSoup(response.text, 'html.parser')
rank = 1
# span - item_title
results = soup.findAll('span','item_title')

print(response.text)

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

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


#번역기 만들기 
translator = Translator()

sentence = "안녕하세요 코드라이언입니다."
detected = translator.detect(sentence) #detect를 통해 언어탐지
detected.lang # 어떤 언어인지만 출력
print(detected)

translate(text,dest,src)

from googletrans import Translator

translator = Translator()

# sentence = "안녕하세요 코드라이언입니다."
sentence = input("번역을 원하는 문장을 입력해주세요 : ")

result = translator.translate(sentence,'en')
detected = translator.detect(sentence)

print("===========출 력 결 과===========")
print(detected.lang,":",sentence)
print(result.dest,":",result.text)
print("=================================")