웹 크롤링을 하기위해서는 먼저 beautifulsoup4을 설치해야한다.
BeautifulSoup
은 html 코드를 Python이 이해하는 객체 구조로 변환하는 Parsing을 맡고 있고, 이 라이브러리를 이용해 우리는 제대로 된 '의미있는' 정보를 추출해 낼 수 있다.
새로운 가상환경을 만든 다음 그 곳에서 beautifulsoup4과 requests를 설치 (파이썬 requests 모듈은 간편한 HTTP 요청처리를 위해 사용하는 모듈)
pip install beautifulsoup4
pip install requests
새로 만든 디렉토리 crawling
에서 crawling.py
라는 파일을 연다.
@ crawling.py
from bs4 import BeautifulSoup
import requests
이렇게 임포트 해주고, 이제 본격적으로 웹크롤링을 해보자.
나는 "보그코리아"라는 곳에서 웹 크롤링을 해볼 것이다.
http://www.vogue.co.kr/category/fashion/page/2/
여기 주소에 들어가서 개발자도구를 열고, elements
에 들어가서 원하는 부분의 태그를 찾는다.
@ crawling.py
from bs4 import BeautifulSoup
import requests
crawling_url = "http://www.vogue.co.kr/category/fashion/page/2"
# HTTP GET Resquest
response = requests.get(crawling_url)
## BeautifulSoup으로 html소스를 python객체로 변환하기
## 첫 인자는 html소스코드, 두 번째 인자는 어떤 parser를 이용할지 명시.
bs = BeautifulSoup(response.text,'html.parser')
위의 코드는 url을 crawling_url
라는 변수에 담고 을 response 변수에 담아준다.
여기서 잠깐, parser
가 뭐지❓
다시 돌아가서, 그럼 html.parser
은 HTML 문법 규칙에 따른 문자열을, 해당 문법을 바탕으로 단어의 의미나 구조를 분석하는 것인데 파이썬 기본으로 내장되어 있기때문에 이를 사용하면 된다.
이 함수를 사용하면 원하는 부분을 뜯어낼 수 있다.
@ crawling.py
from bs4 import BeautifulSoup
import requests
crawling_url = "http://www.vogue.co.kr/category/fashion/page/2"
# HTTP GET Resquest
response = requests.get(crawling_url)
## BeautifulSoup으로 html소스를 python객체로 변환하기
## 첫 인자는 html소스코드, 두 번째 인자는 어떤 parser를 이용할지 명시.
bs = BeautifulSoup(response.text,'html.parser')
## 'article'과 'id'에 'post-'로 되어있는 것을 모두 가져오기
article_list = bs.find_all('article',{'id':re.compile('post-*')})
for article in article_list:
h2_title = article.find_all('h2')
real_title = h2_title[0].text
img = article.find('img')
image_url = img['src']
또 이 중에서 제목만 가져오려면 아래 코드를 작성하면 된다.
그리고
print("h2_title=",end=""),print(h2_title)
이렇게 하면 아래처럼 결과가 나온다.
real_title = h1_title[0].text
real h2=랄프 로렌의 ‘지구를 지켜라!’
real h2=영원한 클래식, 샤넬 재킷
real h2=세계가 주목하는 디자이너 #황록
real h2=SOFT STEP
real h2=발렌시아가의 디렉터 뎀나 바잘리아가 찾은 안식처
real h2=SNS가 탄생시킨 패션 스타 토모 코이즈미의 네버랜드
real h2=디자이너 스테파노 필라티의 방황
real h2=In The Bag CHANEL 19
real h2=깔끔한 스틸 시계 뭐 사지?
real h2=주얼리가 머무는 자리
real h2=지구상에서 가장 핫한 슈퍼모델, 벨라 하디드
real h2=Night
또, 이미지를 가져오고 싶으면
img = article.find('img')
image_url = img['src']
이렇게 article내에 img를 찾아내고 img의 'src' 부분만 image_url
이라는 변수에 담아준다.
CSV 파일을 읽기 위해서는 먼저 파이썬에 기본 내장된 csv 모듈을 import 한다.
CSV 파일을 쓰기 위해서는 .csv 파일을 쓰기모드로 오픈하고 파일객체를 csv.writer(파일객체) 에 넣으면 된다. CSV writer는 writerow() 라는 메서드를 통해 list 데이터를 한 라인 추가하게 된다.
import csv
csv_filename = "vogue_fashion.csv" ## 파일이름 변수에 담아준다.
csv_open = open(csv_filename, "w+", encoding='utf-8') ##
csv_writer = csv.writer(csv_open)
csv_writer.writerow(('title','image_url'))
.
.
.
for article in article_list:
h2_title = article.find_all('h2')
real_title = h2_title[0].text
img = article.find('img')
image_url = img['src']
csv_writer.writerow( (real_title, image_url) )
# 마지막에 이렇게 close()를 해줌
csv_open.close()
여기서 가장 중요한 것은 csv파일에 저장할때 csv_writer.writerow()
을 꼭 for문 안에 넣어줘야 저 데이터들이 csv파일 안에 잘 넣어질 수 있다.