최근에 퇴근하고 파이썬 크롤링을 공부하고 있다. 파이썬 크롤링과 관련된 라이브러리에는 BeautifulSoup과 셀레니움이 있는데, 가장 기초가 되는 건 BeautifulSoup이다. 그래서 보통 파이썬 크롤링 기초를 배운다고 하면 이 두 라이브러리를 활용하는 방법을 배운다.
두 라이브러리의 차이를 간략하게 적어보자면, BeautifulSoup는 웹 페이지의 html 코드를 분석하는 데에 필요한 라이브러리이고, 셀레니움은 javascript 등이 구현되어서 사용자의 동작에 따라 소스코드가 변하는 동적인 웹 페이지가 나타날 때를 대비하기 위한 도구이다. 그래서 엄밀히 말하면 웹 페이지의 정보를 긁어오는 건 BeautifulSoup이다.
BeautifulSoup을 활용할 때 계속해서 반복되는 코드의 기초 뼈대가 있는데, 오늘은 이걸 정리해 두려고 한다.
크게 library import, url 및 header 입력, html 가져오기 이렇게 3단계로 구성된다.
Library Import
가장 먼저 해야 할 건 requests와 BeautifulSoup를 import 하는 것. 기본이다. 만약 설치되어 있지 않다면 터미널에서 pip install을 통해서 설치하면 된다.
import requests
from bs4 import BeautifulSoup
# 만약 설치되어 있지 않다면
## pip install requests
## pip install bs4
URL 세팅, Header 세팅
그다음으로 해야 할 건 url 정보와 Header를 세팅하는 것이다. 다음 단계에서 requests를 통해 url에 요청을 보내게 되는데, 그때 어떤 url에, 어떤 header를 가지고 요청을 보낼 것인지 정하는 작업이다.
우선 너무 당연하지만 긁어오고 싶은 페이지의 url을 저장해두어야 한다.
url을 입력할 때, 하나의 페이지에서 모든 정보를 가져오는 경우도 있지만 (멜론 차트 등), 쿠팡이나 네이버 검색 결과 같이 검색 결과에 따라서 url을 바꿔주어야 할 수도 있다. 그럴 때는 공통된 부분만 저장하고, 나머지는 계속 변할 수 있도록 구성해 주면 된다.
1. url 세팅
보통 검색어를 쓰게 되면 '&q=' 형태의 쿼리 형태로 url이 마무리되는데, keyword를 더해서 진짜 url을 만들어 주면 된다.
# 정적인 웹 페이지인 경우
url = "https://news.daum.net"
# 검색 결과에 따라 url이 달라지는 경우
url = "https://www.coupang.com/np/search?component=&q="
keyword = input("검색 키워드 입력: ")
Real_url = url + keyword
※ 참고로 쿠팡 같은 곳에서 크롤링을 할 때, url 뒤쪽에 channel = user ~~ 이런 식으로 표기되는 부분이 있는데, 무시해도 된다.
2. Headers 세팅
Headers는 요청을 보낼 때 요청자의 정보 같은 것을 입력하는 것을 말한다.
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}
가장 기본이 되는 건 위처럼 컴퓨터가 아닌 'user'가 접속했다는 것을 전달하는 것이다. 가끔 컴퓨터의 접속을 막아두는 곳도 있는데, 그럴 때 user-agent를 사용하면 된다.
그런데 사실 user-agent를 사용하는 방식도 막을 수는 있기 때문에 .. 우선 위 코드가 그냥 기본이라고 생각을 하자.
참고로 user-agent 정보는 개발자도구(F12)에서 네트워크 - 메인페이지 선택 - 맨 아래 부분을 보면 확인할 수 있다. 위 그림에서 맨 아래쪽에 위치한 게 User-Agent 정보다.
한편 일부 사이트에서는 위의 headers 정보만으로는 크롤링에 실패하는 경우가 종종 있는데, 다양한 해결 방법이 있지만 우선 headers를 아래 코드로 수정해서 시도해 보자.
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
"accept-language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7"
}
특별할 건 없고 accept-language 정보를 추가한 것이다.
HTML 가져오기 (Request 요청)
드디어 마지막 단계, html을 가져오면 된다.
req = requests.get(search_url, headers = headers)
html = req.text
soup = BeautifulSoup(html, "html.parser")
가장 기본이 되는 요청 구문은 위와 같다.
우선 requests.get을 통해서 해당 url에 get 요청을 보내고, 거기서 text를 추출한 다음, html로 parsing 하는 작업을 거친다. 잘 모르는 사람이라면 무슨 말인지가 이해하기 어려울 텐데, 쉽게 말하면 html 소스 코드를 긁어와서 html 코드 형식대로 분해하고 조립하는 과정이라고 생각하면 된다.
그러면 soup 변수에는 html 코드가 list 형태로 나타나게 되고, 우리는 여기에서 원하는 html 태그나 class 이름을 select 해서 사용하면 된다. 태그나 class를 선택하는 방법은 여러 가지가 있는데, 우선은 여기까지만.
또, 쿠팡 같은 사이트에서는 웹 크롤링을 할 때 위의 요청만으로는 부족할 수 있다.
이는 쿠팡에서 쿠키 정보를 필요로 하기 때문이다.
cookie = {"a":"b"}
req = requests.get(search_url, headers = headers, cookies = cookie)
html = req.text
soup = BeautifulSoup(html, "html.parser")
위처럼 어설픈 쿠키 형식을 이용해서 대충 넣어주면 된다.
코드 정리
지금까지 이야기한 코드들을 한 번에 정리하면 아래와 같다.
1. 기본 코드
import requests
from bs4 import BeautifulSoup
url = "http://www.YOUR_URL_HERE"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}
req = requests.get(url, headers = headers)
html = req.text
soup = BeautifulSoup(html, "html.parser")
2. 쿼리(검색어) 입력 형태
import requests
from bs4 import BeautifulSoup
url = "https://www.coupang.com/np/search?component=&q="
keyword = input("url 추가 키워드: ")
search_url = url + keyword
# 쿠키 정보
cookie = {"a":"b"}
# 쿠키 정보, accept-language 추가
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
"accept-language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7"
}
req = requests.get(search_url, headers = headers, cookies = cookie)
html = req.text
soup = BeautifulSoup(html, "html.parser")
다음에는 select, find, text, strip 등을 정리할 예정이다!
'Python 스크래핑' 카테고리의 다른 글
파이썬 크롤링 BeautifulSoup 정리 (2) - select, selet_one (0) | 2023.06.26 |
---|