ingyunson-blog
ingyunson-blog
Code Travler
4 posts
프로그래밍과 코딩을 하면서 얻은 것들을 나누는 공간입니다
Don't wanna be here? Send us removal request.
ingyunson-blog · 7 years ago
Text
개인 업무용 비서 만들기 #2. 네이버 뉴스 헤드라인 크롤러 만들기
http://someoneofsunrin.tistory.com/48import requests from bs4 import BeautifulSoup as bs url = 'https://news.naver.com/' news = requests.get(url) html = news.text soup = bs(html, 'lxml') headline_title = [] headline_url = [] for i in range(1, 3): headline_w_photo = soup.select('#pan_today_main_news > div:nth-of-type({0}) > div > a > div.newsnow_img_mask > p'.format(i)) headline_w_photo_url = soup.select('#pan_today_main_news > div:nth-of-type({0}) > div > a'.format(i)) headline_title.append(headline_w_photo[0].text) headline_url.append(headline_w_photo_url[0].get('href')) for idx in range(len(soup.select('#text_today_main_news_801001 > li'))): headline_news = soup.select('#text_today_main_news_801001 > li:nth-of-type({0}) > div > a > strong'.format(idx + 1)) headline_news_url = soup.select('#text_today_main_news_801001 > li:nth-of-type({0}) > div > a'.format(idx + 1)) headline_title.append(headline_news[0].text) headline_url.append(headline_news_url[0].get('href')) for idx in range(len(soup.select('#text_today_main_news_428288 > li'))): headline_news = soup.select('#text_today_main_news_428288 > li:nth-of-type({0}) > div > a > strong'.format(idx + 1)) headline_news_url = soup.select('#text_today_main_news_428288 > li:nth-of-type({0}) > div > a'.format(idx + 1)) headline_title.append(headline_news[0].text) headline_url.append(headline_news_url[0].get('href')) print(headline_title, headline_url)
이전 글에서 위의 코드를 사용해서 네이버 뉴스 헤드라인을 가져오게 만들었습니다. 이 정도 코드는 쉽게 짜고 이해하시는 분들이 많으시겠지만 혹여나 웹 크롤링이 처음인 분들을 위해(제가 그랬으므로) 한 줄씩 설명을 해 보고자 합니다.
import requests
from bs4 import BeautifulSoup as bs
import는 설치된 라이브러리를 파이썬 환경에서 가져와서 사용하겠다는 선언입니다. 여기에서는 우선 웹과 정보를 주고받기 위해 requests 라이브러리를 가져오고 이렇게 가져온 정보를 파싱(정보를 분해하는 것)하기 위해 BeautifulSoup 라이브러리를 가져왔습니다. 이 때, BeautifulSoup 라이브러리는 bs4라는 패키지 안에 있는 것이므로 우선 from bs4로 패키지를 불러오고 그 안에 있는 BeautifulSoup을 가져왔습니다. 그리고 이것이 너무 길기 때문에 앞으로 이것을 bs라고 지칭(as bs)하기로 했습니다.
url = 'https://news.naver.com/'
news = requests.get(url)
html = news.text
soup = bs(html, 'lxml')
1번 줄은 네이버 뉴스 웹페이지를 url이라는 변수로 지정한 것입니다. 2번 줄은 requests의 하위 기능인 get을 이용하여 웹의 정보를 가져옵니다. 이 때 가져올 대상의 주소는 1번 줄에서 정의한 url이 되는 것이지요. 물론 여기에 url 변수 외에 다른 http주소를 입력해도 되지만 변수로 사용하는 것이 간결하기 때문에 이렇게 처리했습니다. 그리고 이렇게 가져온 정보를 news라는 변수로 지정합니다. 3번 줄은 news변수에서 텍스트만을 추출(.text)하고 이것을 html이라는 변수로 지정합니다. 4번줄은 bs를 통해 파싱합니다. 구조는 bs(파싱 대상, 파싱 방식)입니다. 즉, 3번 줄의 html변수를 파싱하고 그 방식은 lxml이라는 뜻입니다. 이렇게 파싱한 정보를 soup이라는 변수로 합니다.
이렇게 하고 soup의 정보를 보면(print(soup)을 이용) 해당 페이지의 html(태그)이 다 들어와 있는 것을 확인할 수 있습니다.
headline_title = []
headline_url = []
이것은 미리 출력할 정보의 비어있는 칸을 만들어주는 것입니다. 상황에 따라 정보가 변화될 것이기 때문에 리스트 형태로 만들었습니다. headline_title은 제목을, headline_url은 해당 기사의 주소가 됩니다.
그 아래는 가져온 html에서 기사 제목과 url을 추출하는 부분입니다. 네이버 뉴스의 경우 헤드라인이 사진이 있는 부분, 섹션 1, 섹션 2으로 구성되어 있어서 총 세 단계로 추출할 필요가 있습니다. 소스코드가 길어서 요약하자면 다음과 같은 구조입니다.
for i in range():
headline_news = soup.select(<CSS Selector>)
headline_url = soup.select(<CSS Selector>)
headline_title.append(headline_news[0].text)
headline_url.append(headline_url[0].get('href'))
내용은 조금씩 다르지만 위의 내용을 반복한 것입니다. 첫번째 줄은 for문을 이용하여 아래의 들여쓰기 된 내용을 반복한다는 명령입니다. range를 통해 범위를 지정하였습니다. 두번째 줄은 제목의 CSS 선택자에 해당하는 정보를 가져옵니다. 세번째줄은 url이 있는 영역을 가져오는 것이고요.
CSS선택자가 조금 어려울 수 있는데 크롬 개발자도구를 이용하면 쉽습니다. 크롬 개발자도구에서 왼쪽 위의 아이콘을 누르고 CSS를 원하는 영역에 커서를 가져가면 하이라이트가 되고 그 위치에서 클릭하면 해당 영역의 html에 위치합니다. 이 상태에서 우클릭 > Copy > Copy Selector를 누르면 CSS선택자가 복사됩니다. 이것을 위의 <CSS Selector>에 붙여넣으면 됩니다.
http://someoneofsunrin.tistory.com/48 위 글을 읽으시면 간단하게 설명되어 있으니 참고하시면 됩니다.
이렇게 선택자를 통해 가져온 정보를 위의 리스트에 추가해주는 것이 4번, 5번 줄입니다. .append라는 명령은 현재 리스트에서 가장 마지막에 정보를 더하는 것이며 더하는 내용은 ()안에 있는 것이 됩니다. 단, 이 때에는 문자열(string)로만 가능하고 soup.select로 가져온 정보는 리스트형이므로 [0]을 이용하여 0번째 정보를 가져와 문자열로 가져오게 했습니다. 그리고 .text를 이용하여 태그를 제거한 텍스트만 가져오거나 .get(’href’)를 이용하여 href태그를 가진 값을 가져오도록 했습니다.
이렇게 정리한 내용을 print를 이용하여 출력하면 네이버 뉴스 헤드라인의 기사 제목과 url을 가져올 수 있게 됩니다.
0 notes
ingyunson-blog · 7 years ago
Text
텀블러에 GIST 소스코드를 넣는 법
방금전에 썼던 포스트(개인업무용 비서 만들기 #1)에 보시면 아래쪽에 GIST에서 가져온 소스코드가 보입니다.
텀블러에서는 작성한 소스코드를 공유하는 방법이 적당치 않아서 GIST를 넣으려고 하다보니 텀블러에서는 GIST를 임베드할 수 없다고 되어있어서 방법을 찾아보��가 해법을 알아내어 공유합니다.
단, 이 방법은 테마에 수정을 하는 방법이기 때문에 타임라인에서는 여전히 소스코드가 보이지 않습니다. 이 방법은 깃헙의 blairvanderhoof의 리파지토리를 이용하는 것입니다.
텀블러 블로그 페이지의 “설정”에 들어가면 “웹사이트 테마”가 있습니다. 여기에서 “테마편집”을 클릭하시고 왼쪽에서 “테마편집” 바로 아래쪽에 보시면 “HTML 편집”이 있습니다. 여기로 들어갑니다.
HTML편집에서 헤더 안에 아래 코드를 입력해줍니다.
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/gist-embed/2.7.1/gist-embed.min.js"></script>
이 상태에서 저장한 뒤에는 앞으로 글을 쓸 때 HTML 편집 모드에서 
<code data-gist-id="<gist-id>"></code>
위의 방식으로 GIST를 넣어줄 수 있습니다.
0 notes
ingyunson-blog · 7 years ago
Text
개인 업무용 비서 만들기 #1. 기본 구조와 웹크롤러
개인적으로 업무를 진행하는 것들 중에서 반복적으로 행하는 것들이 많고 계속해서 상황을 업데이트해야 하는 것들이 많아서 쓸데없이 시간을 잡아먹고 있었습니다.
그래서 최근에는 파이썬으로 간단히 코드를 짜서 텔레그램으로 필요한 업무를 진행하고 그 내용을 보고받는 식으로 도움을 받고 있습니다. 이 글에서는 간단하게나마 그 방식을 함께 나눠보고자 합니다.
기본 구조는 아래와 같습니다.
Tumblr media
우선 사용자가 텔레그램방에서 봇에게 작동을 원하는 기능을 명령어를 통해 실행시킵니다. 드러면 텔레그램이 파이썬으로 작동시켜놓은 코드를 실행시킵니다. 파이썬 프로그램에서는 작동된 코드를 통해 텔레그램 메시지로 반환합니다. 최종적으로 사용자는 작동시킨 명령에 맞는 결과를 받아보게 됩니다.
여기에서 “업무 프로그램”부분을 바꾸는 것으로 다양한 기능들을 구현할 수 힜습니다. 여기에서는 간단하게 네이버 뉴스의 첫페이지 헤드라인 뉴스들을 가져오는 것으로 만들어보겠습니다. 소스코드는 다음과 같습니다.
import requests from bs4 import BeautifulSoup as bs url = 'https://news.naver.com/' news = requests.get(url) html = news.text soup = bs(html, 'lxml') headline_title = [] headline_url = [] for i in range(1, 3): headline_w_photo = soup.select('#pan_today_main_news > div:nth-of-type({0}) > div > a > div.newsnow_img_mask > p'.format(i)) headline_w_photo_url = soup.select('#pan_today_main_news > div:nth-of-type({0}) > div > a'.format(i)) headline_title.append(headline_w_photo[0].text) headline_url.append(headline_w_photo_url[0].get('href')) for idx in range(len(soup.select('#text_today_main_news_801001 > li'))): headline_news = soup.select('#text_today_main_news_801001 > li:nth-of-type({0}) > div > a > strong'.format(idx + 1)) headline_news_url = soup.select('#text_today_main_news_801001 > li:nth-of-type({0}) > div > a'.format(idx + 1)) headline_title.append(headline_news[0].text) headline_url.append(headline_news_url[0].get('href')) for idx in range(len(soup.select('#text_today_main_news_428288 > li'))): headline_news = soup.select('#text_today_main_news_428288 > li:nth-of-type({0}) > div > a > strong'.format(idx + 1)) headline_news_url = soup.select('#text_today_main_news_428288 > li:nth-of-type({0}) > div > a'.format(idx + 1)) headline_title.append(headline_news[0].text) headline_url.append(headline_news_url[0].get('href')) print(headline_title, headline_url)
여기에 대한 자세한 기능은 나중에 설명하도록 하겠지만, 기본적으로 네이버 뉴스 페이지에서의 첫 10개 기사를 headline_title, headline_url이라는 변수로 출력해주게 됩니다. 후에 이것을 기반으로 해서 텔레그램과 소통하는 코드가 들어갈 것입니다.
0 notes
ingyunson-blog · 7 years ago
Text
안녕하세요
안녕하세요. 처음 뵙겠습니다. 프로그래밍 관련 공부 및 개발을 하면서 얻은 것들을 기록해두고, 그 내용을 함께 나눌 수 있는 곳을 찾다 보니 이 곳으로 오게 되었습니다.
저는 주로 블록체인, 자동화, 딥러닝(인공지능)에 관심을 가지고 있으며 해당 분야를 주된 개발 분야로 삼고 있습니다.
앞으로 잘 부탁드립니다.
0 notes