Data/Python

[크롤링] 웹 크롤링 BeautifulSoup (2)

밍츠 2022. 3. 25. 02:03

1. 영화 정보 출력하기

 

url : https://movie.naver.com/movie/bi/mi/detail.naver?code=208077 

 

스파이더맨: 노 웨이 홈

‘미스테리오’의 계략으로 세상에 정체가 탄로난 스파이더맨 ‘피터 파커’는 하루 아침에 평범한 일상...

movie.naver.com

-> url 에서 code=208077이 영화에 대한 코드이다.

 

코드 번호를 모르는데 어떻게 접근할까? (아이디어)

  1. 현재 상영영화 목록 먼저 스크래이핑 해보면서 시도한다.
  2. 네이버에 영화를 검색, 포스터에 존재하는 <a> 태그 접근을 반복한다.

 

- 클래스 태그에 원하는 값이 없다면 부모 태그를 확인한다.

- find로 태그 찾은 후 find로 태그 하나 더 찾을 수 있다. (아래 예시)

 

2. 웹 스크래핑 결과 파일(.txt)로 저장하기

 

error_urls = []
for i in range(10): # 0~9

    try:
        url = 'https://~~' + str(i)
        web = urlopen(url)
        source = BeautifulSoup(web, 'html.parser')

        with open('brunch_all.txt', 'a', encoding = 'utf-8') as f:

            all_text = source.find('div', {'class':'wrap_body'})
            article = all_text.find_all('p')

            for content in article:
                print(content.get_text())
                f.write(content.get_text() + '\n')
    except:
        print('{}번 글에서 에러가 발생했습니다.'.format(i))
        error_urls.append('https://~~' + str(i))
        pass

- url의 마지막에 번호는 해당 글의 번호임을 이용하여 파일 내용을 불러온다.

-> 번호에 해당하는 글이 없는 경우가 존재하여 try ~ except로 예외처리를 해준다.

- with open에서 "w" 로 설정하면 내용이 한 개만 작성되어 누적으로 작성하기 위해 "a"로 옵션을 준다.

- HTML 태그 클래스에서 두개로 정의되어 있을 때 한개 적는다. (이는 상황마다 달라 여러 개도 적어보고 시도해본다)

- range()는 정수 이므로 문자열을 더하기 위해 str()로 형 변환을 해준다.

-> jupyter와 같은 파일 경로에 brunch_all.txt 파일이 생성된다.

 

+ url 주소가 잘못되면 404 : Not Found 에러 발생, 우리의 url 요청이 서버에서 없다고 반환하는 뜻