Python에서 크롤링 하기 위해서는 일단은 BeautifulSoup 및 request 라이브러리를 설치해야 한다.
터미널을 이용하여 아래의 코드를 따라 작성해보자.
(일단 나는 윈도우 환경이다)
pip3 install BeautifulSoup4
pip3 install requests
#잘 설치되어있는지를 확인하는 과정
pip3 list
설치를 완료하면 웹크롤링을 위해 라이브러리들을 import해야 한다.
파이썬 파일을 하나 만들어 아래의 코드들을 적어주자.
import urllib.request
from bs4 import BeautifulSoup
urllib.request는 python docs에 따르면
urllib.request는 URL(Uniform Resource Locator)을 가져오기 위한 파이썬 모듈입니다. urlopen 함수의 형태로, 매우 간단한 인터페이스를 제공합니다. 다양한 프로토콜을 사용하여 URL을 가져올 수 있습니다.
출처 : https://docs.python.org/ko/3/howto/urllib2.html
urllib 패키지를 사용하여 인터넷 리소스를 가져오는 방법 — Python 3.10.1 문서
처리기를 만들고 설치하는 것을 설명하기 위해 HTTPBasicAuthHandler를 사용합니다. 기본 인증(Basic Authentication) 작동 방식에 대한 설명을 포함하여 이 주제에 대한 자세한 설명은 Basic Authentication Tutoria
docs.python.org
즉, 웹사이트의 URL(인터넷 리소스)을 갖고 오기 위해서는 필요한 모듈이다. 여기서는 urllib.request.urlopen()을 사용할 것이다.
BeautifulSoup는 간단하게 말하자면 xml이나 html문서의 데이터를 가져오기 위해 사용된다. 이 때, html문서를 파싱하기 위해서는 'html.parser' 옵션을 설정해주어야 한다.
from bs4 import BeautifulSoup
import urllib.request
import re
urladdress1 = 'https://www.melon.com/chart/index.htm'
soup = BeautifulSoup(page, 'html.parser')
# print(soup.prettify())
# print(soup.find_all(title = re.compile('재생$')))
for song_title in soup.find_all(title = re.compile('재생$')):
print(song_title.get_text())
하지만 이상하게도 멜론 차트의 url이 https://www.melon.com/chart/index.htm 이었지만 ERROR 406이 나타났었다.
이를 해결하기 위해서 여러 검색을 해봤는데, urllib.request.Request를 이용하면 된다고 한다.
Request 객체를 만들 때 헤더가 담긴 딕셔너리를 전달할 수 있다. 다음 예제는 위와 같은 요청을 하지만, 자신을 Internet Explorer의 한 버전으로 식별한다.
Python Docs의 예제 :
import urllib.parse
import urllib.request
url = 'http://www.someserver.com/cgi-bin/register.cgi'
user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'
values = {'name': 'Michael Foord',
'location': 'Northampton',
'language': 'Python' }
headers = {'User-Agent': user_agent}
data = urllib.parse.urlencode(values)
data = data.encode('ascii')
req = urllib.request.Request(url, data, headers)
with urllib.request.urlopen(req) as response:
the_page = response.read()
출처: https://docs.python.org/ko/3/howto/urllib2.html
간단하게 말하자면, header안의 User-Agent를 브라우저로 인식시켜준다면 접근을 거부하는 사이트들에 접근할 수 있다는 것이다.
User-Agent로 사용할 수 있는 것은 이렇게 구분된다,
- Mozilla/5.0 (Windows NT 10.0; Win64; x64)
- AppleWebKit/537.36 (KHTML, like Gecko)
- Chrome/96.0.4664.110
- Safari/537.36
이렇게 네 가지 중에 하나를 사용하면 된다.
위의 Python Docs를 예제 삼아서 다시 코드를 짜봤다.
import urllib.request
from bs4 import BeautifulSoup
import re
page = 'https://www.melon.com/chart/index.htm'
header_ = { 'User-Agent' : 'Chrome/96.0.4664.110'}
req = urllib.request.Request(page, headers =header_)
before_soup = urllib.request.urlopen(req)
soup = BeautifulSoup(before_soup, 'html.parser')
title =[]
for song_title in soup.find_all(title = re.compile('재생$')):
title.append(song_title.get_text())
print(title)
이 때, re.compile('재생$')을 한 이유는 다음과 같다.
<a href="javascript:melon.play.playSong('1000002721',34298499);" title="리무진 (Feat. MINO) (Prod. GRAY) 재생">리무진 (Feat. MINO) (Prod. GRAY)</a>
title에서 마지막 부분에 재생이라 써져있고 태그 사이에는 제목이 들어가 있었기 때문이다.
re 라이브러리에 대해 더 알고싶다면 아래 문서를 참고하자.
https://docs.python.org/ko/3/library/re.html?highlight=re#module-re
re — 정규식 연산 — Python 3.10.1 문서
scanf() 시뮬레이션 파이썬에는 현재 scanf()에 해당하는 것이 없습니다. 정규식은 일반적으로 scanf() 포맷 문자열보다 강력하지만, 더 장황하기도 합니다. 아래 표는 scanf() 포맷 토큰과 정규식 간의
docs.python.org
'조열심 카테고리 > Python 이것저것' 카테고리의 다른 글
| [Python] 자신만의 Error 만들기 (0) | 2022.05.11 |
|---|---|
| [Python] 제너레이터 내포 표기 (0) | 2022.05.11 |
| [Python] Iterator, Generator(이터레이터, 제너레이터) (0) | 2022.01.05 |
| [Python] 일급 함수(일급 객체) (0) | 2022.01.04 |
| [ML] 특성 선택 방법론 (0) | 2022.01.02 |