본문 바로가기

공부하는 날

[학습노트][인프런] 데이터과학과 IT영역에서의 파이썬과 크롤링 큰 그림 이해하기 (2)


※ 학습 노트

학습 날짜

 2020년 1월  

학습 사이트 

 인프런

과정 제목

 파이썬입문과 크롤링기초 부트캠프 (2020 업데이트) [쉽게! 견고한 자료까지!] 

학습 시간

 72강/941분

의견

 - 크롤링이 뜻대로 되지 않는 부분에 대한 팁을 얻기 위해 등록한 과정이기 때문에 

   스파르타 코딩 클럽에서 배운 것과 겹치는 부분은 스킵하고 필요한 부분부터 우선적으로 듣기로 함

 - 개념적인 것을 엄청 자세하게 설명해서 초보자(나)에게 좋음. 기존에 배운 것 복습 + 빈 곳을 채우는 느낌

 - 10~20분 단위로 micro하게 구성

 학습 모듈

 크롤링과 웹 기본 - 실전부분 




크롤링과 웹 기본__패턴으로 실습하며 익히기: HTML/CSS 이해를 바탕으로 크롤링하기

* 크롤링 패턴 코드

import requests
from bs4 import BeautifulSoup

res = requests.get('https://news.v.daum.net/v/20170615203441266')
soup = BeautifulSoup(res.content, 'html.parser')

mydata = soup.find_all('span','txt_info')
for item in mydata:
print (item.get_text())


*meta tag는 검색 엔진에 해당 페이지를 잘 검색할 수 있도록 쓰이는 경우가 많음

*해당 tag가 html 내에서 여러 군데 사용되고 있는 경우 class를 활용

*크롤링을 하고 싶은 부분이 class를 여러 개 사용 있는 경우,  class를 띄어쓰기 포함 그대로 사용

*mydata.get_text 또는 mydata.string 사용



크롤링과 웹 기본__패턴으로 실습하며 익히기: 실전 크롤링과 강력한 크롤링 기술 팁 

* 오픈 크롬 개발자 모드를 오픈 

   : 윈도우 Ctrl + Shift + i 또는 F12

* 원하는 영역 오른쪽 클릭한 후 copy > Copy outer html 복사 가능

* find()로 더 크게 감싸는 html 태그로 추출 후, 추출된 데이터에서 find_all()로 원하는 부분을 추출

* 문자 전처리할 때: strip(), split() 함수 사용

* 리스트에 숫자 붙일 때

for index, title in enumerate(titles):
print(str(index+1)+'.', title.get_text().split()[0].string())



크롤링과 웹 기본__CSS selector 사용해서 크롤링하기

* select()안에 태그 또는 CSS class 이름 등을 넣으면 결과값은 리스트 형태로 반환됨

* 하위 태그는 스페이스로 구분

* 모든 단계의 태그를 다 적을 필요는 없지만, 바로 밑의 태그에 해당하는 부분을 추출하고 싶을 때는 ul > a  식으로 > 사용

* class 이름을 사용하고 싶을 때에는 .사용, class 여러 개일때도 .사용하여 이어줌  

  id 는 # 사용 

* find()/select()로 가져온 객체는 find()/select() 모두 교차 사용 가능



바로 실전 크롤링해보기: 네이버 쇼핑 사이트 크롤링하기

#네이버쇼핑 best100 인기검색어

import requests
from bs4 import BeautifulSoup

res = requests.get('https://search.shopping.naver.com/best100v2/main.nhn')
soup = BeautifulSoup(res.content, 'html.parser')

items = soup.select('#popular_srch_lst > li > span.txt > a')
for item in items:
print(item.get_text())


#네이버쇼핑 특정 카테고리 상품 제목 

import requests
from bs4 import BeautifulSoup

res = requests.get('https://search.shopping.naver.com/search/all?frm=NVBT100&origQuery=%EB%8B%A4%EC%9D%B4%EC%96%B4%EB%A6%AC&pagingIndex=2&pagingSize=40&productSet
=total&query=%EB%8B%A4%EC%9D%B4%EC%96%B4%EB%A6%AC&sort=rel&timestamp=&viewType=thumb')
soup = BeautifulSoup(res.content, 'html.parser')

items = soup.select('div.imgList_title__3yJlT > a')

for item in items: print(item.get_text()) 


#네이버증권 인기검색종목

import requests
from bs4 import BeautifulSoup

res = requests.get('https://finance.naver.com/sise/')
soup = BeautifulSoup(res.content, 'html.parser')

items = soup.select('#popularItemList > li > a')
for item in items:
print(item.get_text())



또다른 크롤링 기술, urllib 라이브러리 사용법 이해

* 기존에는 urllib+bs4 세트로 많이 사용하였는데, 최근에는 requests + bs4 세트를 많이 사용

  기존 코드 중 일부가 urllib 사용하는 경우가 있으며 인코딩 처리가 다름

* requests 라이버리를 사용해서 크롤링 진행하고, 문제가 있는 경우만 urllib 시도

from urllib.request import urlopen #urllib request class에 들어있는 urlopen 함수만 필요
from bs4 import BeautifulSoup

res = urlopen('https://davelee-fun.github.io/')
soup = BeautifulSoup(res, 'html.parser')

items = soup.select('h4.card-text')
for item in items:
print(item.get_text().strip())



여러 페이지 한번에 크롤링하는 기법

* 주소에있는 페이지 번호를 활용하여 for 구문 사용

import requests
from bs4 import BeautifulSoup

for page_num in range(10):
if page_num == 0:
res = requests.get('https://davelee-fun.github.io/')
else:
res = requests.get('https://davelee-fun.github.io/page' + str(page_num + 1))
soup = BeautifulSoup(res.content, 'html.parser')

data = soup.select('h4.card-text')
for item in data:
print(item.get_text().strip())



크롤링해서 엑셀 파일로 데이터 저장하기

* openpyxl 라이브러리 활용

* 함수 설정

import openpyxl

def write_excel_template(filename,sheetname,listdata):
excel_file = openpyxl.Workbook() #엑셀 파일 오픈
excel_sheet = excel_file.active #엑셀 시트 선택

if sheetname !='': #시트이름이 없으면 넘어가기
excel_sheet.tile = sheetname

for item in listdata:
excel_sheet.append(item)
excel_file.save(filename)
excel_file.close()


* 크롤링해서 저장하기

import requests
from bs4 import BeautifulSoup

product_lists = list()

for page_num in range(10):
if page_num == 0:
res = requests.get('https://davelee-fun.github.io/')
else:
res = requests.get('https://davelee-fun.github.io/page'+str(page_num+1))
soup = BeautifulSoup(res.content,'html.parser')

data=soup.select('div.card')
for item in data:
product_name = item.select_one('div.card-body h4.card-text')
product_date = item.select_one('div.wrapfooter span.post-date')
product_info = [product_name.get_text().strip(),product_date.get_text()]
product_lists.append(product_info)

write_excel_template('tmp.xlsx','상품정보',product_lists)


* 엑셀파일 불러오기

for item in excel_sheet.rows:
print (item[0].value, item[1].value) #셀에 들어있는 값을 가져오기 위해 .value를 붙여줌


excel_file.close()




반응형