동적 크롤링 정적 크롤링 - dongjeog keulolling jeongjeog keulolling

안녕하세요!

전국의 카페 정보(카페 이미지, 카페 이름, 카페 주소, 카페 메뉴 등)를

얻기 위해서 크롤링을 하다가 정적 크롤링으로 데이터 수집을 시도했습니다.

데이터를 수집하는데 한계를 느껴 셀레니움을 통한 동적 크롤링을 사용했습니다.

이번 시간에는 bs4를 이용한 정적 크롤링을 실습해보도록 하겠습니다.

우선 정적 크롤링이 무엇인지 알아야겠죠?

개발 환경
Language: python 3.9.4
IDE: PyCharm community
Library: bs4 (BeatifulSoup)

라이브러리를 먼저 설치하겠습니다.

pip install bs4

https://jaaamj.tistory.com/101

크롤링 종류(정적 VS 동적)

크롤링이란? 크롤링(crawling) 또는 스크레이핑(scraping) 은 웹 페이지를 가져와서 데이터를 추출해 내는 방법을 말합니다. 이렇게 크롤링하는 소프트웨어를 크롤러(crawler) 라고 합니다. 크롤링

jaaamj.tistory.com

동적 크롤링 정적 크롤링 - dongjeog keulolling jeongjeog keulolling

jaaamj님 블로그에서 정적, 동적 크롤링을 잘 설명해주셔서 간단하게 알아보겠습니다.

크롤링 정적 크롤링 동적 크롤링
수집 능력 주소를 통한 단발적 접근 브라우저를 사용한 연속적 접근
속도 빠름 느림
라이브러리 requests, beautifulsoup selenium, chromedriver
크롤링을 하기 전에 확인해야 할 것(robots.txt)
동적 크롤링 정적 크롤링 - dongjeog keulolling jeongjeog keulolling
robots.txt

robots.txt는 크롤링 봇이 웹 사이트를 탐색할 때 접근 범위를 제한하기 위해 사용됩니다.
다수의 크롤링 봇이 웹 사이트를 탐색하게 되면 크롤링 봇이 사이트에 과도한 트래픽을 발생시켜
일반적인 다른 사용자가 정상적으로 서비스를 이용하지 못합니다.
따라서 robots.txt 에서 크롤링에 대한 정보를 확인한 후 크롤링 여부를 확인해주시면 됩니다.
크롤링하고자 하는 홈페이지 URL 뒤에 /robots.txt 를 추가하여 검색하면 위와 같은 화면이 보입니다.
User-agent: * 는 모든 크롤링 봇을 의미합니다.
Disallow로 표시 되어 있는 부분이 크롤링 범위에 제한을 두는 곳이고 탐색하지 말라는 뜻입니다.

동적 크롤링 정적 크롤링 - dongjeog keulolling jeongjeog keulolling
Menupan

정적 크롤링은 내가 찾고자 하는 데이터가 한 화면에 다 표시될 때 사용하면 좋습니다.

한 페이지 안에서 데이터를 가져오기 때문에 속도가 빠르다는 장점이 있습니다.

처음에는 카페 이미지와 카페 이름을 수집하기 위해 bs4를 이용한 정적 크롤링을 이용했지만

요구사항이 바뀌어서 더 많은 정보를 수집하기 위해 셀레니움을 이용하게 되었습니다.

크롤링을 하기 위해 크롤링할 데이터의 태그 및 속성을 확인해야 합니다.

크롬 브라우저에서 ctrl + shift + c 를 누르게 되면 요소를 쉽게 선택할 수 있습니다.

크롬 브라우저가 아니시라면 F12 키를 눌러 개발자 도구를 열어서 요소를 탐색해주시면 됩니다.

동적 크롤링 정적 크롤링 - dongjeog keulolling jeongjeog keulolling
크롬 브라우저에서 ctrl + shift + c 를 누르게 되면 개발자 도구에서 element 요소 부분이 선택됨 

위의 사이트에서 카페 이미지와 카페 이름을 수집하기 위해 코드를 작성합니다.

from bs4 import BeautifulSoup as bs
from urllib.request import urlopen

queryUrl = input('검색어 입력: ')
crawl_num = int(input('크롤링할 페이지 수 입력: '))
cafe_name = []
# crawl_num으로 설정한 페이지 수 만큼 크롤링
for i in range(1,crawl_num):
	# 검색어 입력 값과 페이지 값을 입력받아 처리해주기 위한 url
    url = 'http://www.menupan.com/search/restaurant/restaurant_result.asp?sc=basicdata&kw=' + queryUrl + '&page=' + str(i)
    html = urlopen(url)
    # bs4를 이용한 파싱
    soup = bs(html, "html.parser")
    
    # image, name 정보를 수집하기 위한 soup 메서드
    img = soup.find_all(class_='thumb')
    img_text = soup.find_all('dt')
	
    # name 정보 list에 저장
    for i in img_text:
        cafe_name.append(i.text)
    
    # name 정보의 공백 문자열 제거
    word_slice = "\n\n"
    for i, word in enumerate(cafe_name):
        if word_slice in word:
            cafe_name[i] = word.strip(word_slice)
            
    n = 1
    # image를 수집하기 위한 original_url 설정
    originalUrl = 'https://www.menupan.com/'
    for i in img:
    	# 태그의 src 속성 추출
        imgUrl = i['src']
        
        # image 주소
        url = originalUrl + imgUrl
        
        # images 폴더에 .jpg 확장자로 카페 이미지 저장
        with urlopen(url) as f:
            with open('./images/' + cafe_name[n-1] + '.jpg', 'wb') as h:
            	img = f.read()
                h.write(img)
        
        n += 1
        if n > crawl_num:
            break
     print('크롤링 종료')

위 코드를 보시면 url을 설정하여 페이지를 탐색하고 beutifulsoup를 이용해서 특정 요소를 선택해서

데이터를 수집하는 모습입니다.

중간에 수집한 데이터의 공백 문자를 지워주기 위해 strip을 이용하여 공백을 제거해주고

마지막으로 요소의 속성을 받아와서 이미지 주소를 처리해주었습니다.

이렇게 되면 카페 이미지를 저장할 때 이미지의 이름이 카페 이름으로 설정되어 저장되게 됩니다.

동적 크롤링 정적 크롤링 - dongjeog keulolling jeongjeog keulolling

크롤링된 이미지가 저장된 것을 확인해볼 수 있습니다.

사실 정적 크롤링을 사용하다 보니 정말 제한적이라는 생각이 들어 동적 크롤링으로 데이터를 수집하는 것을

포스팅하도록 하겠습니다.

이번 시간에는 정적 크롤링에 대해서 실습을 진행했습니다.

고생하셨습니다!

동적 크롤링

https://eveningdev.tistory.com/50

[python] selenium, chromedriver를 이용한 동적 크롤링으로 카페 정보 수집 실습하기

안녕하세요! 이전 포스팅에서 bs4를 이용한 정적 크롤링을 포스팅했습니다. 하지만 데이터 수집을 하면서 느낀 점은 다양한 데이터를 수집하는데 한계가 있고 페이지가 동작하여 동적으로 여러

eveningdev.tistory.com

동적 크롤링 정적 크롤링 - dongjeog keulolling jeongjeog keulolling