-
2023.5.8 ~ 2023.5.14 공부일지 (크롤링 - 2)[Python] 2023. 5. 14. 22:47
생각해보니까 가장 중요한 초기 설정하는 법을 안 알려줬다..
아무도 따라해보지 않았을테니 지금이라도 정리해보겠다![Python] virtualenv 가상환경 설정하기
Python의 virtualenv 는 어플리케이션별로 독립된 가상 환경을 사용할 수 있게 해준다.
독립된 가상 환경이 필요한 이유
하나의 PC 혹은 서버 안에서 virtualenv 를 설정하고, 그 환경 안에서는 Host 환경과 별도로 각각 필요한 Python 버전을 관리하고, 필요한 특정 버전의 라이브러리를 관리할 수 있게 해준다. 저장 위치에 따른 문제, 저장 방식에 따른 문제 등등 이유가 있다.
virtualenv / venv 설정하기
1. venv package 사용
가상환경을 만들 파일 디렉토리로 이동
$ cd [your directory]
가상환경 만들기
$ python3 -m venv ./[your venv name]
가상환경 활성화
$ source [your venv name]/bin/activate
2. virtualenv package 사용
가상환경을 만들기 위한 Package : virtualenv, virtualenvwrapper 설치
$ pip install virtualenv virtualenvwrapper
가상환경을 만들 파일 디렉토리로 이동
$ cd [your directory]
가상환경 만들기
$ python3 -m virtualenv --python=[your python version] [your venv name]
가상환경 활성화
$ source [your venv name]/bin/activate
virtualenv VS venv
기본적으로는 같은 기능을 한다.
다만 작은 차이점들이 존재한다.
가장 큰 차이
venv : Python 3.3 부터 venv module 로 standard library 로 포함되어 있어 별도의 설치 과정이 필요 없다.
virtualenv : 별도의 설치 과정이 필요하다.
- venv 모듈은 virtualenv 의 경량화된 모듈이다. 그래서 virtualenv의 모든 기능을 제공하지 않는다.
- venv 는 virtualenv 보다 느리다.
- 확장성이 virtualenv 보다 떨어진다.
- venv 는 가상환경을 파이썬 버전별로 임의로 만들 수 없다.
- venv는 pip 를 통해 업그레이드 할 수 없다.
Python HTML 문서를 파싱하고 직렬화하는 html5lib 라이브러리
html5lib 설치
크롤링을 위해 필요한 라이브러리 이다. 나중에 필요하니 미리 깔아두도록 하자.
가상환경을 폴더에서 활성화까지 한 다음 ,
pip의 업그레이드가 존재하는지 확인하고 진행한다.
=> 여기서 pip란?
- Pip Installs Packages 의 약자
- Python 패키지를 설피하고 관리하는 패키지 매니저 (package manager)
- MAC OS 에서 brew, node 의 npm, yarn, Linux 에서 apt 와 같은 개념의 패키지 매니저
(추가 설명은 추후에 업로드 예정)
pip의 업그레이드가 존재하는지 확인하고 진행한다. (자주 업데이트 되기 때문에)
pip3 install --upgrade pip
pip로 html5lib 를 설치한다.
html5lib 뿐만 아니라 BeautifulSoup 이나 request 라이브러리도 pip로 간단하게 설치해보자.
이렇게 하면 html5lib 을 사용할 수 있다.
웹 크롤링 - 당근마켓 인기 중고 매물을 가져와보자.
import requests webpage = requests.get("https://www.daangn.com/hot_articles") print(webpage.text)
requests.get() 안에 url을 넣어서 사용할 수 있다.
코드를 실행하면 당근마켓 홈 화면의 HTML 문서 전체를 출력해준다.
BeautifulSoup 사용
BeautifulSoup : HTML 문서를 탐색하여 원하는 부분만 쉽게 뽑아낼 수 있는 파이썬 라이브러리 이다.
import requests from bs4 import BeautifulSoup webpage = requests.get("https://www.daangn.com/hot_articles") soup = BeautifulSoup(webpage.content, "html.parser") print(soup)
from bs4 import BeautifulSoup 로 라이브러리를 불러올 수 있다.
그리고 웹페이지를 요청한 뒤, 여기서 받아낸 문서를 .content 로 지정한 후 BeautifulSoup 를 통해 soup 라는 객체로 저장하면 됨.
여기서 뒤에 "html.parser" 라고 덧붙였다. 이외에도 "lxml", "html5lib" 등의 옵션을 사용할 수 있는데 지금은 html 을 사용해보겠다.
1. 파이썬 표준 라이브러리인 requests 모듈을 임포트 한다.
2. 표준 라이브러리 bs4 모듈에서 BeautifulSoup 클래스만 임포트 한다.
4. 실제 타겟 URL 을 문자열 객체로 만들어 변수 URL 에 할당한다.
5. 웹 서버에 GET 요청을 보내고 웹 서버가 응답한 내용을 변수 res에 할당
6. 에러가 발생하면 에러를 반환
7. 웹 서버로부터 응답 받은 객체 중에서 text 속성 (HTML 소스 코드) 을 선택, 우리가 받은 HTML 소스 코디를 lxml 파서를 통해 BeautifulSoup 객체로 만든다. (응답받은 데이터를 soup 변수에 할당)
여기서 403 에러가 발생한다?
=> 웹 서버측에서 우리의 접근을 거부한 것임.
Soup 객체가 전체적으로 어떻게 생겨먹었나 파악해보자.
import requests from bs4 import BeautifulSoup url = "https//:www.naver.com" res = requests.get(url) print(type(soup)) # BeautifulSoup 객체의 자료형 출력 print(soup.head) # HTML 문서의 'head' 태그에 해당하는 내용 출력 print(soup.body) # HTML 문서의 'body' 태그에 해당하는 내용 출력 print(soup.title) # HTML 문서의 'title' 태그 내용 출력 print(soup.title.name) # HTML 문서의 'title' 태그명 출력 print(soup.title.string) # HTML 문서의 'title' 태그를 제외하고 태그 안에 표시되는 텍스트만 출력
네이버 실시간 인기 웹툰 1위부터 10위까지 가져와보자.
1. 네이버웹툰에 들어간 다음, 개발자 도구를 연다.
2. 소스 코드 안에서 자신이 찾고자 하는 내용이 어떤 태그에 들어가 있는지 확인한다.
3. 원하는 정보를 파싱하고 저장한다.
# 라이브러리 준바히기 import csv import requests from bs4 import BeautifulSoup url = "https://comic.naver.com/webtoon/weekday" #액셀 파일로 저장하기 filename = "네이버 웹툰 인기 순위.csv" f = open (filename, 'w', encoding="utf-8-sig", newline="") writer = csv.writer(f) columns_name = ["순위","웹툰명"] #컬럼 속성명 만들기 writer.writerow(columns_name) # 웹 서버에 요청하기 res = requests.get(url) res.raise_for_status() #soup 객체 만들기 soup = BeautifulSoup(res.text, "lxml") cartoonsBox = soup.find('ol', attrs={"class": "assideBoxRank"}) # 인기 급상승 영역에서 'a'태그 모두 찾ㅈ아 변수 cartoons에 할당 cartoons = cartoonsBox.find_all('a') # 인기 급상승 영역에서 'a'태그 모두 찾아 변수 cartoons에 할당 i = 1 # 반복문으로 제목 가져오기(터미널 창 출력 및 엑셀 저장) for cartoon in cartoons: title = cartoon.get("title") print(f"{str(i)}위: {title}") data = [str(i), title] writer.writerow(data) i += 1
막상 코드를 실행해 보면 오류가 뜬다.
AttributeError: 'NoneType' object has no attribute 'find_all'
라는 애러가 뜨는데..
검색하여 나온 결과물이 없기 떄문에 나오는 오류 코드이다.
이러한 오류를 없애기 위해서는 어뗗게 해야 할까?
(사실 오류가 날 줄 몰랐다.)어떻게 하기는 하나하나 직접 다 찾아여지차근 차근 살펴보자.
다음 내용은 월요일날 마무리 해서 최종으로 완성하도록 하겠다.
'[Python]' 카테고리의 다른 글
Pycham 터미널 간단 명령어 (0) 2024.01.16 WebClone 코드 풀이 (10) 2023.06.05 2023.5.15 ~ 2023.5.21 공부일지 (크롤링 - 3) [코드풀이] (6) 2023.05.22 2023.4.24 ~ 2023.4.30 공부일지 (웹 크롤링 이론) (5) 2023.05.01 2023.4.17 ~ 2023.4.23 공부일지 (파이썬 1장 ~ 5장) (4) 2023.04.24