Filmarks에서 데이터를 추출하기 위해 웹 스캔 배우기 #2

14725 단어 Python3python3.6Python
웹 사이트 축소판https://program-board.com
최종 목표: Filmarks에서 연대별 평가가 높은 영화 일람을 만들기 위한 데이터를 추출한다.
본고에서 특정 페이지의 여러 항목에 대한 정보를 추출합니다. 추출한 영화는 하나입니다.

소스 코드 확인


지난번과 마찬가지로 추출하고 싶은 정보의 원본 코드를 확인합니다.
이 원고는 다음과 같은 정보를 추출할 것이다.
영화 제목
상영일
제작국
상영 시간
・ 유형(최대 3개)
별(평가)
감독
시나리오(최대 2명)
· 출연자(최대 3명)
import requests
import bs4
import pandas as pd

# ウェブの情報を取得
url= 'https://filmarks.com/list/trend'
res = requests.get(url)

# HTMLの整形
soup = bs4.BeautifulSoup(res.text) #features='lxml')

한 작품의 정보만 추출하다


우선, 화면의 시작 작품을 표시하는 웹 정보를 추출한다.
infos = soup.select('div.p-movie-cassette__info')
#infos = infos.select('a.c-label')
movie = infos[0]
print('作品数:{}'.format(len(infos)))
print(movie.prettify())

여러 항목 추출


여기서부터 여러 항목의 정보를 추출하려고 시도했습니다. 그러나 오류가 발생했기 때문에 오류에 대한 시행착오도 기술했습니다.

오류 발생


지난번과 같은 방법으로 감독의 정보를 추출하기 위해 원본 코드는'a.c-label'이기 때문에'a.c-label'에서 추출을 시도했다. 하지만 감독뿐만 아니라 시나리오·배우도 추출됐다.
확인 후 감독·스크립트·배분 역할도 원본 코드에'a.c-label'탭이 추가되었습니다.

잘못된 대책


따라서 추출된 정보를 정리할 때 목록의 요소로 보존하는 등 노력을 기울여야 한다.
추출 정보도 정리하기 어려워, 여러 항목을 추출하는 코드 movie_info () 로 정의합니다.
코드와 출력 결과는 다음과 같다.
def movie_info(info):

    #出力用
    out_list = []

    # タイトル
    title = info.select('h3.p-movie-cassette__title')[0].text
    out_list.append(title)

    # 上映日
    release_date = info.select('span')[2].text
    release_date = '{}/{}/{}'.format(release_date[0:4],release_date[5:7],release_date[8:10])
    out_list.append(release_date)

    # 製作国
    country = info.select('div.p-movie-cassette__other-info')[0].select('a')[0].text
    out_list.append(country)

    # 上映時間
    time = info.select('span')[3].text.replace('分','')
    out_list.append(time)

    # ジャンル(3つまで)
    genre_list = ['-','-','-']

    genre_web = info.select('div.p-movie-cassette__genre')[0].select('a')#ジャンルリスト作成
    for i in range(len(genre_web)):
        genre_list.insert(i,genre_web[i].text)

    out_list.append(genre_list[0])
    out_list.append(genre_list[1])
    out_list.append(genre_list[2])

    # 星(評価)
    score = info.select('div.c-rating__score')[0].text
    out_list.append(score)

    # 監督
    director= info.select('div.p-movie-cassette__people-wrap')[0].select('a')[0].text
    out_list.append(director)

    # 脚本(2人まで)
    scenario_list = ['-','-','-']

    scenario_web = info.select('div.p-movie-cassette__people-wrap')[1].select('a')
    for i in range(len(scenario_web)):
        scenario_list.insert(i,scenario_web[i].text)

    out_list.append(scenario_list[0])
    out_list.append(scenario_list[1])

    # 出演者(3人まで)
    cast_list = ['-','-','-']

    cast_web = info.select('div.p-movie-cassette__people-wrap')[2].select('a')
    for i in range(len(cast_web)):
        cast_list.insert(i,cast_web[i].text)

    out_list.append(cast_list[0])
    out_list.append(cast_list[1])
    out_list.append(cast_list[2])

    return out_list

###################################
['ジョーカー',
 '2019/10/04',
 'アメリカ',
 '122',
 'ドラマ',
 'クライム',
 'スリラー',
 '4.4',
 'トッド・フィリップス',
 'トッド・フィリップス',
 '-',
 'ホアキン・フェニックス',
 'ロバート・デ・ニーロ',
 '-']
###################################

다음 수정점


이 코드를 바탕으로 여러 작품의 정보를 추출하려고 했지만 대본이 기재되지 않은 작품도 있기 때문에 목록의 요소가 아니라'스크립트'등 항목으로 직접 수정해 판별할 수 있도록 했다.

좋은 웹페이지 즐겨찾기