Я не могу просматривать страницы Beautifulsoup - PullRequest
0 голосов
/ 02 июня 2019

Я новичок в изучении веб-страниц и следую этому учебнику , чтобы извлечь данные о фильмах из по этой ссылке , я выбрал для извлечения фильмы между 2016 и 2019 для тестирования. Я получаю только 25 строк, но хочу больше 30000. Ты думаешь это возможно ?

это код:

from requests import get
from bs4 import BeautifulSoup
import csv
import pandas as pd
from time import sleep
from random import randint
from time import time
from IPython.core.display import clear_output

headers = {"Accept-Language": "en-US, en;q=0.5"}

pages = [str(i) for i in range(1,5)]
years_url = [str(i) for i in range(2000,2018)]

url = 'https://www.imdb.com/search/title?release_date=2016-01-01,2019-05-01'
response = get(url)
html_soup = BeautifulSoup(response.text, 'html.parser')
type(html_soup)

movie_containers = html_soup.find_all('div', class_ = 'lister-item mode-advanced')

names = []
years = []
imdb_ratings = []
metascores = []
votes = []
start_time = time()
requests = 0

for year_url in years_url:
# For every page in the interval 1-4
   for page in pages:
# Make a get request
      response = get('http://www.imdb.com/search/title?release_date=' + year_url +'&sort=num_votes,desc&page=' + page, headers = headers)
# Pause the loop
      sleep(randint(8,15))
# Monitor the requests
      requests += 1
      elapsed_time = time() - start_time
 print('Request:{}; Frequency: {} requests/s'.format(requests, requests/elapsed_time))
clear_output(wait = True)
# Throw a warning for non-200 status codes
if response.status_code != 200:
  warn('Request: {}; Status code: {}'.format(requests, response.status_code))
# Break the loop if the number of requests is greater than expected
  if requests > 72:
    warn('Number of requests was greater than expected.')

# Parse the content of the request with BeautifulSoup
page_html = BeautifulSoup(response.text, 'html.parser')
# Select all the 50 movie containers from a single page
mv_containers = page_html.find_all('div', class_ = 'lister-item mode-advanced')

# Extract data from individual movie container
for container in movie_containers:
# If the movie has Metascore, then extract:
  if container.find('div', class_ = 'ratings-metascore') is not None:
# The name
   name = container.h3.a.text
   names.append(name)
# The year
   year = container.h3.find('span', class_ = 'lister-item-year').text
   years.append(year)
# The IMDB rating
   imdb = float(container.strong.text)
   imdb_ratings.append(imdb)
# The Metascore
   m_score = container.find('span', class_ = 'metascore').text
   metascores.append(int(m_score))
# The number of votes
   vote = container.find('span', attrs = {'name':'nv'})['data-value']
   votes.append(int(vote))


   movie_ratings = pd.DataFrame({'movie': names,
  'year': years,
  'imdb': imdb_ratings,
  'metascore': metascores,
  'votes': votes
  })

#data cleansing
movie_ratings = movie_ratings[['movie', 'year', 'imdb', 'metascore', 'votes']]
movie_ratings.head()
movie_ratings['year'].unique()
movie_ratings.to_csv('movie_ratings.csv')

Ответы [ 2 ]

1 голос
/ 02 июня 2019

Начните с двойной проверки вашего отступа до конца (на самом деле - непослушный, непослушный - это неправильно в этом уроке. Я предполагаю, что после публикации он не был правильно прочитан, и код неоднократно выравнивался по левому краю).

Чтобы проиллюстрировать, у вас есть что-то вроде (показаны сокращенные строки кода)

for year_url in years_url:
    for page in pages:
        response = get('http://www.imdb.com/search/title?release_date=' + year_url +'&sort=num_votes,desc&page=' + page, headers = headers)

page_html = BeautifulSoup(response.text, 'html.parser')

Ваш отступ означает, что если код выполняется вообще, вы работаете только с последним URL, который вы намеревалисьвизит с точки зрения фактического разбора html.

Это должно быть:

for year_url in years_url:
    for page in pages:
        response = get('http://www.imdb.com/search/title?release_date=' + year_url +'&sort=num_votes,desc&page=' + page, headers = headers)
        page_html = BeautifulSoup(response.text, 'html.parser')

Отступы дают значение в python .

https://docs.python.org/3/reference/lexical_analysis.html?highlight=indentation

Ведущий пробел (пробелы и табуляции) в начале логической строки используется для вычисления уровня отступа строки, который, в свою очередь, используется для определениягруппировка высказываний.

1 голос
/ 02 июня 2019

Трудно сказать точно, в чем здесь проблема из-за отсутствия функций, но из того, что я вижу, вам нужно проанализировать каждую страницу отдельно.

После каждого запроса вам нужно разобрать текст. Тем не менее, я подозреваю, что основной проблемой является порядок вашего кода, я бы предложил использовать функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...