Scraping

1. Intro

scraping: 웹사이트에서 html을 읽어와 필요한 데이터를 추출하여 수집하는 기술

scraping을 하기위해서는 requests와 bs4 library 설치해야한다.

!pip install requests bs4

웹과의 소통을 용이하게 해주는 request library와 scraping 기능을 하는 BeautifulSoup library를 bs4로부터 불러온다. library 사용법은 해당 library 개발 홈페이지에 가면 상세히 설명이 되어있다.

import requests
from bs4 import BeautifulSoup

#headers 변수에는 사람인 척 할 수 있는 정보를 넣어둠; 클릭했을 때 왔다갔다하는 정보
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}

#data 변수는 서버 진입 요청 후 주는 정보를 값으로 가짐
data = requests.get('https://search.naver.com/search.naver?where=news&ie=utf8&sm=nws_hty&query=삼성전자',headers=headers)

#soup 변수는 받은 data를 솎아내는 BeautifulSoup library를 값으로 가지는데 이 라이브러리 사용시 정보를 text로, html을 파이썬에서 쓸 수 있는 형태로 가공(parsing)하여 사용하겠다.
soup = BeautifulSoup(data.text, 'html.parser')

#library 사용법: 변수지정 값 soup.select_one('해당기사 <a ~> selector')
a = soup.select_one('#sp_nws1 > div.news_wrap.api_ani_send > div > a')

#a: html copy selector 해온거 전체 내용 코드, a.text: 제목만, a['href']: 기사링크
a

2. Scraping_for

scraping 기본을 알아봤으니, 반복작업을 시켜보자.
언론사가 선정한 주요기사가 업로드 된 네이버 웹페이지에서 삼성전자 관련 기사를 뽑아보기로 했다.

import requests
from bs4 import BeautifulSoup

headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}

data = requests.get('https://search.naver.com/search.naver?where=news&ie=utf8&sm=nws_hty&query=삼성전자',headers=headers)

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

#lis는 ul 밑의 li항목에 소속된 기사 전부; 여러개 불러올땐 soup.select('ul selector')
lis = soup.select('#main_pack > section > div > div.group_news > ul > li')

#lis 내에 있는 li에 대해 반복작업해줘:
  #a는 'a.news_tit'class를 가지고 있는 항목 하나; 웹페이지 내 모든 기사 제목 class가 'a.news_tit'임 
  #a변수에 해당되는 기사 제목과 링크 가져와
for li in lis:
  a = li.select_one('a.news_tit')
  print(a.text, a['href'])

3. Scraping_def

반복작업을 알아봤으니 이제 함수로 지정해서 사용해보자.
왜? 왜 함수로 지정해놓는데?
함수로 지정해 놓으면 함수값을 keyword로 지정해서 정보를 보다 더 편하게 가져올 수 있기 때문이지.

import requests
from bs4 import BeautifulSoup

#keyword 함수 지정 후 data = requests.get(f'url'); url 앞에 f, 끝부분 query='string'을 ={keyword}로 변경
def get_news(keyword):

  headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
  data = requests.get(f'https://search.naver.com/search.naver?where=news&ie=utf8&sm=nws_hty&query={keyword}',headers=headers)
  soup = BeautifulSoup(data.text, 'html.parser')

  lis = soup.select('#main_pack > section > div > div.group_news > ul > li')

  for li in lis:
    a = li.select_one('a.news_tit')
    
    #media 변수는 li 중 <a>...</a> 내 class가 info press인 항목 하나를 값으로 가지며, text형태임
    media = li.select_one('a.info.press').text 
    
    #media 변수는 이전 설정된 media 값에서 '언론사 선정' text를 빈칸으로 대체함
    media = media.replace('언론사 선정', '')
    
    print(a.text, a['href'], media)

Reflection

나는 여태 '나는 문과생이다'라는 lable에 스스로를 가두고 있었다. 태어나서부터 대학원 석사 졸업까지 쭉 이과스러운 것들로 부터 등을 돌리고 살았다. 코딩을 공부해보자는 용기가 생기기까지 참 많은 시간이 걸렸다. 좁게 보면 문과, 이과라는 카테고리지만, 더 넓게 보면 인생에서 무언가를 혹은 누군가를 특정 유형에 집어넣어 나 편하고자 바라보고 이해하며 스스로를 방어하는 경우가 많은 것 같다.
python을 배우며 미래에 대한 생각 뿐만 아니라 지난 시간도 생각하게 된다. 헛헛하다. 동시에 앞으로 채워갈 일만 남았기에 즐겁기도 하다.

profile
coding을 잘하고 싶은 아저씨

0개의 댓글