웹 크롤링에서 가장 많이 사용하는 라이브러리를 두 번의 포스팅에 걸쳐 설명하고자 합니다.
1탄은 Requests 와 BeautifulSoup 의 조합 (부제. 특정 사이트 url에서 html 정보 추출)
2탄은 Selenium 과 BeautifulSoup 의 조합 (부제. 자동으로 클릭 접속하여 html 정보 추출)
Requests 와 BeautifulSoup 의 조합
(부제. 특정 사이트 url에서 html 정보 추출)
이제 여름도 다가오는 데 네이버 쇼핑에서 잘 팔리는 선풍기 순으로 정보 좀 모아볼까?
하면 아래와 같이 네이버 쇼핑 홈페이지에서 선풍기 키워드로 검색된 특정 url로 들어가 html 정보를 추출하면 된다.
Requests 와 BeautifulSoup 의 조합의 포인트는 고정된 url 에서 웹 크롤링을 수행한다는 것이다.
Requests 와 BeautifulSoup 의 기능
- Requests: http 요청을 보다 간단하고 인간 친화적으로 만들기 위함.
- BeautifulSoup: html과 xml 문서를 parsing하기 위한 패키지로 html에서 데이터를 추출하는 데 유용한 구문 분석 트리를 생성함.
각 모듈에서 자주 사용되는 함수
import requests
from bs4 import BeautifulSoup
search_word = '선풍기'
#사용할 고정 url을 선언한다.
url = f'https://msearch.shopping.naver.com/search/all?query={search_word}'
#---------------------- Requests으로 사용 친화적인 url 생성 ------------------------#
#Requests_requests.get()함수를 사용하여 해당 url을 사용 친화적으로 만든다.
req = requests.get(url)
#Requests_text 함수를 이용하여 현재 접속된 url 정보를 html로 BeautifulSoup에 넘김
html = req.text
#----------------------- BeautifulSoup으로 html 정보 분석 ------------------------#
#BeautifulSoup()함수를 사용하여 html을 parsing 한다.
#이러면, 해당 웹사이트에서 F12을 눌러 html을 열람한 후, 원하는 기능을 수행하면 된다.
soup = BeautifulSoup(html, 'html.parser')
그러면 2가지 예시를 통해 원하는 웹 크롤링을 수행해보자
예시 1. 네이버 쇼핑에서 검색하여 나온 '선풍기' 판매 사이트 불러오기
아래의 방식을 순서대로 따라해보자.
1) 정보를 불러오고 싶은 사이트에 접속한다.
2) 'F12' 키를 눌러 아래 사진처럼 오른쪽에 HTML 정보를 연다.
3) HTML 정보의 왼쪽 최상단에 있는 '네모칸 속 화살표' 아이콘을 클릭하여 해당 사이트로 마우스를 갖다 대본다.
4) 그럼 특정 위치에 따른 HTML 정보가 무엇인지 형광펜 처리가 되어 보여진다.
여기까지는 HTML 정보를 보는 기본 방법이었고 이제 내가 원하는 정보인 '선풍기 판매 사이트' 정보를 어떻게 불러올 수 있는 지 알아보겠다.
이건 아래 액자와 같은 원리라고 보면 된다.
내가 원하는 '선풍기 판매 사이트'는 선풍기 상품 리스트 > 한일전기 EBFL-214RTDC 상품 > 상품 메인 정보 > a 에 담겨 있다.
선풍기 상품 리스트 안에
한일전기 EBFL-214RTDC 상품 안에
상품 메인 정보 안에
a에 상품 사이트가 담겨 있다.
여기서 주목해야 할 부분은 각 이미지의 말풍선 안의 내용이다.
(보라색 글씨 뒤에 '.'이 붙으면 class 형식이고 '#'이 붙으면 id 이다.)
상품 사이트를 추출하기 위해 캡쳐된 말풍선의 내용을 하나씩 짚으며 코드를 짜야 한다.
import requests
from bs4 import BeautifulSoup
search_word = '선풍기'
#사용할 고정 url을 선언한다.
url = f'https://msearch.shopping.naver.com/search/all?query={search_word}'
#requests.get()함수를 사용하여 해당 url을 사용 친화적으로 만든다.
req = requests.get(url)
#Requests_text 함수를 이용하여 현재 접속된 url 정보를 html로 BeautifulSoup에 넘김
html = req.text
#BeautifulSoup()함수를 사용하여 html을 parsing 한다.
#이러면, 해당 웹사이트에서 F12을 눌러 html을 열람한 후, 원하는 기능을 수행하면 된다.
soup = BeautifulSoup(html, 'html.parser')
#선풍기 상품 리스트는 select_one() 함수로 추출한다.
search_result = soup.select_one('ul.products_list_inner_10T6Z')
#위의 이미지대로 차례차례 내려간다.
shop_list = search_result.select('li.product_list_item__2tuKA > div.product_info_main__1RU2S > a')
links = []
for shop in shop_list[:5]:
link = shop['href'] # a에서 웹사이트 url 정보를 추출해준다.
links.append(link)
print(links) # 네이버 쇼핑 선풍기 페이지에 있는 5개의 선풍기 웹사이트 정보를 출력해준다.
예시2. 보배드림 검색에서 '쏘렌토' 와 관련된 글 불러오기
해당 커뮤니티 글이 주르륵 조회된다.
위에서 한번 했으니 이번엔 한번에 진행하겠다.
아래 그림에서 파란색 화살표로 표시하였다. 헷갈린다 싶으면 위에서 말한 '네모창의 화살표'를 클릭 후 코드나 웹사이트를 짚어보면 된다.
import requests
from bs4 import BeautifulSoup
search_word = '쏘렌토'
#사용할 고정 url을 선언한다.
url = f'https://search.naver.com/search.naver?page=2&where=web&st=d&sm=mtb_jum&query={search_word}%20site%3Awww.bobaedream.co.kr'
#requests.get()함수를 사용하여 해당 url을 사용 친화적으로 만든다.
req = requests.get(url)
#Requests_text 함수를 이용하여 현재 접속된 url 정보를 html로 BeautifulSoup에 넘김
html = req.text
#BeautifulSoup()함수를 사용하여 html을 parsing 한다.
#이러면, 해당 웹사이트에서 F12을 눌러 html을 열람한 후, 원하는 기능을 수행하면 된다.
soup = BeautifulSoup(html, 'html.parser')
#선풍기 상품 리스트는 select_one() 함수로 추출한다.
search_result = soup.select_one('ul.lst_total')
#위의 이미지대로 차례차례 내려간다.
commu_list = search_result.select('li.bx > div.total_wrap > div.total_tit_group > div.total_tit > a')
links = []
for commu in commu_list[:5]:
link = commu['href'] # a에서 웹사이트 url 정보를 추출해준다.
links.append(link)
print(links) # 보배드림 검색 페이지에 있는 5개의 커뮤니티 글을 출력해준다.
그럼 다음 포스팅에서는 Selenium 과 BeautifulSoup 의 조합에 대해 알아보도록 하겠습니다 :)
2021.05.22 - [SW programming/Python] - [Python 웹 크롤링] Selenium 과 BeautifulSoup의 조합
'SW programming > Python' 카테고리의 다른 글
[Python Anywhere] Selenium 모듈 적용하는 법 (0) | 2021.05.27 |
---|---|
[Python 웹 크롤링] Selenium 과 BeautifulSoup의 조합 (2) | 2021.05.22 |
[Python anywhere 소개] 텔레그램봇 파일 서버에 올려 실행하기 (1) | 2021.05.19 |
[Python anywhere 소개] 어디서든 코드 실행이 가능한 서버 구축 (0) | 2021.05.17 |
[Python 디버깅] ImportError: No module named < > (0) | 2021.05.16 |
댓글