Как почистить 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) я не смог найти шаблон, который позволил бы мне использовать код, аналогичный приведенному выше.

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


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

Ответы:


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

2

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

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


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

2

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

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

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

 line.split("\t")

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.