파이썬/라이브러리(API)

파이썬 인터넷 웹페이지 크롤링하기

코데방 2024. 3. 9.
728x90

파이썬 인터넷 웹페이지 크롤링 라이브러리

 

파이썬으로 웹페이지를 크롤링하기 위해서는 기본적으로 아래 4가지의 라이브러리를 많이 사용합니다.

 

  • requests : 페이지 요청 라이브러리
  • bs4의 BeautifulSoup : HTML 다루는 라이브러리
  • time : 안전하게 수집하는 방법
  • pandas : 수집한 데이터 엑셀화

 

추가로 이전 포스팅에서 다뤘던 정규표현식까지 사용해주면 조금 더 편리하게 사용할 수 있습니다.

 

https://codevang.tistory.com/344

 

 

 

 

로또 번호 크롤링해서 가져오기

 

먼저 다음 사이트에서 "로또"를 검색해봅니다. 

 

 

 

 

사이트 주소를 복사한 뒤 "requests" 라이브러리를 통해 페이지를 요청합니다. 

결과가 200번대이면 문제없음, 400번대이면 페이지 없음 등의 에러발생, 500번대면 권한 문제 등의 문제입니다.

url = requests.get("https://search.daum.net/search?w=tot&DA=YZR&t__nil_searchbox=btn&q=%EB%A1%9C%EB%98%90")
#200 문제없음 #400 : 존재하지 않는페이지 #500 : 로그인처리, 잠금 등
url

 

 

 

"requests.get()"을 통해 받은 객체는 응답 번호를 출력해줍니다.

 

응답받은 내용 전체를 출력하려면 "text"를 사용해줍니다. 

 

url.text

 

 

 

 

이제 "requests" 라이브러리의 역할은 끝났습니다. 

가져온 HTML 문자열을 이쁘게 정리해주기 위해 "BeautifulSoup" 라이브러리를 사용해줍니다.

html = BeautifulSoup(url.text)
html

 

 

 

이제 여기서 가져올 클래스명을 찾아야합니다.

찾고자 하는 데이터에서 우클릭 후 "검사"를 누르면 오른쪽에 개발자툴이 뜨면서 HTML 코드 등이 나옵니다.

 

 

 

 

로또 번호들은 "div class = "lottonum"안에 모두 묶여 있는 것을 확인할 수 있습니다. 

해당 클래스에 접근해 데이터를 뽑아봅니다.

lotto = html.find("div", class_ = "lottonum")

 

 

 

필요한 클래스의 내용을 깔끔하게 가져왔습니다.

여기서 숫자만 골라내기 위해 한 번 더 작업해 줍니다.

두 가지 방법이 있는데 먼저 "find_all()" 함수를 통해 해당 내용 안 특정 클래스의 내용만 다시 가져오는 방법입니다.

번호가 안에 들어있는 "span"으로 검색해봅니다.

lotto = html.find("div", class_ = "lottonum").find_all("span")

 

 

 

span 클래스만 가져와서 깔끔하게 리스트 형태로 정리해줍니다.

다만 리스트 클래스는 아니고 bs4.element.ResultSet 클래스이기 때문에 계속해서 해당 클래스가 가지고 있는 기능들을 사용할 수 있습니다. 

 

 

 

리스트 형태의 iterable 자료형이므로 for문을 통해 하나씩 가져와 작업해줄 수 있습니다.

리스트 안에 들어있는 저 내용들도 일반 str 문자열이 아닌 bs4의 클래스 객체 타입이기 때문에 text 기능을 사용할 수 있습니다.

lotto = html.find("div", class_ = "lottonum").find_all("span")


for i in lotto:
    print(i.text)

 

 

 

"i.text" 에서 나온 결과들은 str 문자열이므로 해당 문자열들을 배열에 집어넣으면서 로직 처리를 해 보너스와 같은 글자들을 제외하면 됩니다. 

 

 

 

 

하지만 위의 방법을 사용할 경우 로직이 복잡해지기 때문에 처음부터 정규표현식을 사용하면 매우 간단하게 번호만 추출할 수 있습니다.

 

먼저 find() 함수에서 "text"를 사용해 태그가 아닌 문자 부문만 문자열 형태로 받습니다.

lotto = html.find("div", class_ = "lottonum").text

 

 

 

로직을 짜려면 못짤것도 없지만 정규표현식을 이용해 간단히 걸러줍니다. 

숫자가 하나이상 있는 것만 매칭한다는 의미의 "\d+"를 사용해주면 숫자만 골라서 리스트에 넣어줍니다.

box = re.findall("\d+", lotto)

 

 

 

 

웹크롤링은 문자열들이 일정한 규칙을 가지지 않기 때문에 일일이 로직을 짜기 보다는 정규표현식을 사용해 간단히 걸러내는 것이 효율적일 것 같습니다.

 

 

 

 

 

 

728x90

댓글

💲 추천 글