본문 바로가기

Python Programming/Notes

Web Crawler(2) - XML 뉴스 정보 가져오기

해당 포스팅은 kgitbank의 웹크롤링 수업에 대한 내용을 일부 발췌하여 정리한 내용이다. 

지난 Web Crawler(1) 포스팅에서는 웹 크롤링의 종류에 대해 설명하고, JSON 파일을 불러오는 방법에 대해 다루었다. 

JSON 파일은 Dictionary 형식으로 구성되어 있어 url을 request 모듈로 받은 후, 원하는 정보가 들어 있는 Key 값을 직접적으로 지정하여 접근할 수 있었다.

 

 

한편, XML 파일을 불러오는 경우, 파일을 Dictionary 형식으로 변환해 주는 모듈을 추가적으로 사용해야 한다.

그 중 xmltodictBeautifulSoup 모듈을 사용하여 최신 뉴스 정보를 불러오는 방법에 대해 알아볼 것이다. 

 

 

I. XML - Using Dictionary

 

우선 url을 불러오기 위해 Google News 페이지에 접속한다. 

이 페이지에서 검색창에 검색어를 입력하면,

검색된 창으로 새로 접속되며, url의 "search?q=" 뒷부분이 검색어로 변경된다. 

 

 

 

예를 들어, Data Science 를 검색어로 입력할 시, 위와 같이 주소창의 주소가 그에 적합한 형태로 바뀜을 확인할 수 있다.

나는 formatting을 이용하여 url에서 검색어에 일치하는 부분을 {변수명}으로 설정하여 해당 부분을 일반화할 것이다. 

 

1
2
3
4
5
6
7
8
9
10
import requests
import xmltodict
url = 'https://news.google.com/rss/search?q=Data%20Science&hl=en-US&gl=US&ceid=US%3Aen'
# Add '/rss/' between "google.com" and "search"
data = requests.get(url).text
# We need to convert the XML file into a text in order to utilize it
 
news_data = xmltodict.parse(data)
# Converting the data into a dictionary
#news_data
cs

 

우선 request와 xmltodict 모듈을 불러온다. 

Data Science를 입력하였을 때의 url에서 "google.com"과 "search" 사이에 /rss/를 삽입하면, xml 형식의 파일에 대한 url로 변환할 수 있다. 

data라는 변수에 text 형식의 xml로 변환된 결과를 저장하고, news_data라는 변수에 xml을 dictionary로 변환하여 parse 한 데이터를 저장한다. 

 

xml 형식으로 변환된 url은 아래와 같은 형식으로 나타난다. 

 

 

1
2
3
4
5
6
7
8
9
10
import requests
import xmltodict
kw = 'Data' # Enter the keyword in this variable
url = f'https://news.google.com/rss/search?q={kw}&hl=en-US&gl=US&ceid=US%3Aen'
# Using the formatting, we can insert any keyword 
data = requests.get(url).text
news_data = xmltodict.parse(data)
news_data

cs

 

formatting을 지정하기 위해 작성한 코드이다.

위와 같은 코드를 실행하면, kw 변수에 다른 검색어를 입력하더라도

news_data가 해당 검색어에 적합한 결과를 가져다줄 것이다. 

 

 

news_data 는 위와 같은 매우 긴 형태의 Dictionary로 도출된다. 

뉴스의 제목 데이터만을 가져오기 위해서는 알맞은 Key값을 찾아서 인덱싱을 해야 한다. 

 

1
2
3
4
news_list = news_data['rss']['channel']['item']
 
for num in range(0len(news_list)):
    print(news_list[num]['title'])
cs

 

'rss', 'channel', 'item' Key를 차례대로 선택한 후, 해당 Value에 위치한 title을 위와 같은 반복문을 이용해 찾을 수 있다. 

 

 

위와 같은 반복문 실행 결과 수많은 Data Science 키워드에 대한 기사 제목들이 출력되는 것을 확인할 수 있다. 

 

>> 함수 만들기

이제 실행한 코드를 종합하여 뉴스 제목과 출처를 엑셀 파일로 저장하는 함수를 만들어 볼 것이다. 

 

1
2
3
4
5
6
7
8
9
10
11
def us_news_get(kw):
    url = f'https://news.google.com/rss/search?q={kw}&hl=en-US&gl=US&ceid=US%3Aen'
    data = requests.get(url).text
    news_data = xmltodict.parse(data)
    news_list = news_data['rss']['channel']['item']
    news_for_dic = []
    for num in range(0len(news_list)):
        news_for_dic.append({news_list[num]['title']:news_list[num]['source']['#text']})
    news_df = pd.DataFrame([news_for_dic[i].values() for i in range(0len(news_for_dic))], 
                           index = [news_for_dic[i].keys() for i in range(0len(news_for_dic))])
    news_df.to_csv(f'{kw}.csv')
cs

 

 

 

kw 매개변수에 DataScience를 입력한 결과, 위와 같은 DataScience.csv 라는 이름의 폴더가 생성되었다. 

II. XML - Using BeautifulSoup

이번에는 BeautifulSoup이라는, 말 그대로 "아름다운" 모듈을 사용해서 네이버 뉴스 정보를 가져올 것이다. 

새로운 모듈을 불러오는 것을 지양하는 편이지만,

BeautifulSoup은 크롤링에 없어서는 안 될 최고존엄 존재이다,,

Dictionary에서 Key로 타고 들어가야 하는 모든 과정을 하나로 압축해 주기 때문에 복잡성과 시간 문제를 해결할 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import requests
import bs4
import pandas as pd
 
kw = '펭수'
url = f'https://news.google.com/rss/search?q={kw}&hl=ko&gl=KR&ceid=KR%3Ako'
data = requests.get(url).text
 
news_data = bs4.BeautifulSoup(data, features = 'xml')
news_list = news_data.find_all('item'
 
all_news_list = []
 
for news in news_list:
    title = news.find('title').text
    source = news.find('source').text
    one_news_dict = {'title': title, 'source': source}
    all_news_list.append(one_news_dict)
        
pd.DataFrame(all_news_list).to_csv(kw + '.csv', index = False, encoding = 'utf-8-sig')
cs

 

우선, BeautifulSoup 함수를 포함하고 있는 bs4라는 모듈을 import하였다. 

Json에서 사용했던 parse 메서드를 BeautifulSoup이 대신하고 있다고 생각하면 된다. 

features = 'xml' 은 해석기를 지정하는 코드이다. 

BeautifulSoup을 빛내주는 메서드는 "find_all"과 "find" 메서드이다. 

기존의 Dictionary에서는 일일히 Key를 찾아서 원하는 정보를 찾아야 했지만,

find 메서드를 활용하면, 관심 있는 키 자체의 정보만 바로 입력하여 도출할 수 있다. 

다만, 태그 정보를 지우기 위해 title과 source를 뽑을 때 .text 함수를 활용해야 함을 주의하자. 

 

 

저장된 all_news_list 데이터프레임은 위와 같은 결과를 가져온다. 정말 아름답다..

 

 

다음 포스팅에서는 마지막 웹 파일 형식인 HTML에 대한 내용을 다룰 것이다. 

실생활에 직접적으로 접목할 수 있으며, 최신 동향 분석 시 가장 활용도가 높을 것이라고 생각한다.

또한, 지금까지는 정적크롤링을 다루었다면, 다음에는 동적크롤링에 대해서도 알아볼 것이다.

'Python Programming > Notes' 카테고리의 다른 글

CRISP-DM 공공자전거 데이터 분석  (2) 2021.04.02
Web_Crawler(3)_HTML  (0) 2021.03.22
금융데이터 다루기 - 패키지 설치와 Plotting  (0) 2021.03.18
Web Crawler(1) - JSON  (0) 2021.02.14