본문 바로가기
데이터 분석

웹 크롤링 with Python 1장

by ChocoPeanut 2017. 7. 11.

웹 크롤링 with Python 1

 

웹 브라우저는 패킷을 만들고, 보내고, 돌아온 데이터를 해석해 사진, 소리, 비디오, 텍스트 등으로 표현하는 매우 유용한 애플리케이션이다. 웹 브라우저는 코드이기 때문에 코드는 떼어내서 기본 구성 요소를 나누고, 다시 만들고, 재사용하고, 원하는 어떤 것으로든 바꿀 수 있다. 웹 크롤링은 웹 브라우저로부터 우리가 가공하고 싶은 데이터를 가져오는 과정이다. 여기에서는 가져오는 과정과 저장하는 과정, 다시 불러오는 과정 등등이 포함되어 있다.


urllib 라이브러리는 파이썬의 표준 라이브러리로 웹을 통해 데이터를 요청하는 함수, 쿠키를 처리하는 함수, 심지어 헤더나 유저 에이전트 같은 메타데이터를 바꾸는 함수도 있다. urllib 라이브러리의 함수 중에서 urlopen은 네트워크를 통해 원격 객체를 읽는다.


BeautifulSoup은 잘못된 HTML을 수정하여 쉽게 탐색할 수 있는 XML 형싞의 파이썬 객체로 변환하여 데이터를 제공해주는 라이브러리이다. BeautifulSoup 라이브러리 중에서 가장 많이 사용되는 객체는 바로 BeautifulSoup이다. 이는 urlopen 으로 읽어온 객체의 read함수로 인자로 받아 하나의 객체를 만들어낸다. 이를 이용하여 웹 크롤링을 진행할 것이다.


BeautifulSoup 객체에는 find() findAll()이라는 함수가 있다. find 함수는 지정된 페이지에서 해당하는 데이터 중 가장 위에 존재하는 하나의 데이터만 제공하고 findAll은 지정된 페이지에서 해당하는 모든 정보를 가져오게 된다. findfindAll은 모두 다양한 인자를 받는다. tag 인자는 HTML의 문법의 tag와 같은 정보이다. 따라서 tag를 넣게 되면 이 tag에 해당하는 정보를 가져오게 된다. attributes 인자는 속성으로 파이썬 딕셔너리를 받고 classid와 같은 속성 인자에 대한 정보를 가져온다. text 인자는 속성이 아니라 content에 해당하는 정보를 가져오게 된다. keyword 인자는 attributes와 비슷한 작동을 하는데 속성에 대한 정보를 통해 데이터를 가져온다. 하지만 attributes 인자는 딕셔너리 형태로 인자를 받지만 keyword는 등호 기호로 인자를 받는다.


BeautifulSoup 객체에는 자식과 자손이 있다. 자식은 HTML의 기준에서 바로 아래에 있는 tag를 의미하고 자손은 아래에 있는 모든 tag를 의미한다. 자식을 찾는 함수로는 children()을 사용할 수 있고 자손을 찾는 함수로는 descendants()를 사용할 수 있다.


정규 표현식은 정해진 규칙으로 문자나 숫자를 표현하는 방식이다. 대신에 컴퓨터가 이해하기 쉽게 표현을 하는 방식이다. *는 바로 앞의 문자나 하위 표현식이 0번 이상 나타나는 것을 의미하고 +1번 이상 나타나는 것을 의미한다. 이외에도 다양한 기호들이 존재한다. BeautifulSoup에서는 srchref와 같은 위치나 링크에 대한 정보를 표현할 때 많이 사용된다. 정규 표현식을 해석하는 것은 re 라이브러리를 이용하여 compile() 함수를 사용해야한다.