Requests 라이브러리
- Requests 라이브러리는 페이지에 정보를 요청할 때 사용한다.
import requests as rep 로 임 폴트 하고 앞으로 rep로 줄여서 사용할 거다.
req.get('주소') : 를 사용해서 페이지를 받아온다.
res = req.get('주소')로 받아온 페이지를 변수에 담아주고
res.text를 하면 요청한 페이지의 정보를 볼 수 있다.
import requests as req
# 네이버 페이지를 요청
res = req.get("https://www.naver.com/")
# req.get("https://www.naver.com/")의 결과 창이
# <Response [200]>,<Response [406]>로 뜨는데 아래와 같은 뜻이다.
# <Response [200]> : 페이지를 잘 받아왔다는 사인
# <Response [406]> : 응답을 할 수 없습니다.
# 요청한 페이지의 정보를 보기
res.text
<Response [406]>가 뜰 때 해결 방법
위의 방법에서 <Response [406]>가 뜬다면, 웹 사이트에서 컴퓨터가 정보를 가져간다고 인식해서 막아놓은 거다.
그러면 우리가 컴퓨터가 아니라 사용자라고 인식시켜줘야 한다.
멜론 사이트를 이용하여 예시를 들겠다.
멜론 사이트에 들어가서 F12를 누르고 Network를 누른 후 F5를 눌러보자.
그러면 아래와 창이 아래와 같아진다.
그러면 melon.com을 검색해보자.
index.htm을 누르고 headers에서 스크롤을 맨 아래로 내려서 user-Agent부분을 전체 복사해보자.
그리고 h = {"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Mobile Safari/537.36"} 이런 식으로 붙여 넣고
res = req.get("주소", headers = h)을 하면 이제 <Response [406]>가 아닌 <Response [200]>이 뜰 거다.
만약 아직도 <Response [406]>가 뜬다면 지금 배우는 방법으로는 페이지를 가져올 수 없다.
# <Response [406]> : 응답을 할 수 없습니다.
res = req.get("https://www.melon.com/")
# 컴퓨터가 아니고 사람으로 속이는 작업
h = {"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Mobile Safari/537.36"}
res = req.get("https://www.melon.com/", headers = h)
res.text
Beautifulsoup 라이브러리
- 가져온 데이터에서 내가 필요한 정보들만 추출해주는 라이브러리
from bs4 import BeautifulSoup as bs 로 임폴트 해줄 건데 앞으로 BeautifulSoup를 bs로 줄여 쓸 거다.
위의 Requests 라이브러리로 가져온 데이터 res.text를 가져와서
데이터를 'lxml'로 처리해준다. --> bs( res.text, 'lxml' )
find_all()로 원하는 데이터만 골라온다.
이때. text를 써야 진짜 우리가 원하는 글자만 예쁘게 가져올 수 있다.
from bs4 import BeautifulSoup as bs
# bs (어떤 데이터를 처리할건지, 어떻게 처리 = lxml)
soup = bs(res.text, 'lxml')
# 내가 가지고온 데이터에서 A태그중에 클래스명 nav만 가지고 와줘!
result = soup.find_all('a', class_ = "nav")
result[2]
# 가지고 온 데이터에서 순수하게 글자만 추출할때는 .text를 활용
result[2].text
# 리스트의 전체 데이터 조회
for i in result:
print(i.text)
이제 멜론 TOP100 수집해서 csv파일로 저장하는 예제를 풀어보자.
1. TOP100 자료 수집
위에서 배운데로 bs까지 해보자.
import requests as req
from bs4 import BeautifulSoup as bs
# req를 통해서 멜론싸이트 TOP 100페이지의 정보를 가져오기
res = req.get('https://www.melon.com/chart/index.htm')
h={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"}
res = req.get("https://www.melon.com/chart/index.htm", headers = h)
soup = bs(res.text, 'lxml')
그러면 이제 'TOP 100 가수'를 가져올거다.
멜론 차트 사이트에 들어가서 가수이름에 검사를 해보자.
보시면 <div class = "div.ellipsis.rank02"> 안에 a태그가 있고 a태그 내용이 가수이름인게 보일거다.
다음과 같이 하면 TOP100의 가수의 이름들을 가져올 수 있다.
# TOP 100 가수를 가지고오기
# > : 자식선택자
singer = soup.select("div.ellipsis.rank02 > a")
여기서 문제가 생기는데
가수이름의 길이를 구해보니 108개가 나온다. 우리는 100개를 구해야되는데 108개가 나온이유는
하나의 노래인데 가수가 2명이상인 노래가 있어서 그렇다. (방탄소년단 같이 그룹일경우에는 그룹명이라 상관없지만 듀엣같은 경우 문제가 생김) 그러면 다시 데이터를 구해오자.
위 사진을 보면 span안에 a태그 두개로 가수이름이 들어있는게 보일거다.
그럼 이제 우리는 아까 div.ellipsis.rank02 > a했던거 말고 span으로 데이터를 가져와 보자.
# 가수를 100개만 가져와야되는데 singer가 108개가 가져와졌다.
# 같은 노래인데 같이부른 가수가 여러명일 경우 각각의 a태그를 가지고 있기때문이다.
# 따라서 a태그 밑에 보면 span태그가 있는데 얘로 가져와야한다.
testSinger = soup.select('span.checkEllipsis')
len(testSinger)
그럼이제 같은 방법으로 노래100개를 가져와보자.
# 노래 100곡을 추출
# 아래에서 a에는 개행이 없고 span에는 있는 이유는 span태그안에 a태그들이 들어있기 때문에
# 더 상위 태그인 span태그가 하위태그인 a태그의 내용을 가져오므로
# span태그로 가져오면 자동으로 개행(공백)이 들어가 있다.
# song = soup.select("div.ellipsis.rank01 a") # --> 공백없이 가져와짐
song = soup.select("div.ellipsis.rank01 > span") # --> 공백있이 가져와짐
len(song)
# song을 모두 출력
for i in song:
print(i.text)
# 나는 위에서 공백있이 가져왔으므로 공백을 제거 해야한다. strip()으로 삭제가능
## 필요없는 개행문자(이스케이프코드)를 삭제하는 기능 : strip()
2. 수집한 데이터 활용(표, 파일)
# 태그를 제외하고 순수한 텍스트만 담아줄 리스트 생성
songList = [] # 노래제목(텍스트) 리스트
singerList = [] # 가수명(텍스트) 리스트
for i in range(0, len(song)):
songList.append(song[i].text.strip())
singerList.append(testSinger[i].text.strip())
print(songList)
print(singerList)
3. 데이터 프레임 생성
import pandas as pd
# 컬럼명 > 가수 , 제목
info = {'title' : songList, 'singer' : singerList}
music = pd.DataFrame(info)
music
4. 파일로 저장
## csv형식으로 저장
# 한글이 깨지는 경우 인코딩을 실행
# encoding = ""하면 자동으로 최적화 해준다.
music.to_csv('music.csv', encoding = "")
# html파일로 저장
# 저는 html파일은 encoding=""하면 에러가 뜨는데 컴퓨터 버전마다 다르다.
music.to_html('music.html')
이렇게 저장하면 파이썬 실행파일과 같은 폴더안에 파일이 저장된것을 확인할 수 있다.
스마트인재개발원에서 진행된 수업내용입니다
'파이썬 > 웹 크롤링' 카테고리의 다른 글
[웹 크롤링] Gmarket 100 가져오기로 창없는 크롤링하기 (0) | 2021.06.07 |
---|---|
[웹 크롤링] 페이지 다운과 이미지 크롤링 (0) | 2021.06.04 |
[웹크롤링] Selenium 모듈과 tqdm라이브러리 (0) | 2021.06.04 |