웹 크롤링시 속성의 인자를 가져오기
div의 class 속성을 가져오는 예 주의 : 만약에 div의 class 속성이 존재하지 않을 때 span의 class속성을 가져와선 안된다.
def get_tag_attribute(attribute_name, tag_string):
p = re.compile(r'^<.*?{attribute_name)="(?P<value>.*?)".*?>'.format(attribute_name=attribute_name), re.DOTALL)
m = re.search(p, tag_string)
if m:
return m.group('value')
return ''
source = '<div><span class="abc">ASDF</span></div>'
result = get_tag_attribute('class', source)
만든 함수를 다른 파일로 따로 분리해 저장한다.
그 때 __all__
로 다음과 같이 설정해주면 나중에 import할 때 필요한 함수만 import하고 re 모듈과 같이 중복되거나 불필요한 것은 불러오지 않아도 된다.
import re
__all__ = (
'get_tag_attribute',
'get_tag_content',
)
....
BeautifulSoup
BeautifulSoup은 효율적으로 파싱할 수 있게 도와주는 파이썬 라이브러리.
다음과 같이 import할 수 있다.
from bs4 import BeautifulSoup
활용해보기
source = open('melon.html', 'rt').read()
soup = BeautifulSoup(source, 'lxml')
for td in soup.find_all('tr', class_ = 'lst50'):
title = tr.find('div', class_='rank01').find('a').text
print(title)
BeautifulSoup의 두번째 인자인 ‘lxml’은 어떤 해석기를 사용할지 결정한다. 지정을 안하면 속도가 느리다. html과 xml을 해석할 때 쓰는 것이 ‘lxml’해석기. 그리고 이 것을 한번 더 porting시킨 것이 BeautifulSoup(?)
OS
OS.path라는 것은 현재 경로를 찾을 수 있고, 어떤 모듈에 대해서 폴더에 들어가게 할 수 있다.
- os.getcwd() : 현재 자신의 디렉토리 위치를 리턴함
-
os.path.abspath(__name__) : 해당 경로를 절대경로로 바꿔줌. 파이썬에서 __name__을 입력하면 모듈의 이름을 나타내는데 이 모듈이 존재하는 위치를 절대경로로 바꿀 수 있음. 어떤 폴더, 어떤 파일에서 실행할지 모르기 때문에 __name__을 통해 이 절대 경로를 설정해주는 것이 중요함. (수정사항: __file__ 을 쓰는게 더 좋음. 파일의 위치를 정확하게 명시해줌)
- os.path.join(cur_path, ‘data’) : 컴퓨터가 해당 경로를 코드로 알 수 있게 하기 위해서 경로를 형성(?)시켜줌. cur_path에 /data를 추가하는 의미. 실제로 폴더가 존재하지 않아도 경로가 생기므로 폴더가 없을 시 만들어 주는 코드를 추가해주어야 함
- os.path.dirname(cur_path) : 해당 폴더나 파일의 상위 경로를 반환함
In [1]: cur_path = os.getcwd()
In [2]: cur_path
Out [2]: '/Users/chrisaor/projects/crawler'
In [3]: os.path.join(cur_path, 'data')
Out [3]: '/Users/chrisaor/projects/crawler/data'
조금 더 응용을 해보면
#프로젝트 파일(__name__변수)이 있는 곳의 dir찾기
root_dir = os.path.dirname(os.path.abspath(__name__))
#data/ 폴더의 경로
path_data_dir = os.path.join(root_dir, 'data')
- os.makedirs(path_data_dir, exist_ok=True) : 해당 디렉토리에 폴더를 만듦. exist_ok옵션을 True로 설정해두면 폴더가 존재할 시 에러가 나지 않고 넘어감.
HOMEWORK
멜론 차트 순위의 곡들 상세정보 긁어오기.
순위에 있는 곡들의 song_ID를 찾아 상세내용이 들어있는 url을 타고들어가면됨.
Comments