2016-11-09 2 views
2

Я пытаюсь очистить IMDB, чтобы найти конкретный заголовок, ввести первую ссылку в результатах поиска, а затем распечатать год (и позже другую информацию) о том, что фильм был выпущен, но я не может показаться, что какая часть html помещается в .find().Скребок IMDB с красотой в Python; результат поиска, затем введите ссылку и получите год

Первая функция работает и собирает исходный url и соединяет ее с новой второй частью URL-адреса (для страницы фильма).

Спасибо за помощь, застряли на этом в течение нескольких дней!

from bs4 import BeautifulSoup 
import requests 
from urllib.parse import urljoin # For joining next page url with base url 

search_terms = input("What movie do you want to know about?\n> ").split() 

url = "http://www.imdb.com/find?ref_=nv_sr_fn&q=" + '+'.join(search_terms) + '&s=all' 

def scrape_find_next_page(url): 
    headers = {'User-Agent': 'Mozilla/5.0'} 
    response = requests.get(url, headers=headers) 
    soup = BeautifulSoup(response.text, "html.parser") 

    next_page = soup.find('td', 'result_text').find('a').get('href') 

    return next_page 


next_page_url = scrape_find_next_page(url) 

new_page = urljoin(url, next_page_url) 



def scrape_movie_data(next_page_url): 
    headers = {'User-Agent': 'Mozilla/5.0'} 
    response = requests.get(url, headers=headers) 
    soup = BeautifulSoup(response.text, "html.parser") 

    title_year = soup.find('span','titleYear').find('a').get_text() 

    return title_year 

print(scrape_movie_data(new_page)) 
+0

использование DevTool в Chrome/Firefox, чтобы найти элемент (если страница Безразлично» t использовать JavaScript для загрузки dat а). – furas

ответ

2

Первая проблема: в scrape_movie_data(next_page_url) использовании url вместо next_page_url в requests.get() так вы читаете ту страницу.

response = requests.get(next_page_url, headers=headers) 

Вторая проблема: вы должны использовать {'id': 'titleYear'} в find()

title_year = soup.find('span', {'id': 'titleYear'}).find('a').get_text() 

Final версии:

def scrape_movie_data(next_page_url): 
    headers = {'User-Agent': 'Mozilla/5.0'} 
    response = requests.get(next_page_url, headers=headers) 
    soup = BeautifulSoup(response.text, "html.parser") 

    title_year = soup.find('span', {'id': 'titleYear'}).find('a').get_text() 

    return title_year 

EDIT: проверка IMDB API в Google. Некоторые интересные результаты

SO - IMDB API to retrieve character information

SO - Does IMDB provide an API?

и вы можете получить результаты, как JSON, поэтому вам не придется скрести.

Другие порталы:

OMDb API -The Open Movie Database

The Movie DB API


EDIT: JSON данные

import requests 

url = 'http://www.imdb.com/xml/find?json=1&nr=1&tt=on&q={}' 
#url = 'http://www.imdb.com/xml/find?json=1&nr=1&nm=on&q={}' 

headers = {'User-Agent': 'Mozilla/5.0'} 

title = input("Title: ").split() 

response = requests.get(url.format(title[0]), headers=headers) 

data = response.json() 

for x in data['title_popular']: # data['title_approx']: 
    print('title:', x['title']) 
    print(' year:', x['title_description'][:4]) 
    print('---') 
    print(' id:', x['id']) 
    print('name:', x['name']) 
    print('  title:', x['title']) 
    print('episode_title:', x['episode_title']) 
    print('title_description:', x['title_description']) 
    print('  description:', x['description']) 
    print('------------------------------------') 
+0

Я добавляю ссылки об API. – furas

Смежные вопросы