제퍼넷 로고

웹 스크래핑 로튼 토마토 가이드

시간

이 기사는 데이터 과학 Blogathon.

소개

데이터는 지속적으로 성장을 촉진해 왔으며 다양한 소스에서 데이터를 효율적으로 가져올 수 있는 완벽한 도구를 보유하고 있습니다. 데이터의 품질이 좋다면 데이터의 출처와 출처는 중요하지 않습니다. 인터넷이 현재 시대를 지배하고 있기 때문에 인터넷 자체보다 더 좋은 데이터 수집 소스는 없습니다.

이 기사에서는 가장 인기 있는 웹사이트 중 하나인 Rotten Tomatoes에서 영화 이름, 감독, 박스오피스 컬렉션 등과 같은 영화 데이터를 스크랩할 수 있는 방법을 살펴보겠습니다. 우리는 웹 자동화 도구인 Selenium을 스크레이퍼로 사용하여 해당 웹 사이트에서 관심 있는 데이터를 긁어낼 것입니다. 이 기사는 Selenium 스크래핑에 대한 기본 지식을 제공하는 것을 목표로 합니다.

웹 스크랩 핑이란 무엇입니까?

세상은 우리가 생각하는 것보다 빠르게 움직이고 있으며, 기술은 더욱 빠르게 발전하고 있습니다. 최첨단 기술이 주도하는 세계에서 staRotten Tomatoesy에게 데이터는 매우 중요합니다. 의사결정은 전적으로 데이터에 의존하므로, 데이터가 미세할수록 결과는 더 좋아집니다. 일상적인 인터넷은 매일 XNUMX조 메가바이트의 데이터를 생성합니다. 하지만 이러한 모든 데이터 중에서 비즈니스 결정에 도움이 될 수 있는 매우 정확한 데이터가 필요합니다. 이렇게 방대한 양의 데이터를 살펴보고 관련 데이터를 찾는 것은 인간의 힘으로 불가능합니다. 거대한 건초 더미에서 바늘을 찾는 것보다 더 어렵다고 말하는 것이 더 안전합니다. 이것은 웹 스크래퍼가 작동하는 곳입니다. 간단히 말해 스크레이퍼는 웹페이지를 크롤링하고 관련 데이터를 찾는 자동화된 봇 또는 스크립트입니다. 귀하가 접하는 많은 데이터 세트는 일부 사이트에서 폐기되었습니다.

웹 스크래핑 도구

인터넷 사이트에서 데이터를 스크랩하는 데 사용되는 오픈 소스 웹 스크래핑 도구가 많이 있습니다. 저는 다른 언어의 도구에 관한 지식이 많지 않기 때문에 Python 라이브러리에 대해서만 이야기하겠습니다. 거기에는 정말 좋은 웹 스크래퍼가 많이 있습니다. Scrappy, BeautifulSoup, Pyppeteer 및 Selenium. 이 기사에서는 Selenium을 사용하여 인기 영화 사이트 Rotten Tomatoes에서 데이터를 긁어낼 것입니다.

셀레늄이란?

공식 헤더 셀레니움 페이지는 이렇게 된다

"Selenium은 브라우저를 자동화합니다. 그게 다야!

그 힘으로 무엇을 하느냐는 전적으로 당신에게 달려 있습니다.. "

우선, Selenium은 여러 웹 기능을 자동화하는 데 사용되는 웹 자동화 도구입니다. 이는 또한 전 세계 웹 개발자가 웹 사이트 테스트 목적으로 널리 사용합니다. 하지만 이는 웹 자동화에만 국한된 것이 아니라 내가 모르는 수많은 것들이지만 여기서는 셀레늄을 웹 스크레이퍼로 사용하겠습니다.

셀레늄 스크래핑에 대한 간략한 소개

셀레늄은 우리의 삶을 조금 덜 비참하게 만드는 데 도움이 되는 다양한 방법을 가지고 있습니다. 이것은 스크래핑 관련 기사이므로 원하는 데이터를 찾는 방법을 찾는 몇 가지 중요한 요소에 대해 논의하겠습니다.

  • ID별: 이 방법은 주어진 ID에 해당하는 웹사이트의 특정 요소를 찾는 데 도움이 됩니다.
  • 클래스별: 이전과 동일하지만 ID 대신 스크레이퍼가 언급된 클래스에 특정한 데이터를 찾습니다.
  • CSS_SELECTOR 기준: CSS 선택기는 요소와 선택기 값의 조합으로, 웹 페이지 내의 웹 요소를 식별합니다.
  • XPATH 사용: Xpath는 XML.documents 쿼리에 사용되는 언어입니다. XML과 HTML은 구조적 유사성을 갖고 있으므로 XPath를 사용하여 요소를 찾을 수 있습니다. 이는 웹사이트의 거의 모든 요소를 ​​찾을 수 있는 경로 표현으로 구성됩니다.

이 기사에서는 주로 Xpath 로케이터를 사용합니다. 다른 로케이터도 사용해 볼 수 있습니다. Xpath에 대한 간략한 입문서는 다음을 확인하세요. 기사.

0단계: 설치

가장 먼저 해야 할 일. 시스템에 Selenium을 아직 설치하지 않은 경우 Jupyter Notebook으로 이동하여 다음을 입력하세요.

!pip 셀레늄 설치

아니면 다음을 입력하세요.

핍 설치 셀레늄

로컬 시스템에 셀레늄을 다운로드합니다.

다음 다운로드 크롬드라이버 B에서

그렇지 않으면 스크립트에 아래 코드를 입력하여 즉시 Chrome 드라이버를 다운로드하고 사용할 수 있습니다.

드라이버 = webdriver.Chrome(ChromeDriverManager().install())

참고: 불필요한 문제를 피하기 위해 시스템에 Chrome 브라우저를 설치해 두는 것이 좋습니다. Brave와 같은 다른 크롬 기반 브라우저는 제대로 작동할 수도 있고 작동하지 않을 수도 있습니다.

1단계: 라이브러리 가져오기

이제 필요한 라이브러리를 Jupyter 환경으로 가져옵니다. 데이터 처리 및 정리에는 Pandas를 사용하고 스크래핑에는 Selenium을 사용합니다.

selenium에서 pd로 팬더 가져오기 webdriver_manager.chrome에서 webdriver 가져오기 selenium.webdriver.common.by에서 ChromeDriverManager 가져오기 가져오기

2단계: Chrome 드라이버 설치 또는 로드

이미 Chrome 드라이버를 설치한 경우 현재 세션에서 로드하세요.

드라이버 = webdriver.Chrome('경로/chromedriver')

아직 다운로드하지 않은 경우 언급한 이전 코드를 사용하여 현재 세션에 대한 Chrome 드라이버를 다운로드하세요.

드라이버 = webdriver.Chrome(ChromeDriverManager().install())

3단계: 웹 주소 얻기

다음으로 데이터를 스크랩하려는 웹 주소를 가져옵니다. 앞서 언급했듯이 이 기사에서는 Rotten Tomatoes 상위 100개 영화를 사용합니다. 페이지. 아래 코드는 웹 페이지에 액세스하는 데 도움이 됩니다.

드라이버.get('https://www.rottentomatoes.com/top/bestofrt/')

그러면 현재 Chrome 세션에서 웹페이지가 자동으로 로드됩니다.

보너스

스크린샷을 찍어 여기에 붙여넣는 대신 셀레늄 페이지의 스크린샷을 찍어보겠습니다.

PIL 가져 오기 이미지에서

드라이버.save_screenshot('C:UserssunilOneDrivePictures/Screenshots/foo.png')

스크린샷 = Image.open('ss.png')

스크린샷.쇼()


4단계: 페이지 검사

이제 페이지를 검사하고 필요한 요소를 찾으겠습니다. 여기 이 페이지에는 영화에 관한 정보가 많지 않다는 것을 알 수 있습니다. 영화명, 토마토 점수, 리뷰 갯수만 있습니다. 그러나 그것은 모든 개별 영화 링크를 가지고 있습니다. 이것이 우리가 먼저 스크래핑할 내용이므로 나중에 루프를 통해 각 페이지에 액세스할 수 있습니다.

페이지를 마우스 오른쪽 버튼으로 클릭하고 검사 요소를 입력하거나 Ctrl+Shift+J를 클릭하여 개발자 도구 섹션으로 들어갑니다.

사이트에서 의도한 부분, 즉 영화 테이블로 조심스럽게 이동하십시오(태그 위로 마우스를 가져가면 페이지에서도 해당 태그가 강조 표시됩니다).

페이지 검사| 웹 스크래핑

커서 바로 아래에 영화 링크가 있습니다.  꼬리표. 아래로 이동하여 다른 영화를 찾아보시면 동일한 구조를 보실 수 있습니다. 모든 사람들의 공통점은 하나다.

태그는 클래스 = "스타일이 지정되지 않은 기사링크", 우리는 이것을 활용하여 HREF 속성.

movie_we = 드라이버.find_elements(By.XPATH, '//td//a[@class = "unstyled articleLink"]')

우리는 특정 대상을 찾기 위해 Xpath를 사용하고 있습니다. 위의 코드 조각은 대상의 셀레늄 웹 요소를 가져옵니다. HREF 연결. 정확한 링크를 얻으려면 아래 코드를 실행합니다.

링크 = []

범위 내(len(movie_we))에 대해:

link.append(movie_we[i].get_attribute('href'))

링크[:5]


출력 : ['https://www.rottentomatoes.com/m/it_happened_one_night','https://www.rottentomatoes.com/m/citizen_kane','https://www.rottentomatoes.com/m/the_wizard_of_oz_1939','https://www.rottentomatoes.com/m/modern_times','https://www.rottentomatoes.com/m/black_panther_2018']

5단계: 데이터프레임 생성

스크랩할 모든 데이터를 저장하려면 데이터 프레임이 필요합니다. 따라서 열만 있는 빈 데이터 프레임을 시작하겠습니다. 여기 열은 우리가 긁어낼 영화 정보입니다.

영화 링크를 클릭하고 어떤 데이터를 긁어낼 수 있는지 확인하세요. 페이지를 훑어보면 무엇을 긁어야 할지 알 수 있습니다.

데이터프레임 생성

이 중에서 영화명, 토마토미터, 관객점수를 긁어냅니다. 그리고 아래 표의 나머지 데이터는

데이터프레임 이미지 생성 2| 웹 스크래핑

이렇게 많은 열이 포함된 데이터 프레임이 필요합니다. 혼동을 피하기 위해 동일한 이름을 사용할 것이며 데이터 프레임에 새 데이터를 추가하기가 더 쉬워집니다.

dta = pd.DataFrame(columns=['영화명', '관객점수', '토마토미터 점수', '평점', '장르', '원어', '감독', '제작자', '작가', ' 개봉일(극장)', '출시일(스트리밍)', '박스오피스(미국 총생산)', '런타임', '배급사', '사운드 믹스', '화면 비율', '컬렉션 보기'])

6단계: 웹 스크래핑 데이터

드디어 메인 이벤트 현장에 왔습니다. 이번 섹션에서는 관련 데이터를 긁어내는 방법을 알아보겠습니다. 우선, 영화 중 하나를 검사하십시오. 이전에 했던 방법을 따르세요. 긁어내고 싶은 페이지 섹션으로 이동하세요.

먼저 영화 이름과 토마토미터 점수를 가져옵니다.

이러한 데이터를 저장할 임시 사전 개체를 만듭니다.

info_we = drivers.find_elements(By.XPATH,'//score-board')

movie_info = {'영화 이름':”,'시청자 점수':','토마토미터 점수':”}

movie_info['영화 이름'] = info_we[0].text.split('n')[0]

movie_info['관객점수'] = info_we[0].get_attribute('audiencescore')

movie_info['토마토미터 점수'] = info_we[0].get_attribute('토마토미터 점수')


개별 코드를 실행하여 사물을 더 잘 파악하세요.

이제 나머지 데이터를 가져오겠습니다. 이 단계에서는 항목 라벨(장르, 감독, 작가 등)과 데이터 항목 값(범죄, 감독 이름, 작가 이름 등)을 모두 긁어냅니다. 동일한 검사 과정을 반복하고 각 항목에서 고유한 요소를 찾아보세요. 우리가 찾고 있는 데이터.

데이터 스크래핑

위 그림에서 각 라벨과 값이 서로 다른 것을 볼 수 있습니다. 데이터-qa 값(예: 라벨의 경우 'movie-info-item-label'), 값의 경우 'movie-info-item-value'. 이를 사용하여 레이블과 값을 별도로 찾을 수 있습니다.

webelement_list_val = [] webelement_list_key = [] webelement_list_key = 드라이버.find_elements(By.XPATH,'//div[@data-qa="movie-info-item-label"]') webelement_list_val = 드라이버.find_elements(By.XPATH, '//div[@data-qa="movie-info-item-value"]')

이제 데이터를 사전으로 변환하십시오. 따라서 나중에 이전에 만든 데이터 프레임에 이를 공급할 수 있습니다.

key_list, val_list = [],[] for k,v in zip(webelement_list_key, webelement_list_val): key_list.append(k.text.strip(':')) val_list.append(v.text) info = dict(zip( key_list,val_list)) #목록을 사전으로 변환

이 사전을 이전에 만든 사전과 병합하겠습니다.

total_info = {**영화_정보,**정보}

최종 사전 개체를 데이터 프레임에 추가합니다.

dta = dta.append(total_info,ignore_index=True)

기본 코드는 끝났습니다. 이제 우리는 각 영화의 요소를 긁어내기 위해 루프 안에 이러한 코드를 함께 넣을 것입니다.

tqdm에서 tqdm의 링크에 대한 tqdm 가져오기(links, desc='loading....'): 드라이버.get(링크) info_we = 드라이버.find_elements(By.XPATH,'//score-board') movie_info = {' 영화 이름':'','관객 점수':'','토마토미터 점수':''} movie_info['영화 이름'] = info_we[0].text.split('n')[0] movie_info[' 관객 점수'] = info_we[0].get_attribute('audiencescore') movie_info['토마토미터 점수'] = info_we[0].get_attribute('tomatometerscore') webelement_list_val = [] webelement_list_key = [] webelement_list_key = 드라이버.find_elements(By .XPATH,'//div[@data-qa="movie-info-item-label"]') webelement_list_val = 드라이버.find_elements(By.XPATH,'//div[@data-qa="movie-info- item-value"]') key_list, val_list = [],[] for k,v in zip(webelement_list_key, webelement_list_val): key_list.append(k.text.strip(':')) val_list.append(v.text ) info = dict(zip(key_list,val_list)) total_info = {**movie_info,**info} dta = dta.append(total_info,ignore_index=True)

사용하는 기계에 따라 다소 시간이 걸릴 수 있습니다. 우리가 마침내 여기에 도달한 것을 시각화해 봅시다.

dta.헤드()
사전 | 웹 스크래핑

꽤 좋아 보인다. 마침내 우리는 필요한 데이터를 스크랩하여 데이터 세트를 만들었습니다. 이제 조금 더 살펴보겠습니다.

dta.정보()
dta.정보()

여기에 있는 모든 것은 토마토미터와 청중 점수까지 객체 유형으로 되어 있는데 이는 좋지 않을 수 있습니다. 하지만 우리는

청중 점수와 토마토 미터 점수를 문자열에서 정수로 변환합니다.

dta[['Tomatometer Score','Audience Score']]=dta[['Tomatometer Score','Audience Score']].astype(int) print(dta[['Tomatometer Score','Audience Score']] .d유형)
출력:토마토미터 점수 int32 Audience Score int32 dtype: 개체

출시일을 날짜-시간 유형으로 변환

df['출시 날짜(스트리밍)'] = pd.to_datetime(df['출시 날짜(스트리밍)']) print(df['출시 날짜(스트리밍)'].head())
출력:0. 1999-12-28 1 2010-02-23 2 2003-08-12 3 2010-11-16 4 2018-05-02 이름 : 출시일(스트리밍), dtype : datetime64[ns]

극장 개봉 날짜 열을 변환하려면 각 날짜 끝에 있는 문자열을 제거해야 합니다.

def func(x): if type(x) != float: li = x.split(' ') li.remove(li[-1]) time = ' '.join(li).replace(',', '') 반환 시간 df['Release Date (극장)'] = df['Release Date (극장)'].apply(func) df['Release Date (극장)'] = pd.to_datetime(df['Release 날짜(극장)'])

등급 열에서는 추가 설명이 아닌 등급만 유지하려고 하지만 프로세스에서 충돌을 일으킬 수 있는 일부 NaN 값이 있습니다. 따라서 NaN 값을 문자열 값으로 할당하겠습니다.

df['Rating'].loc[df['Rating'].isnull()] = '없음'

이제 추가 설명의 등급 열을 정리하겠습니다.

df['Rating'] = df['Rating'].agg(lambda a : a.split(' ')[0])
df.Rating.value_counts() 출력: R 37 None 24 PG-13 18 PG 15 G 6 이름: Rating, dtype: int64

최종 데이터세트를 살펴보겠습니다.

df.head ()

이제 데이터가 훨씬 좋아졌습니다. 아래 코드를 사용하여 CSV로 저장하십시오.

df.to_csv(r'D:DataSetfile.csv', index=False)

결론

그래서 이것이다. 이 웹 스크래핑 기사를 통해 우리는 셀레늄의 기본부터 데이터 세트 준비까지 많은 것을 배웠습니다. 그래서 여기에 있습니다

  • 페이지의 요소를 찾고 검색하기 위한 다양한 Selenium 로케이터(By.ID, By.CLASS, By.XPATH 등)에 대해 간략하게 배웠습니다.
  • 크롬 드라이버를 사용하여 웹사이트에 접속하는 방법.
  • 웹페이지의 HTML 요소를 검사하여 필요한 요소를 찾는 방법
  • 또한 셀레늄 로케이터를 사용하여 필수 항목을 검색하는 프로세스도 배웠습니다. 에 의해. Xpath
  • 데이터 프레임을 생성하고 검색된 데이터를 읽을 수 있는 형식으로 저장했습니다.
  • 유용성을 높이기 위해 방금 생성한 데이터 세트를 정리하고 최종적으로 향후 사용 사례를 위해 데이터를 CSV 형식으로 저장했습니다.

지금쯤이면 이 스크레이퍼가 얼마나 편리한지 깨달았을 것입니다. 가장 좋은 점은 웹페이지를 스크랩하고 데이터 세트를 생성하고 분석을 수행할 수 있다는 것입니다.

기사가 마음에 드셨기를 바랍니다.

이 기사에 표시된 미디어는 Analytics Vidhya의 소유가 아니며 작성자의 재량에 따라 사용됩니다.

spot_img

최신 인텔리전스

spot_img

우리와 함께 채팅

안녕하세요! 어떻게 도와 드릴까요?