크롤링 12

[뉴스 크롤링] 네이버 뉴스 마지막 페이지까지 똑똑하게 검색하기 (feat.JK)

역시 사람은 똑똑하고 봐야... 지난 과정에서 파이널 프로젝트를 진행할 때, 네이버 뉴스 크롤링을 진행했다. 그 때 네이버 뉴스 검색 결과 페이지가 400페이지밖에 표시되지 않아서, 1) 월별로 마지막 페이지가 몇 페이지까지 있는지 검색한 뒤, 2) 마지막 페이지를 설정해 주었다. 프로젝트를 마무리한 뒤에도 이 부분을 (굳이) 일일이 검색하고 설정해 주어야 하나, 혹시 다른 해결책은 없나 궁금해 했었으나, 마땅한 방법을 찾지는 못했다. 그런데 이번에 NLP 과정에서 JK(네이버 뉴스 크롤링 담당)와 미니 프로젝트를 진행하며, JK가 재귀함수를 이용해 내가 궁금해 하던 부분을 간단하게 해결한 것을 보았다. 핵심은 재귀였다. 마지막 페이지까지 검색하는 법을 배웠다. 개인적으로 코딩 처음 배울 때부터 재귀가 ..

기타 2020.06.27

[트위터 크롤링] GetOldTweets3

강의 중간 프로젝트로 트위터 데이터를 크롤링했다. 트위터 크롤링은 API(공식 Standard API를 활용하더라도 수집할 수 있는 기간에 제한이 있다), Request 에러 핸들링 등으로 인해 골치가 아프다. 위의 문제에 부딪히지 않기 위해 Selenium 및 네트워크 요청 분석을 통해 코드를 짜서 스크레이핑을 진행하려 했으나, 미니 프로젝트였기 때문에, 시간이 많지 않아 성공하지는 못했다. 하루 이틀 고생했는데, 결론적으로 내가 구현하고 싶은 방법을 잘 구현해 놓은 라이브러리를 발견했다. API 없이도 이전 트윗을 수집할 수 있었다. 데이터 분석이 목적이 아니라 단순히 여러 사이트에서 데이터를 수집하는 방법을 연습하는 프로젝트였기 때문에, 어떻게 라이브러리를 활용했는지를 위주로 크롤링 방법만 기록한다..

기타 2020.06.11

[1] 커뮤니티 게시물 크롤러_2. 루리웹닷컴

# 사전 작업 루리웹닷컴의 경우, 검색어를 통합검색 창에 검색했을 때 뉴스, 게시글, 댓글, 마이피, 구글 통합검색 결과가 모두 검색되어 한 화면에 결과로 나온다. 뉴스와 구글 통합검색 결과는 애초에 팀의 크롤링 대상이 아니기 때문에 제외한다. 마이피는 루리웹닷컴만의 게시판인 것 같은데, 루리웹 회원들만의 공간으로 판단된다. 회원 아이디가 없으면 접근할 수 없는 경우도 있고, 공론장에 게시된 글이나 댓글으로 판단하기에는 무리가 있기 때문에 크롤링하지 않는다. 따라서 검색 결과 창에서 게시글과 댓글만을 크롤링하기로 한다. 그러나 의사결정이 필요한 부분에 부딪혔다. 문제는 다음과 같았다. 첫째, 댓글로 검색된 결과 중 게시글 검색 결과에 포함된 글이 있을 수 있다. 둘째, 댓글로 검색된 결과 중, 실제 클릭..

[1] 커뮤니티 게시물 크롤러_1. MLBPARK_2. 코드 수정 및 마무리

이번 단계의 작업에서는 이전 단계의 작업에서 찾아낸 문제점을 위주로 코드를 수정한다. 작업을 통해 얻고자 하는 결과물은 크롤러가 직접 MLBPARK 불펜에서 '주52시간'을 검색하여 찾아낸 마지막 페이지 범위까지의 게시물들 중, 커뮤니티 이름(MLBPARK), 글 제목, 글 작성 시간, 글 작성자, 추천 수, 조회 수, 댓글 수, 댓글 내용이다. # 사용한 라이브러리 Requests Selenium time BeautifulSoup urllib.parse csv # 데이터 추출 코드 수정 첫 번째로, 조회 수와 추천 수가 똑같다는 문제를 해결했다. 기존에 내 코드가 선택한 부분은 파란 음영이 칠해진 부분(..!)이었다. 선택해야 하는 부분은 빨간색 상자 부분이다. 조회수 정보를 담은 태그를 찾기 위해, ..

[1] 커뮤니티 게시물 크롤러_1. MLBPARK_1. 데이터 적재

이번 단계의 작업에서는 크롤러를 통해 MLBPARK 글과 댓글을 스크레이핑하고, 그것을 저장하는 함수를 만든다. 작업을 통해 얻고자 하는 결과물은 크롤러가 직접 MLBPARK 불펜에서 '주52시간'을 검색하여 찾아낸 마지막 페이지 범위까지의 게시물들 중, 커뮤니티 이름(MLBPARK), 글 제목, 글 작성 시간, 글 작성자, 추천 수, 조회 수, 댓글 수, 댓글 내용이다. # 사용한 라이브러리 Requests Selenium time BeautifulSoup urllib.parse csv # 검색 결과 마지막 페이지 얻기 네이버 크롤러에서와 달리, Selenium을 이용해 마지막 페이지에 갈 때까지 클릭한다. 마지막 페이지에 가면 '다음' 버튼이 나오지 않는다는 것을 활용했다. '다음' 버튼은 class..

[1] 커뮤니티 게시물 크롤러_1. MLBPARK_0. 사전 작업

0401 회의 이후, 나는 MLBPARK와 루리웹닷컴에서 주52시간 관련 게시물들을 크롤링하는 역할을 맡았다. 아직 네이버 뉴스 댓글 크롤러를 업그레이드하지는 못했지만, 일단 이를 활용해 필요한 데이터를 쌓는다. 사전 작업으로, 어떤 데이터를, 어디에서 얻어야 하는지 파악한다. 이후, 필요한 정보를 얻기 위해 내가 만들 크롤러가 어떤 링크들을 타고 돌아다녀야 하는지, 그 링크들의 URL 구조가 어떻게 되는지 파악한다. # 어떤 데이터를 얻어야 하는가? 우선 MLBPARK 사이트에서 야구 관련 게시물이 아닌 글들은 전부 BULLPEN 게시판에 올라와 있다. 따라서 MLBPARK BULLPEN 게시판이 정보를 얻을 곳이다. 첫째, MLBPARK BULLPEN 게시판에서, 둘째, '주52시간'을 검색하면 나오..

[1] 네이버 뉴스 댓글 크롤러_ver1.5_검색페이지 확대

ver1의 크롤러를 조금 수정하여 최대 검색 페이지 숫자를 지정하여 크롤링하도록 함수를 수정했다. 작업을 통해 얻고자 하는 결과물은 '주52시간'으로 검색했을 때 나오는 모둔 기사들에서 스크레이핑한 필요한 정보들이다. # 검색 페이지 지정 ver1의 함수에서 크게 달라진 것은 없다. 다만, 어차피 네이버는 최대로 제공하는 검색 결과 페이지가 400페이지 까지이기 때문에, 마지막 페이지를 얻는 함수를 없애고, 검색 페이지를 변수로 지정하여 해당하는 페이지까지 루프를 돌면서 네이버 뉴스 링크를 모아 오는 방식으로 함수를 수정했다. 실행할 main 함수에서 검색 페이지는 전역 변수로 설정했다. # 변수 설정 QUERY = "주52시간" search_QUERY = urllib.parse.urlencode({'q..

[1] 네이버 뉴스 댓글 크롤러_ver1_4. 데이터 저장 및 마무리

이번 단계의 작업에서는 크롤러를 통해 뉴스 기사 댓글을 스크레이핑하고, 그것을 저장하는 함수를 만든다. 작업을 통해 얻고자 하는 결과물은 크롤러가 직접 네이버 뉴스 홈에서 '주52시간'을 검색하여 찾아낸 마지막 페이지 범위까지의 기사들 중, 네이버 뉴스 플랫폼에 등록된 모든 기사들에서 스크레이핑한 플랫폼 정보(NAVER), 기사 제목, 기사 작성 시간, 언론사, 댓글 작성자, 댓글 작성 시간, 댓글 내용, 댓글 공감/비공감 수이다. # 사용한 라이브러리 Requests, Selenium, time, BeautifulSoup, urllib.parse, re : 이전과 동일. csv # csv 파일로 저장하기 csv 모듈을 이용해 csv 파일로 저장하는 함수를 만든다. 아래 함수는 리스트를 인자로 받아 리스..

[1] 네이버 뉴스 댓글 크롤러_ver1_3. Selenium 이용

동적으로 변화하는 컨텐츠인 댓글을 크롤링하기 위해서는 Selenium을 이용해야 한다. 작업을 통해 얻고자 하는 결과물은 Selenium을 이용해 추출한 모든 네이버 뉴스 링크들의 뉴스 플랫폼, 제목, 작성 시간, 언론사, 댓글 작성자, 작성 시간, 댓글 내용, 댓글 공감/비공감 수이다. # 사용한 라이브러리 Requests Selenium BeautifulSoup, re, time, urllib.parse # Selenium을 이용해 html 페이지 불러오기 웹 드라이버의 .page_source를 활용해 브라우저에 보이는 상태 그대로의 HTML을 가져온다. requests를 사용할 때와 달리, 웹 브라우저 엔진이 DOM이 바뀌는 상태를 기다릴 수 있도록 기다려야 한다. Selenium의 묵시적 대기로 ..

[1] 네이버 뉴스 댓글 크롤러_ver1_2. 각 기사 링크 페이지에 접속해 정보 가져오기

받아 온 뉴스 링크에서 댓글 링크를 통해 댓글 페이지에 접속하고자 한다. 접속 후, 댓글 관련 정보를 제외한 기사 제목, 기사 작성 시간, 언론사 정보까지 가져온다. 이로써 접속하여 데이터를 정상적으로 받아올 수 있는지 확인한다. 작업을 통해 얻고자 하는 결과물은 이전 단계에서 추출한 모든 네이버 뉴스 링크들의 제목, 작성 시간, 언론사이다. # 댓글 페이지 접속하기 사전 작업에서 확인했듯, 댓글 페이지의 URL에는 'm_view=1'이 붙는다. 따라서 이전 단계에서 찾은 모든 네이버 기사 URL의 뒤에 '&m_view'를 붙여 준다. 출력 상태 코드를 확인하여 제대로 실행되는지 확인한다. naver_news_links = get_news_links(last_page, LINK_PAT) for link ..