CS/ETC

웹사이트 상세페이지 크롤링

휴먼코딩 2024. 8. 17. 03:22
  • http://www.cgv.co.kr 의 무비차트 링크를 가져와 상세페이지 정보를 가져온다
  • https ssl 인증 무효화
  • requests와 BeautifulSoup를 사용하여 구현
  • pandas를 통해 CSV 파일로 출력

페이지에서 상세페이지 url을 가져와 url 안의 정보를 가져오는 방식으로 구현했다.

import requests
import pandas as pd
from bs4 import BeautifulSoup

 

 

# 요청 헤더 user agent 설정
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}

# URL에 대한 GET 요청을 보내서 웹 페이지의 HTML 콘텐츠를 가져옵니다.
resp = requests.get('http://www.cgv.co.kr/movies/?lt=1&ft=0', headers=headers, verify=False)

# 응답 객체의 인코딩을 'utf-8'로 설정합니다.
resp.encoding = 'utf-8'

# 'lxml' 파서를 사용하여 HTML을 구문 분석한다.
soup = BeautifulSoup(resp.text, 'lxml')

 

 

# 1. <ol> 요소를 찾습니다.
ol = soup.find('ol')

# 2. <a> 태그에서 데이터 추출
data_rows = []
links = []
for li in ol.find_all('li'):
    a_tag = li.find('a')
    if a_tag:
        href = a_tag.get('href', '')  # <a> 태그의 href 속성 값
        data_rows.append([href])
        links.append(href)
        print(links)  # 링크 URL을 리스트에 추가

 

출력 결과

['/movies/detail-view/?midx=88499']
['/movies/detail-view/?midx=88499', '/movies/detail-view/?midx=88170']
['/movies/detail-view/?midx=88499', '/movies/detail-view/?midx=88170', '/movies/detail-view/?midx=88454']

 

 

 # 3. 각 링크에 대해 추가 데이터 요청
additional_data = []
for link in links:
        print("url:" , 'http://www.cgv.co.kr' + link )
        response = requests.get('http://www.cgv.co.kr' + link, headers=headers, verify=False)

        response.raise_for_status()  # HTTP 요청 오류 발생 시 예외를 발생시킴.

        page_soup = BeautifulSoup(response.text, 'html.parser')

        # <div class='title'>에서 <strong> 태그의 텍스트 추출
        title_div = page_soup.find('div', class_='title')
        strong_tag = title_div.find('strong')
        additional_info = strong_tag.text.strip()

        # 추가 정보 리스트에 추가
        additional_data.append(additional_info)

# 결과 출력
for data in additional_data:
    print(data)

 

출력 결과

url: http://www.cgv.co.kr/movies/detail-view/?midx=88499
url: http://www.cgv.co.kr/movies/detail-view/?midx=88170
url: http://www.cgv.co.kr/movies/detail-view/?midx=88454
임영웅ㅣ아임 히어로 더 스타디움
에이리언- 로물루스
행복의 나라

 

# 4. 데이터프레임 생성
df = pd.DataFrame(data_rows, columns = ['영화 url'])
df['제목'] = additional_data

# 5. 생성된 DataFrame 출력
print(df)

 

출력 결과

# 4. 데이터프레임 생성
df = pd.DataFrame(data_rows, columns = ['영화 url'])
df['제목'] = additional_data

# 5. 생성된 DataFrame 출력
print(df)# 4. 데이터프레임 생성
df = pd.DataFrame(data_rows, columns = ['영화 url'])
df['제목'] = additional_data

# 5. 생성된 DataFrame 출력
print(df)

 

 

# CSV 파일로 저장
df.to_csv('movies.csv', index=False, encoding='utf-8')

 

DB에 CSV 데이터 넣기

https://velog.io/@seinthemag/CSV%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-DB-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%97%85%EB%A1%9C%EB%93%9C