Upstage AI Lab 6기

웹크롤링 (BeautifulSoup)

jyun34 2024. 11. 22. 20:06

크롤링이란 자동화된 프로그램이나 봇(웹 크롤러)을 사용하여 웹사이트의 정보를 수집하는 과정이다. 이를 긁어온다고 표현한다.

 

 

크롤링을 할 때는 지켜야하는 규칙이 있는데, 해당 사이트 주소에 /robots.txt를 쓰면 나온다.

서울특별시 공공데이터 robots.txt

 

User-agent의 '*'는 모든 크롤러를 대상으로 한다는 의미이다. 대다수의 사이트들은 '*'로 끝나지만 특이하게 구글은 워낙 다루는 데이터가 많아서 그런지 쓰여져있는게 엄청 많다.

Allow가 허용한다는 내용이고, Disallow는 허용 안 한다는 의미이다. 허용 안 하는 데이터에 접근하면 사이트에서 밴(ban)을 할 수 있으니 주의하자.

 

 

원래는 네이버나 구글에서 이미지 크롤링을 해볼까 했는데 죄다 금지라 그냥 안 할 생각.

User Agent를 바꿔서 해볼까 했지만 너무 오래 전부터 있었던 방법이기도 하고, 둘 다 대기업이니 그 정도 방어책은 당연히 있을거라 생각하며 가급적 안 하는걸 추천한다.

예전에 네이버 검색페이지에서 크롤링 했던 기억이 있는데, 그 때는 robots.txt를 몰랐어서 네이버에서 일부러 밴을 안 한건지 잘 모르겠다.

네이버 검색페이지의 robots.txt
구글 robots.txt

 

솔직히 구글은 자기들도 크롤링으로 다른 사이트에 있는 데이터 다 긁어오면서, 그냥 이미지 몇개 긁는 것도 금지하고 양심이 없네.

라고 생각을 하는데 사실 api를 통해서 크롤링 정보를 제공하는 경우는 있으니 이건 다음 글에서 다루고자 한다.

 

 

아무튼 본문으로 돌아와서, 일단 아무거나 긁어보고자 한다. 

 

 

위에처럼 하기 위해서는 F12를 눌러 개발자 옵션을 열어줘야한다. 그리고 빨간색으로 표시한 부분을 누르고 웹사이트의 이곳저곳을 만지면 그 부분의 정보가 개발자 옵션에 뜬다.

 

 

 

우선 파이썬에 해당 웹사이트의 정보를 불러와야한다.

웹사이트는 html, css, java script로 이루어져있고 크롤링을 할 때는 html 정보를 긁어오는 것이라 생각하면 된다.

방법은 아래의 두 가지가 있는데 편한 것을 고르면 된다.

 

 

BeautifulSoup()은 BeautifulSoup 객체를 만드는 것이라 직관적이게 bs_obj로 이름지었다.

 

BeautifulSoup(가져올 주소, "html parser"). 그냥 외우면 된다.

 

 

저 광활한 html 정보 안에 원하는 정보가 어디있는지 찾아야한다. 해당 html 요소를 찾아보자. 나는 '산업/경제'를 긁어올려고 한다.

 

 

html 정보에는 <h>, <a>, <li>, <span> 등등이 있는데 이것을 find() 함수를 이용해 찾아본다.

나는 find_all()을 쓴건데 이 둘의 차이는 몇 개를 찾느냐의 차이이다.

find()는 제일 앞의 것만 찾아온다. find_all()은 찾는 것들을 모두 list로 담아서 준다.

 

음... 그런데 'span'으로 찾아보니 너무 많다. 다른 것을 이용해서 찾아보자.

 

 

'a'로 찾아도 마찬가지로 많다.

하지만 'span'으로 찾을 때와는 차이점이 있는데, class 정보가 있다는 것이다. title도 있고.

 

 

먼저 class 정보를 이용해서 찾아봤다.

class는 'n' 뒤에 숫자가 있는 문자열인 것을 이용해 for문으로 뽑아봤다.

.text는 "<span> 내용 </span>" 같은 정보에서 내용만 빼오는 것이다.

하지만 <a> 안에 <span>이 2개나 있어 다른 것도 붙어나왔다.

이것을 없애기 위해서는 정규표현식(re)를 이용해서 없애야한다. 정규표현식은 다음에 다룰 생각이다.

 

아니면 아까 나온 find()를 이용하면 된다.

find()는 제일 앞의 것만 찾아온다고 했었다.

아니면 find_all()이 list로 리턴하는 것을 생각하면 word[0].text로 해도 될 것이다.

 

이번엔 title을 이용해서 찾는 방법이다.

 

 

 

원래는 네이버에서 적당히 할려고 했는데 여러 난관이 있어서 시간이 오래 걸렸다. 아까 네이버 검색페이지는 다 허용 안된다고 했었는데, 네이버는 페이지마다 robots.txt 내용이 다 다르다.

 

다음 selenium을 다루는 글에서는 네이버 홈페이지에서 할 생각이다.

'Upstage AI Lab 6기' 카테고리의 다른 글

크롤링 (API, json)  (0) 2024.11.25
웹크롤링 (selenium)  (0) 2024.11.23
Jupyter notebook 쓸 때 팁  (2) 2024.11.20
Data Scientist 마인드셋 특강 후기  (4) 2024.11.16
Upstage AI Lab 6기 OT  (5) 2024.11.15