imdb 웹 페이지를 긁는 방법?


10

데이터 분석을 배우기위한 노력의 일환으로 Python을 사용하여 웹 스크랩 핑을 배우려고합니다. URL이 다음과 같은 imdb 웹 페이지를 긁으려고합니다. http://www.imdb.com/search/title?sort=num_votes,desc&start=1&title_type=feature&year=1950,2012

BeautifulSoup 모듈을 사용하고 있습니다. 다음은 사용중인 코드입니다.

r = requests.get(url) # where url is the above url    
bs = BeautifulSoup(r.text)
for movie in bs.findAll('td','title'):
    title = movie.find('a').contents[0]
    genres = movie.find('span','genre').findAll('a')
    genres = [g.contents[0] for g in genres]
    runtime = movie.find('span','runtime').contents[0]
    year = movie.find('span','year_type').contents[0]
    print title, genres,runtime, rating, year

다음과 같은 결과가 나타납니다.

The Shawshank Redemption [u'Crime', u'Drama'] 142 mins. (1994)

이 코드를 사용하여 제목, 장르, 런타임 및 연도를 긁을 수는 있지만 imdb 영화 ID 나 등급을 긁을 수는 없습니다. 크롬 브라우저에서 요소를 검사 한 후 위와 유사한 코드를 사용할 수있는 패턴을 찾을 수 없습니다.

아무도 영화 ID와 등급을 긁어 낼 수있는 코드를 작성하도록 도와 줄 수 있습니까?


1
코드를 약간 편집했지만 rating정의되지 않았 으므로 실패합니다 . 이를 수정하면 from BeautifulSoup import BeautifulSoup, 및을 추가 할 수도 있습니다 import requests. 왜 보여 url="http://etc"주지 않아도 되나요?
Spacedman

답변:


12

스크랩하는 대신 http://www.imdb.com/interfaces에서 직접 데이터를 가져 오려고 시도 할 수 있습니다 . 영화, 배우 등을 위해 ftp를 통해 사용할 수있는 데이터가있는 것 같습니다.


2
@Gred Thatcher, 링크 감사합니다. 이 프로젝트는 웹 스크래핑에 대한 학습 노력의 일환으로 이러한 모든 문제를 해결합니다. -:)
user62198 2016 년

8

나는 해결책을 알아낼 수 있었다. 누군가에게 도움이되거나 누군가 다른 것을 제안하고 싶을 때를 대비하여 게시를 생각했습니다.

bs = BeautifulSoup(r.text)
for movie in bs.findAll('td','title'):
    title = movie.find('a').contents[0]
    genres = movie.find('span','genre').findAll('a')
    genres = [g.contents[0] for g in genres]
    runtime = movie.find('span','runtime').contents[0]
    rating = movie.find('span','value').contents[0]
    year = movie.find('span','year_type').contents[0]
    imdbID = movie.find('span','rating-cancel').a['href'].split('/')[2]
    print title, genres,runtime, rating, year, imdbID

결과는 다음과 같습니다.

The Shawshank Redemption [u'Crime', u'Drama'] 142 mins. 9.3 (1994) tt0111161

2

class = "rating rating-list"를 사용하여 div에서 모든 것을 얻을 수 있습니다.

속성 ID를 검색하기 만하면됩니다. [id = "tt1345836 | imdb | 8.5 | 8.5 | advsearch"]이 내용이 있으면이 문자열을 '|'로 나누면 다음과 같은 결과가 나타납니다. 1. 매개 변수 : movie id 3. 매개 변수 : 영화 점수


감사. @Matic DB는 ... 내가 ID를 얻을 수 있었다 ..Below 내 솔루션입니다
user62198

2

약간의 일반적인 피드백으로, 출력 형식을 개선하는 것이 좋습니다. 형식의 문제는 프로그래밍 방식으로 데이터를 얻는 투명한 방법이 없다는 것입니다. 대신 시도해보십시오.

print "\t".join([title, genres,runtime, rating, year])

탭으로 구분 된 파일의 좋은 점은 스케일 업을 끝내면 임팔라 (또는 더 작은 스케일, 간단한 mySql 테이블)와 같은 것으로 쉽게 읽을 수 있다는 것입니다. 또한 다음을 사용하여 파이썬으로 데이터를 프로그래밍 방식으로 읽을 수 있습니다.

 line.split("\t")

두 번째 조언은 처음 스크랩에 필요한 것보다 더 많은 정보를 얻는 것이 좋습니다. 디스크 공간은 처리 시간보다 저렴하므로 분석을 확장 할 때마다 스크레이퍼를 다시 실행하는 것은 즐겁지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.