ACHO.pk devlog

[멋쟁이사자처럼10기] Python 크롤링으로 뉴스 기사 제목 추출하기 본문

멋쟁이사자처럼

[멋쟁이사자처럼10기] Python 크롤링으로 뉴스 기사 제목 추출하기

Acho 2022. 5. 1. 12:55

오늘 멋사 서울여대의 정기세션에서는 다음과 네이버의 실시간 검색어 데이터를 추출하는 크롤링에 대해 배웠다.
올해 초에 자바 JSOUP으로 서울여대 공지사항 게시글 제목을 크롤링 한 적이 있기 때문에 파이썬으로 새롭게 배운다는 마음으로 임했다.
크롤링하는 방법은 같지만 함수나 모듈이 서로 달라 헷갈리는 것도 많았다.

 

※웹페이지가 계속해서 업데이트가 되다보니, html에서 태그나 클래스가 변경되면 크롤링이 안 될 수도 있다. 

최근 코드는 github에서 확인하면 되겠다.


크롤러란?
웹 페이지의 데이터를 추출하기 위해서는 '크롤러'에 대해 알아야 한다.
Crawler : 1. 기는 것 2. 파충류
Crawler: 웹 페이지의 데이터를 모아주는 소프트웨어
Crawling: 크롤러를 사용해 웹 페이지의 데이터를 추출해 내는 행위


모듈 불러오기
웹 크롤링을 하기 위해서는 모듈을 불러오는 과정이 필요하다. 그래서 모듈을 불러와 설치하고, 이를 사용할 수 있도록 import 해야한다.
1. requests 모듈
2. bs4 모듈
- bs4 모듈에서 BeautifulSoup 기능만 사용
BeautifulSoup : 문자열 덩어리를 떼서 데이터 추출
pip install 모듈 : 모듈 설치
import 모듈 : 설치한 모듈을 사용

pip install requests
pip install bs4

import requests
from bs4 import BeautifulSoup

get 함수
클라이언트: 요청 + 응답값 이용 <--> 서버: 응답 ( GET 요청을 보내는 기능)
requests.get(url) : requests 모듈 안에 있는 get함수가 url를 재료를 요청을 보내고, 이에 대한 서버의 응답값은 requests.response가 된다. 서버는 클라이언트에게 응답값을 전달한다.
Parsing : 문서 또는 데이터를 의미있게 변경하는 작업, 문자열을 분석해 의미있는 값으로 분해하고 데이터로 만드는 과정
html.parser : 파이썬 내장함수

import requests
from bs4 import BeautifulSoup

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


print(response.text)	#html 코드 출력
print(type(response.text))	#<class 'str>

print(BeautifulSoup(response.text, 'html.parser'))	#html 코드 출력
print(type(BeautifulSoup(response.text, 'html.parser')))	#<class 'bs4.BeautifulSoup'>

print(response.url)

print(response.content)

print(response.encoding)

print(response.headers)

print(response.json)

print(response.links)

print(response.ok)

print(response.status_code)

 


데이터를 추출하는 과정

import requests
from bs4 import BeautifulSoup

url = "http://www.daum.net/"
response = requests.get(url)
print(response.text[:500])		#문자열 500자로 제한, 타이틀 태그만 출력

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

print(soup.title)		#<title>Daum</title>
print(soup.title.string)	#Daum
print(soup.span)	#html 문서 안에 있는 가장 상단에 위치한 span태그가 출력
print(soup.findALL('span'))	#html 문서 안에 있는 모든 span 태그를 추출

Open 함수 - 파일
파일을 새로 생성, 읽어서 가져오거나 내용을 수정할 때 open() 함수를 사용한다.
open(파일, 모드) :
-파일 : 저장하고 싶은 문서의 종류를 (.txt, .html 등) 확장자로 설정한다.
-모드 : 읽거나 쓸 대상이 되는 파일의 상태를 의미한다.
read - r
write - w
append - a

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

#######################################

rank = 1
search_rank_file = open("rankresult.txt","w")
### "W" 를 "a"로 바꾸면 새로 생성된 파일에 계속 추가됨

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

우리가 필요한 데이터만 추출하기
1. 해당 데이터들의 태그를 분석후 공통점을 찾아야한다

# html 문서에서 모든 a태그를 가져오는 코드
print(soup.findAll("a","link_favorsch"))
# html 문서 안에 모든 a태그들 중에 link_favorsh 클래스를 가진 것들만 찾는 것


2. 필요한 데이터에서 태그를 제외하고 보기 좋게 출력하기

from bs4 import BeautifulSoup
import requests
from datetime import datetime

#서버로 GET요청을 보냄
url = "http://www.daum.net/"
response = requests.get(url)

soup = BeautifulSoup(response.text, 'html.parser')
results = soup.findAll('a','link_favorsch')

#실시간 검색어만 출력(태그 제외)
for result in results:
    print(result.get_text(),"\n")
    
#실시간 검색어의 순위 출력    
rank = 1
for result in results:
    print(rank,"위 : ",result.get_text(),"\n")
    rank += 1
    
#실시간 검색어의 날짜 출력     
print(datetime.today())
print(datetime.today().strftime("%Y년 %m월 %d일의 실시간 검색어 순위입니다.\n"))

네이버 포탈의 실시간 검색어 추출하기
-네이버와 같이 로봇의 접근을 막아둔 경우 headers에 우리의 정보를 넣어 전달을 해야한다.

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'}

 

 

완성된 코드는 아래 깃허브에서 확인!

https://github.com/Acho-mj/Likelion10-study/tree/main/python_crawling

 

GitHub - Acho-mj/Likelion10-study: 멋쟁이 사자처럼 10기 백엔드입니다. 코드라이언과 학교 멋사 스터디

멋쟁이 사자처럼 10기 백엔드입니다. 코드라이언과 학교 멋사 스터디에서 학습한 내용을 올립니다. - GitHub - Acho-mj/Likelion10-study: 멋쟁이 사자처럼 10기 백엔드입니다. 코드라이언과 학교 멋사 스

github.com

 

Comments