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이 영화에 대한 코드이다.
코드 번호를 모르는데 어떻게 접근할까? (아이디어)
- 현재 상영영화 목록 먼저 스크래이핑 해보면서 시도한다.
- 네이버에 영화를 검색, 포스터에 존재하는 <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 요청이 서버에서 없다고 반환하는 뜻