본문 바로가기
프로젝트/수익형 웹 만들기

2021년 8월 21일 - Step 1 : 파이썬 이용해 웹 크롤링

by 철제백조 2021. 8. 21.

● 본 공부에 대한 기록은 유튜버 '조코딩 JoCodin' 님의 "완전 쉽게 파이썬으로 텍스트 및 이미지 크롤링하기 | 수익형 웹, 앱 만들기 1강"을 기본으로 하였습니다.

https://www.youtube.com/watch?v=ZTJjW7XuHIY&list=PLU9-uwewPMe2-vtJAgWB6SNhHcTjJDgEO 

 

 


 

크롤링 Crawling

 

특정 정보를 수집할 때 일일이 관련 정보를 검색, 수집할 경우 엄청난 시간이 소요된다.

크롤링이란, 인터넷에 있는 정보 중 우리가 원하는 것만 골라서 자동으로 수집해주는 기술.

크롤링의 기초만 다룰줄 알아도 실용적인 작업들과 서비스를 많이 구축해낼 수 있다.

 

크롤링 Crawling 파싱 Parsing 스크래핑 Scraping 스파이더링 Spidering

 

→ 정보를 가져오려는 사이트를 불러와 원하는 정보를 찾고, 그 정보를 가져오게 하는 코드를 작성한다.

크롤링 관련 라이브러리는 보통 어느 언어에나 존재

 


 

1. 파이썬 환경 설정

 

파이썬의 설치나 관련 라이브러리를 그대로 컴퓨터에 설치하게 되면 버전 간 충돌 문제 발생 가능성

따라서 보통 가상환경을 구성해서 그곳에 설치하는 과정을 거치게 된다.

 

구름 IDE

 

구름 IDE

 

클라우드 기반 통합 개발 환경(Integrated Development Environment, IDE) : 

통합 개발 환경코딩에 필요한 화면을 한곳에 몰아넣는 것

 

개발 환경이 갖춰진 가상의 컴퓨터를 제공해주는 것이라 별도의 언어설치가 필요하지 않다.

다른 작업을 할 때는, 가상 컴퓨터를 새롭게 만들어 작업하면 되므로 버전 간 충돌이 일어날 일도 없다.

 

 

◎ https://ide.goorm.io/

 

구름IDE - 설치가 필요없는 통합개발환경 서비스

구름IDE는 언제 어디서나 사용 가능한 클라우드 통합개발환경(Integrated Development Environment IDE)을 제공합니다. 웹브라우저만 있으면 코딩, 디버그, 컴파일, 배포 등 개발에 관련된 모든 작업을 클라

ide.goorm.io

 

 

◎ 회원가입 콘솔로가기 새 컨테이너 생성 소프트웨어 스택을 "Python"컨테이너 실행

 

 


 

Github 연동시, 따로 연동절차 필요

https://itlearning.tistory.com/entry/2-%EA%B5%AC%EB%A6%84IDE%EB%A1%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0-Github-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0

 

2. 구름IDE로 파이썬 환경 구축하기 + Github 연동하기

이번에는 내가 자주사용하는 온라인IDE인 '구름IDE'로 파이썬 환경을 구축하는 방법에 대해 소개하겠다. 서론따윈 없고 바로 본론으로 들어간다. **** 주의할 점 : 깃허브 연동까지 생각한다면, 이

itlearning.tistory.com

 

 

git push를 해도 전날로 컨트리부션이 설정될 경우, 아래의 명령어를 입력해 서버 시각 변경 가능

dpkg-reconfigure tzdata

 


 

컨테이너를 실행하면 "index.py" 파일에 아래와 같은 화면이 보일 것이다.

※ 만약 github와 연동해 파일이 없다면, 새로 만들어주도록 하자.

 

 

 

입력창 : "python 파일명.py" 입력 - python index.py → 출력

 


 

2. 위키피디아 예제 따라하기

 

Beautiful Soup

 

 

Beautiful SoupHTMLXML 구문을 분석하기 위한 파이썬 라이브러리이다.

 

 

◎ google  Beautiful Soup 검색 → 위키백과 → 예제 복사 실행

 

#!/usr/bin/env python3
# Anchor extraction from HTML document
from bs4 import BeautifulSoup
from urllib.request import urlopen
with urlopen('https://en.wikipedia.org/wiki/Main_Page') as response:
    soup = BeautifulSoup(response, 'html.parser')
    for anchor in soup.find_all('a'):
        print(anchor.get('href', '/'))

 

 

◎ index.py에 복사, 저장

 

→ 오류 발생 bs4 : beautifulsoup4 라는 모듈을 불러오지 못함 : beautiful Soup 4버전이 설치되지 않음

 

 

pip install bs4

 

 

파이썬 패키지 관리자(pip) 이용해 다운로드 : pip install (다운로드할 패키지명) 예제 다시 실행 

 

 

위에 두 줄은 라이브러리를 불러오는 코드 : bs4에서 BeautifulSoup 라이브러리를 불러옴.

response = urlopen(주소)

 

Shift + Tab = 집어넣기

 

 

작성된 URL에 실제로 들어가서 F12를 누르면 개발자 도구를 열면 HTML 코드를 볼 수 있다.

거기서 'a' 태그가 된 것들을 반복문을 돌며 수집한 결과이다.

 


 

3. ZUM 실검 크롤링 및 저장

 

 

 

ZUM 전체 사이트에서 실시간 검색어 부분만 골라 텍스트로 가져와야한다.

따라서 실검이 있는 텍스트 부분이 어떻게 생겼는지 특징을 파악하고 선택해서 가져오도록 해야 함.

 

 

◎ F12 → Ctrl + Shift + C를 이용해서 검색 순위 코드가 어떻게 생겼는지 규칙을 파악

 

규칙성이 포괄적인 것일 수 있으니, 점점 범위를 좁혀 그 부분만 선택될 수 있게 특징을 추려본다.

 

 

ZUM 실검의 경우, span 안에 "word"가 규칙성

→ 이 규칙성을 코드로 작성한다.

 

 

from bs4 import BeautifulSoup
from urllib.request import urlopen

response = urlopen('https://issue.zum.com/')
soup = BeautifulSoup(response, 'html.parser')
i=1
for anchor in soup.select("span.word"):
    print(str(i) + anchor.get_text())
    i = i + 1

 

 

1) URL - ZUM 주소 (https://issue.zum.com/)

2) 함수 규칙을 이용해 찾게 된다.

https://www.crummy.com/software/BeautifulSoup/bs4/doc/

 

Beautiful Soup Documentation — Beautiful Soup 4.9.0 documentation

Non-pretty printing If you just want a string, with no fancy formatting, you can call str() on a BeautifulSoup object (unicode() in Python 2), or on a Tag within it: str(soup) # ' I linked to example.com ' str(soup.a) # ' I linked to example.com ' The str(

www.crummy.com

 

 

beautiful soup 홈페이지에 들어가 함수를 검색할 수 있다.

주로 CSS selectors - . Select를 많이 사용한다.

글자만 출력할 경우, . get_text() 를 사용한다.

 

순위까지 출력할 경우, i에 관한 증감식을 추가, (str)문자와 숫자를 더할 수 없기 때문

 

 

soup.select("title")
# [<title>The Dormouse's story</title>]

soup.select("p:nth-of-type(3)")
# [<p class="story">...</p>]

 

◎ for anchor in soup.select("span.inner_text"):

span 태그 중에 inner_text 선택

→ 기존에 href는 span 태그에는 없기 때문에 지워준다.

 

 

◎ python write text file 구글링  

 

# writedata.py
f = open("C:/doit/새파일.txt", 'w')
for i in range(1, 11):
    data = "%d번째 줄입니다.\n" % i
    f.write(data)
f.close()

 

 

◎ 순위 - 줄바꿈 - 새 텍스트 파일로 입력

 

from bs4 import BeautifulSoup
from urllib.request import urlopen

response = urlopen('https://issue.zum.com/daily/20210815')
soup = BeautifulSoup(response, 'html.parser')
i=1
f = open("새파일.txt", 'w')
for anchor in soup.select("span.word"):
    data = (str(i) + "위: " + anchor.get_text() + "\n")
    i = i + 1
    f.write(data)
f.close()
    
f = open("C:/doit/새파일.txt", 'w')
for i in range(1, 11):
    data = "%d번째 줄입니다.\n" % i    
    f.write(data)
f.close()

 


 

4. 이미지 크롤링 라이브러리 사용하기

 

 

 

이미지 크롤링을 위해서는 특정 검색어로 검색한 URL을 가지고 나온 이미지들 중에서 

이미지 주소(src)들의 규칙을 찾고, 이런 이미지 주소들을 모아서

텍스트 파일을 저장했듯이, 이미지 파일을 저장하면 된다.

 

 

python google image search and download 구글링 → 라이브러리 탐색

https://pypi.org/project/google_images_download/

 

google_images_download

Python Script to download hundreds of images from 'Google Images'. It is a ready-to-run code!

pypi.org

 

아래의 코드를 복사 후 터미널에 붙여넣어 설치

 

pip install google_images_download

 

 

◎ 설치 → Examples and Code samples → Code Sample 복사

 

from google_images_download import google_images_download   #importing the library

response = google_images_download.googleimagesdownload()   #class instantiation

arguments = {"keywords":"Polar bears,baloons,Beaches","limit":20,"print_urls":True}   #creating list of arguments
paths = response.download(arguments)   #passing the arguments to the function
print(paths)   #printing absolute paths of the downloaded images

 

 

◎ 구름에서 마우스 우측 클릭 → 새 파일 → google.py → 복사한 코드 붙여넣기 → 실행

 

 

arguments = {"keywords":"Polar bears,baloons,Beaches","limit":20,"print_urls":True}

 

keywords : 원하는 검색어

limit : 각 키워드당 다운받을 이미지수

format : 다운받을 파일형식

 

keywords 에서 Polar bears, baloons, Beaches가 각각 폴더로 나뉘어 20 장씩 다운됨

 

 

◎ 오류 발생 시

Unfortunately all 20 could not be downloaded because some images were not downloadable. 0 is all we got for this search filter!

 

1. pip uninstall google_images_download

2. git clone https://github.com/Joeclinton1/google-images-download.git

3-1. sudo python setup.py install

3-2. pip install git+https://github.com/Joeclinton1/google-images-download.git

 

 

응용

keywordlimit 이미지 갯수만 변경하면 바로 사용이 가능

 

필자가 검색할 목록

 

 

목록에 나온 이름을 키워드에 입력해준다.

 

from google_images_download import google_images_download   

response = google_images_download.googleimagesdownload()  

arguments = {"keywords":"롤 티모,파크라이 바스,리틀 나이트메어 식스, 스타크래프트 제라툴, 언더테일 샌즈, 리듬닥터 이안, 다크소울 아르토리우스, 오버워치 디바, 젤다의 전설 링크, Ib 이브, 포탈2 휘틀리, 60Seconds 가족, 원신 페이몬, 가디언테일즈 공주, 어몽어스 크루원 임포스터, 오리와 눈먼숲 오리, 배트맨 시리즈 조커, 쿠키런 용감한 맛 쿠키, 스타듀밸리 주인공, 투더문 리버, 스탠리 패러블 스탠리, 문명 간디, 표류소녀 표류소녀, 헬테이커 주인공, 다키스트 던전 노상강도, 폴가이즈, 슈퍼마리오 마리오, 별의 커비 커비, 점프킹 점프킹, 이터널리턴 쇼이치, 모뉴먼트 벨리 아이다","limit":3,"print_urls":True}  
paths = response.download(arguments)  
print(paths)

 

 

https://google-images-download.readthedocs.io/en/latest/arguments.html

 

Input Arguments — Google Images Download documentation

Input Arguments Link to GitHub repo Link to Documentation Homepage Argument Short hand Description config_file cf You can pass the arguments inside a config file. This is an alternative to passing arguments on the command line directly. Please refer to the

google-images-download.readthedocs.io

 

Input Argumentsextension 검색 → format(지정한 확장자만 다운받는 옵션 : jpg)

 

 

format jpg를 추가한 코드는 아래와 같다.

 

from google_images_download import google_images_download   

response = google_images_download.googleimagesdownload()  

arguments = {"keywords":"롤 티모,파크라이 바스,리틀 나이트메어 식스, 스타크래프트 제라툴, 언더테일 샌즈, 리듬닥터 이안, 다크소울 아르토리우스, 오버워치 디바, 젤다의 전설 링크, Ib 이브, 포탈2 휘틀리, 60Seconds 가족, 원신 페이몬, 가디언테일즈 공주, 어몽어스 크루원 임포스터, 오리와 눈먼숲 오리, 배트맨 시리즈 조커, 쿠키런 용감한 맛 쿠키, 스타듀밸리 주인공, 투더문 리버, 스탠리 패러블 스탠리, 문명 간디, 표류소녀 표류소녀, 헬테이커 주인공, 다키스트 던전 노상강도, 폴가이즈, 슈퍼마리오 마리오, 별의 커비 커비, 점프킹 점프킹, 이터널리턴 쇼이치, 모뉴먼트 벨리 아이다","limit":10,"print_urls":True, "format" : "jpg"}  
paths = response.download(arguments)  
print(paths)

 

 

실행한다.

 

SyntaxError: invalid syntax : 해당 오류 발생시 문법을 체크해보도록 하자.

 

 

만약 오류로 다운로드가 안받아질 경우, 그 키워드만 따로 작성해 실행시키면 정상 작동한다.

 

 

저장

 

◎ downloads 파일 우클릭 → 파일 다운로드 → Zip

 

 


 

☆ 짧은 후기

 

 

 

 옛날부터 내게 기술과 능력이 있다면 꼭 게임 추천 어플을 만들어보고 싶다고 생각했는데 그게 실현돼 가는 거 같아 너무 두근거린다.

 웃기게 들릴 수도 있겠지만, 무엇보다도 이 창... 스스로 생각하기에 보잘것 없는 단계라고 생각함에도 이렇게 놓고보니 내가 뭔가 대단한 작업을 하고 있는 거 같다는 착각이 들었다.

 

 나도 안다. 착각이라는 거. 하지만 이런 착각들이 쌓이고 쌓여서 흥미가 붙는 거라 생각한다. 얼른 나만의 어플을 만들고 싶다는 생각이 가득하다. 이렇게 들뜬 기분인건 정말 오랜만인 거 같다.

 

 오늘 졸업도 했겠다, 힘내자!!!

 

 

 

댓글