매일 매일 미라클 코딩

BeautifulSoup - 웹페이지 정보 추출하기 (크롤링) 본문

알고리즘/PYTHON

BeautifulSoup - 웹페이지 정보 추출하기 (크롤링)

뚜벅-뚜벅 2021. 3. 16. 01:52

웹 크롤링 (Crawling) : 페이지 자체를 다운로드, 수집

웹 스크랩핑 (Scrapping): 페이지에서 원하는 부분만 추출

일반적으로 둘을 합쳐 크롤링으로 통용되고 있다

 

오늘은 파이썬에서 제공하는 BeautifulSoup 라이브러리를 통해, 윤동주 시인의 작품 리스트를 가져오고자 한다.

위키문헌에서 윤동주 시인을 검색해 보았다.

일일이 받아쓰기엔 작품이 굉장히 많다. 하지만 이미 잘 정리된 데이터가 있으니 프로그래밍을 통해 이를 추출하면 될 것이다.

 

데이터 크롤링을 위해서는 웹에서 가져오고자 하는 데이터가 어떤 선택자에 의해 표현되고 있는지 알아야한다.

F12 번을 눌러 페이지 소스를 확인한다. Element 탭 왼쪽의 버튼을 누르면 페이지 요소를 직접 눌러 태그를 확인할 수 있다.

 

 

작품 이름을 추출할 것이기 때문에 '하늘과 바람과 별과 시' 텍스트를 눌러 태그를 확인하였다.

같은 태그를 가진 정보를 추출하기 위해 선택자를 복사해야한다.  

 

마우스 우클릭 > Copy > Copy selector 

 

파이참으로 가본다. 

 

 

먼저 BeautifulSoup 과 url라이브러리를 임포트한다.

 

url = 데이터를 추출할 원본 페이지 주소를 입력한다

한글이 포함된 경우 저렇게 마구 변환되는게 정상이니 놀라지말것

 

위 코드에서 html을 출력해보면, url 주소에서 html 코드를 전부 읽어왔음을 알 수 있다.

이중 필요한 태그만 추출하기 위해 BeautifulSoup의 'html.parser'를 사용해 코드를 분해한다.

그 다음 worklist 라는 변수에 아까 긁어온 Selector에 해당하는 값들을 모두 저장하였다.

 

이를 for문으로 모두 출력하면 다음과 같은 결과를 확인할 수 있다.

 

 

 

 

그런데 '하늘과 바람과 별과 시' 대신  증보판이라는 text가 맨위에 출력되었다. 저 녀석도 시 제목들처럼 ul> li> a 태그를 받고있기 때문이다. 코드를 살펴보니 시제목들은 title 이라는 속성을 하나 더 갖고 있다. 이를 이용해 엄한 text가 아닌 '작품 제목'이라는 의미를 가진 데이터만 추출해 보겠다.

 

 

worklist 중 속성으로 'title' 을 갖고 있는 것들을 출력하겠다는 말

 

 

위 코드를 실행하면 아래와 같이 더 정확하고 세밀한, 작품 정보로서의 데이터를 읽어올 수 있다. 

 

 

 

조금 아쉬운 점은, '하늘과 바람과 별과 시'라는 시집에 담긴 시들의 제목은 추출하지 못했다는 것이다. 

방금 전 선택한 작품들의 selector 보다 한 단계 안 쪽에 위치했기 떄문이다. 

 

 

시집에 수록되었단 이유로 출력하지 못하다니. 용납할 수 없다.

마찬가지로 Copy > Copy selector > 파이썬 파일에 복사

이 셀렉터로 추출한 내용은 '하늘과...' 시집의 수록시라는 의미에서 sky_list에 담아준다.

 

 

enumerate는 몇 번째 반복문인지 확인할 때 사용한다. 인덱스 번호와 컬렉션의 원소를 tuple형태로 반환한다.

 

이전 코드와 마찬가지로 print(work.attrs['title'])로 출력하되, 첫번째 반복문에서(i==0) 한단계 아래의 selector, 즉 skylist 에 해당하는 내용들을 반복출력하겠다는 의미이다. 그러면 아래와 같이 첫번째 제목인 '하늘과 바람과 별과 시' 아래에 수록 작품 데이터가 출력 되는 것을 볼 수 있다. 

 

 

 

 

데이터 크롤링 후 이를 파일로 저장하여 활용할 수도 있다. 아래와 같이 코드를 작성한다. 

 

 

변수 f = open("생성할파일이름.type", "w(write)", 인코딩방식)

f.write() = 파일에 다음 데이터를 작성

f.close() = 파일 작성 완료. 종료 

 

실행 완료시 프로젝트 익스플로러에

'윤동주 작품 목록.txt' 가 생성된것을 확인할 수 있다. 

 

당황스럽지만 euc-kr 인코딩이라서 그렇다.

엑셀이나 워드로 파일을 열면 윤동주 시인의 작품제목리스트를 확인할 수 있다.