Как почистить IMDB веб-страницу?

10

Я пытаюсь самостоятельно изучить работу с использованием Python как часть усилий по изучению анализа данных. Я пытаюсь очистить веб-страницу imdb, URL которой следующий: 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 или рейтинг. После проверки элементов (в браузере Chrome) я не смог найти шаблон, который позволил бы мне использовать код, аналогичный приведенному выше.

Кто-нибудь может мне помочь написать кусок кода, который позволит мне очистить идентификатор фильма и рейтинги?

user62198
источник
1
Я немного отредактировал ваш код, но он потерпел неудачу, потому что ratingне определен. Если вы исправите это, вы также можете добавить from BeautifulSoup import BeautifulSoup, и import requests. И почему бы не показать, url="http://etc"чтобы нам не приходилось делать это для себя?
Spacedman
1
На всякий случай: opendata.stackexchange.com/questions/1073/…
Антон Тарасенко

Ответы:

12

Вместо очистки вы можете попытаться получить данные прямо здесь: http://www.imdb.com/interfaces . Похоже, у них есть данные, доступные через ftp для фильмов, актеров и т. Д.

Грег Тэтчер
источник
2
@Gred Thatcher, спасибо за ссылку. Этот проект является частью обучения по поиску в сети и, следовательно, всех этих проблем. - :)
user62198
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
user62198
источник
2

Вы можете получить все из div с помощью class = "rating rating-list"

Все, что вам нужно сделать, это восстановить атрибут id: [id = "tt1345836 | imdb | 8.5 | 8.5 | advsearch"] Когда у вас есть этот контент, вы разделяете эту строку на '|', и вы получаете: 1. параметр: идентификатор фильма 3. параметр: оценка фильма

MaticDiba
источник
Спасибо. @Matic DB ... я смог получить идентификатор .. Ниже мое решение
user62198
2

Как часть общего отзыва, я думаю, что вы бы преуспели в улучшении выходного формата. Проблема с текущим форматом в том, что нет прозрачного способа программного получения данных. Рассмотрим вместо этого попытку:

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

Приятной особенностью файла с разделителями табуляции является то, что если вы в конечном итоге увеличите масштаб, его можно легко прочитать в нечто вроде impala (или в меньших масштабах, простые таблицы mySql). Кроме того, вы можете затем программно читать данные в Python, используя:

 line.split("\t")

Второй совет: я бы предложил получить больше информации, чем вы думаете, на начальном этапе. Дисковое пространство дешевле, чем время обработки, поэтому повторный запуск скребка при каждом расширении аналитики не будет увлекательным.

jagartner
источник