Web Scraping Em Python – Raspar Filmes De Ficção Científica Do IMDB

Você já se esforçou para encontrar um conjunto de dados para seu projeto de ciência de dados? Se você é como eu sou, a resposta é sim.

Felizmente, existem muitos conjuntos de dados gratuitos disponíveis – mas às vezes você quer algo mais específico ou sob medida. Para isso, o web scraping é uma boa habilidade para ter em sua caixa de ferramentas para extrair dados do seu site favorito.

O que é abordado neste artigo?

Este artigo tem um script Python que você pode usar para extrair os dados de filmes de ficção científica (ou qualquer gênero que você escolher!) do site do IMDB . Ele pode então gravar esses dados em um dataframe para exploração adicional.

Vou concluir este artigo com um pouco de análise exploratória de dados (EDA). Com isso, você verá quais outros projetos de ciência de dados são possíveis para você experimentar.

Isenção de responsabilidade: embora o web scraping seja uma ótima maneira de extrair dados programaticamente de sites, faça-o com responsabilidade. Meu script usa a função sleep, por exemplo, para desacelerar intencionalmente os pull requests, para não sobrecarregar os servidores do IMDB. Alguns sites desaprovam o uso de raspadores da web, portanto, use-os com sabedoria.

Script de Web Scraping e Limpeza de Dados

Vamos ao script de raspagem e executá-lo. O roteiro traz títulos de filmes, anos, classificações (PG-13, R e assim por diante), gêneros, tempos de execução, resenhas e votos para cada filme. Você pode escolher quantas páginas deseja extrair com base em suas necessidades de dados.

Nota: levará mais tempo quanto mais páginas você selecionar. Leva 40 minutos para raspar 200 páginas da Web usando o Google Colab Notebook .

Para aqueles que ainda não experimentaram, o Google Colab é uma ferramenta de desenvolvimento Python estilo Jupyter Notebook baseada em nuvem que reside no pacote de aplicativos do Google. Você pode usá-lo imediatamente com muitos dos pacotes já instalados que são comuns em ciência de dados.

Abaixo está uma imagem do espaço de trabalho do Colab e seu layout:

R9sAuHzGHrEvRK_hiAWsy4W41W72et6clD38gIYeAA6AtA32e97xxw0W5ub_96xmgSMTDB2VjRK-gz_YgYtZoV1YyCHjKftaB7-HD2NQ7qt_8hcdnDfqaibp0ONwPr9-4zO5gv3FuXdxiOMsN6eF8bA

Apresentando a interface do usuário do Google Colab

Com isso, vamos mergulhar! Primeiramente, você deve sempre importar seus pacotes como sua própria célula. Se você esquecer um pacote, poderá executar novamente apenas essa célula. Isso reduz o tempo de desenvolvimento.

Nota: alguns desses pacotes precisam pip install package_nameser executados para instalá-los primeiro. Se você optar por executar o código localmente usando algo como um Jupyter Notebook, precisará fazer isso. Se você quiser começar a trabalhar rapidamente, pode usar o bloco de anotações do Google Colab. Isso tem tudo isso instalado por padrão.

from requests import get
from bs4 import BeautifulSoup
from warnings import warn
from time import sleep
from random import randint
import numpy as np, pandas as pd
import seaborn as sns

Como fazer o Web Scraping

Você pode executar o código a seguir que faz a raspagem da web real. Ele puxará todas as colunas mencionadas acima em matrizes e as preencherá um filme por vez, uma página por vez.

Há também algumas etapas de limpeza de dados que adicionei e documentei neste código. Eu removi os parênteses dos dados da string mencionando o ano do filme, por exemplo. Eu então converti aqueles para números inteiros. Coisas como essa facilitam a análise e a modelagem de dados exploratórios.

Observe que eu uso a função sleep para evitar ser restringido pelo IMDB quando se trata de percorrer suas páginas da web muito rapidamente.

# Note this takes about 40 min to run if np.arange is set to 9951 as the stopping point.

pages = np.arange(1, 9951, 50) # Last time I tried, I could only go to 10000 items because after that the URI has no discernable pattern to combat webcrawlers; I just did 4 pages for demonstration purposes. You can increase this for your own projects.
headers = {'Accept-Language': 'en-US,en;q=0.8'} # If this is not specified, the default language is Mandarin

#initialize empty lists to store the variables scraped
titles = []
years = []
ratings = []
genres = []
runtimes = []
imdb_ratings = []
imdb_ratings_standardized = []
metascores = []
votes = []

for page in pages:
  
   #get request for sci-fi
   response = get("https://www.imdb.com/search/title?genres=sci-fi&"
                  + "start="
                  + str(page)
                  + "&explore=title_type,genres&ref_=adv_prv", headers=headers)
  
   sleep(randint(8,15))
   
   #throw warning for status codes that are not 200
   if response.status_code != 200:
       warn('Request: {}; Status code: {}'.format(requests, response.status_code))

   #parse the content of current iteration of request
   page_html = BeautifulSoup(response.text, 'html.parser')
      
   movie_containers = page_html.find_all('div', class_ = 'lister-item mode-advanced')
  
   #extract the 50 movies for that page
   for container in movie_containers:

       #conditional for all with metascore
       if container.find('div', class_ = 'ratings-metascore') is not None:

           #title
           title = container.h3.a.text
           titles.append(title)

           if container.h3.find('span', class_= 'lister-item-year text-muted unbold') is not None:
            
             #year released
             year = container.h3.find('span', class_= 'lister-item-year text-muted unbold').text # remove the parentheses around the year and make it an integer
             years.append(year)

           else:
             years.append(None) # each of the additional if clauses are to handle type None data, replacing it with an empty string so the arrays are of the same length at the end of the scraping

           if container.p.find('span', class_ = 'certificate') is not None:
            
             #rating
             rating = container.p.find('span', class_= 'certificate').text
             ratings.append(rating)

           else:
             ratings.append("")

           if container.p.find('span', class_ = 'genre') is not None:
            
             #genre
             genre = container.p.find('span', class_ = 'genre').text.replace("\n", "").rstrip().split(',') # remove the whitespace character, strip, and split to create an array of genres
             genres.append(genre)
          
           else:
             genres.append("")

           if container.p.find('span', class_ = 'runtime') is not None:

             #runtime
             time = int(container.p.find('span', class_ = 'runtime').text.replace(" min", "")) # remove the minute word from the runtime and make it an integer
             runtimes.append(time)

           else:
             runtimes.append(None)

           if float(container.strong.text) is not None:

             #IMDB ratings
             imdb = float(container.strong.text) # non-standardized variable
             imdb_ratings.append(imdb)

           else:
             imdb_ratings.append(None)

           if container.find('span', class_ = 'metascore').text is not None:

             #Metascore
             m_score = int(container.find('span', class_ = 'metascore').text) # make it an integer
             metascores.append(m_score)

           else:
             metascores.append(None)

           if container.find('span', attrs = {'name':'nv'})['data-value'] is not None:

             #Number of votes
             vote = int(container.find('span', attrs = {'name':'nv'})['data-value'])
             votes.append(vote)

           else:
               votes.append(None)

           else:
               votes.append(None)

Os dataframes do Pandas recebem matrizes de dados de entrada para cada uma de suas colunas em pares chave:valor. Fiz algumas etapas extras de limpeza de dados aqui para finalizar a limpeza de dados.

Depois de executar a célula a seguir, você deve ter um dataframe com os dados coletados.

sci_fi_df = pd.DataFrame({'movie': titles,
                      'year': years,
                      'rating': ratings,
                      'genre': genres,
                      'runtime_min': runtimes,
                      'imdb': imdb_ratings,
                      'metascore': metascores,
                      'votes': votes}
                      )

sci_fi_df.loc[:, 'year'] = sci_fi_df['year'].str[-5:-1] # two more data transformations after scraping
# Drop 'ovie' bug
# Make year an int
sci_fi_df['n_imdb'] = sci_fi_df['imdb'] * 10
final_df = sci_fi_df.loc[sci_fi_df['year'] != 'ovie'] # One small issue with the scrape on these two movies so just dropping those ones.
final_df.loc[:, 'year'] = pd.to_numeric(final_df['year'])

Análise exploratória de dados

Agora que você tem os dados, uma das primeiras coisas que você pode querer fazer é aprender mais sobre eles em alto nível. Os comandos a seguir são uma primeira olhada útil em qualquer dado e nós os usaremos a seguir:

final_df.head()

Este comando mostra as primeiras 5 linhas do seu dataframe. Isso ajuda você a ver que nada parece estranho e tudo está pronto para análise. Você pode ver a saída aqui:

TCYKlpEKIJOVJIAtIGN4wzDhCySaYIXI9cyBizZxR3XHsAQO_YH9mh626hCq8fdItaAF0N0cxSs1PP1eYujRsOt8HgeXtcC3hff-y0Jl4tvN__itH97iXqb6DrN6wJrngdsNaKQTQag5StHfOIcyA0

As primeiras cinco linhas de dados geradas usando o final_df.head()comando

final_df.describe()

Este comando fornecerá a média, desvio padrão e outros resumos. Count pode mostrar se há algum valor nulo em algumas das colunas, o que é uma informação útil para saber. A coluna do ano, por exemplo, mostra a gama de filmes raspados – de 1927 a 2022.

Você pode ver a saída abaixo e inspecionar as outras:

Zeo_Y8ipyIejyYIBa2Aaocz4obHNlMVU76YTylZGl_wpRovYVFNS4e0m1DYAwkcqhpoYikJFL_dSgZSH-qoghJM3VMXESMUykrfs1e3JuXRkrp9iEZhPPnqGvsSamdYQe6Noz0Q0OA-Wen616-pmbDQ

A execução final_df.describe()produz estatísticas resumidas que mostram o número de pontos de dados, médias, desvios padrão e muito mais.

final_df.info()

Este comando permite que você conheça os tipos de dados com os quais está trabalhando em cada uma de suas colunas.

Como cientista de dados, essas informações podem ser úteis para você. Certas funções e métodos precisam de certos tipos de dados. Você também pode garantir que seus tipos de dados subjacentes estejam em um formato que faça sentido para o que são.

Por exemplo: uma classificação de 5 estrelas deve ser float ou int (se decimais não forem permitidos). Não deve ser uma string, pois é um número. Aqui está um resumo de qual era o formato de dados para cada variável após a raspagem:

PT7Fa9XFYErtorVw6bNxw7Q1mI-p2_hlKgTbTs90RRpALPDlqd95F_EOwCQ7cV2cDymqZ-mXIa_0blqxxJ5wZ8Bznzd0iFyTB6kFroIUK2DJNzfRZgwgsRHr0pjDyE1ZURQILf-22w856Oouf

A execução final_df.info()resulta em mostrar quantos valores você tem em cada coluna e quais são seus tipos de dados.

O próximo comando para saber mais sobre suas variáveis ​​produz um mapa de calor. O mapa de calor mostra a correlação entre todas as suas variáveis ​​quantitativas. Esta é uma maneira rápida de avaliar as relações que podem existir entre as variáveis. Eu gosto de ver os coeficientes ao invés de tentar decifrar o código de cores, então eu uso o annot=Trueargumento.

sns.heatmap(final_df.corr(), annot=True);

O comando acima produz a seguinte visualização usando o pacote de visualização de dados Seaborn:

niHLKP7bps1EpZ_39u5k3dPDF0Xuz8Zuhal8Bbc8wtImKUv50M_7fEH65rCAkrTglGtZTJpZ2sRfIE0E6Kjn9m_CYGkRct83_3wWzVp0rnHA8nh5UuveFO0OqtjVfoOzMsKGq0lZ2uxw66Lp

Um mapa de calor de correlações após a execuçãosns.heatmap(final_df.corr(), annot=True);

Você pode ver que a correlação mais forte é entre a pontuação do IMDB e o metascore. Isso não é surpreendente, pois é provável que dois sistemas de classificação de filmes tenham uma classificação semelhante.

A próxima correlação mais forte que você pode ver é entre a classificação do IMDB e o número de votos. Isso é interessante porque, à medida que o número de votos aumenta, você tem uma amostra mais representativa da classificação da população. É estranho ver que há uma associação fraca entre os dois, no entanto.

O número de votos aumenta aproximadamente à medida que o tempo de execução também aumenta.

Você também pode ver uma ligeira associação negativa entre IMDB ou metascore e o ano em que o filme foi lançado. Veremos isso em breve.

Você pode conferir algumas dessas relações visualmente por meio de um gráfico de dispersão com este código:

x = final_df['n_imdb']
y = final_df['votes']
plt.scatter(x, y, alpha=0.5) # s= is size var, c= is color var
plt.xlabel("IMDB Rating Standardized")
plt.ylabel("Number of Votes")
plt.title("Number of Votes vs. IMDB Rating")
plt.ticklabel_format(style='plain')
plt.show()

Isso resulta nesta visualização:

vvqxh5VwbHPoypyGlNBstgZW8puVWKa5m_hl6MYB_r78OfRC7TWBx9jxjf8PFflJO93hq83ZdIqX97uq6C_WjlZV5jorCDgtU3U3_dESuUgsStfLEgkeiikHTq2noabW_tPJQRRGpFrVmQ90gja4xAo

Classificações do IMDB versus o número de votos

A associação acima mostra alguns outliers. Geralmente, vemos um número maior de votos em filmes com classificação IMDB de 85 ou mais. Há menos comentários sobre filmes com uma classificação de 75 ou menos.

Desenhar essas caixas ao redor dos dados pode mostrar o que quero dizer. Há aproximadamente dois agrupamentos de magnitudes diferentes:

QEUbjZrtSiLCbdcXIR1MN0MKvcCZgVxeW2sPzMo4KL36pjCQq87rkRdgKKwK2yWSh2Uz0HMoIckyOa0qcNX4hCQok_kuuyqq4PddFHVuC5Tzyg9-WdZobdZgWfOpW1PnKWFKfQLaDAEDXoDHfiuU5mY

Dois grupos principais nos dados

Outra coisa que pode ser interessante ver é quantos filmes de cada classificação existem. Isso pode mostrar onde o Sci-Fi tende a pousar nos dados de classificação. Use este código para obter um gráfico de barras das classificações:

ax = final_df['rating'].value_counts().plot(kind='bar',
                                   figsize=(14,8),
                                   title="Number of Movies by Rating")
ax.set_xlabel("Rating")
ax.set_ylabel("Number of Movies")
ax.plot();

Esse código resulta neste gráfico que nos mostra que R e PG-13 compõem a maioria desses filmes de ficção científica no IMDB.

7896rs2HtqgI4nIPyI-vUU5w43C3_Dcuyc_DdjUOudq76aIHstBINNVf5e0-1G3MUZzFgKDzK_2Jhsnno5swbXIoZwMuxqg1icY8aPbxWjOSCIm3BB9lObzY7HiDSAhmLTfcpfi2HWdW4VoUjB9lObzY7HiDSAhmLTfcpfi2HWdW4VoUj

Número de filmes por classificação

Eu vi que havia alguns filmes classificados como “Aprovados” e fiquei curioso sobre o que era. Você pode filtrar o dataframe com este código para detalhar isso:

final_df[final_df['rating'] == 'Approved']

Isso revelou que a maioria desses filmes foi feita antes dos anos 80:

OIxMNDTgcXcPo_Wy8N7miq44OOAai4o-A8upYa1pNbqWjDVzPduRxNcMgUPuG9-OFyNd1AFgwWeq_o4E3Kv9pXy8xVSH7p6ZZi9uoOy78dBFK0LjvDnN9k7WYDTiZYxMowpVgCiqXokWLPuMo746jvMowpVgCiqXokWLPuMo746

Todos os filmes "Aprovados" com classificação

Fui ao site da MPAA e não havia menção a eles na página de informações de classificação. Deve ter sido descontinuado em algum momento.

Você também pode verificar se algum ano ou década superou outros em avaliações. Peguei o metascore médio por ano e tracei isso com o seguinte código para explorar mais:

# What are the average metascores by year?
final_df.groupby('year')['metascore'].mean().plot(kind='bar', figsize=(16,8), title="Avg. Metascore by Year", xlabel="Year", ylabel="Avg. Metascore")
plt.xticks(rotation=90)
plt.plot();

Isso resulta no gráfico a seguir:

BTwJBQhq0zBTr5UH5J3n7CSR6k3Ft8l9GBQ_czZRlu_LO192AXd0G_ozwXzsb6pctS-8lHCvgVLx6VZ7hWH-trp8C4oFAPCGufh2gq-F2WV96u90xt05KqUGYCqSFpmfXxPEsFKSZQceglNItwChRnfXxPEsFKSZQceglNItwChRnfXxPEsFKSZQceglNItw

Média Metascore por ano do filme

Agora, não estou dizendo que sei por que, mas há um declínio gradual e suave à medida que você progride na história na variável de metascore média. Parece que as classificações se estabilizaram em torno de 55-60 nas últimas duas décadas. Isso pode ser porque temos mais dados sobre filmes mais recentes ou filmes mais recentes tendem a ser mais revisados.

final_df['year'].value_counts().plot(kind='bar', figsize=[20,9])

Execute o código acima e você verá que o filme de 1927 teve apenas uma amostra de 1 revisão. Essa pontuação é então tendenciosa e super-inflada. Você verá também que os filmes mais recentes estão melhor representados nas resenhas, como eu suspeitava:

d2C-t1DLqSjRY8DpeoudyBNHG4SevXCZXFK4xoaw3QHpj_j4qnEf479Tn7wNyBqOwKAzR5GVidaRZ79XB5Eo36msA8LRBxNaJu_9Xk1VKE5oeo2Pue1TLnbjMX3y48Gc5xfOBnlZ1x9rdTktI_N2Gc5xfOBnlZ1x9rdTktI_N2

Número de filmes por ano

Ideias de projetos de ciência de dados para levar isso adiante

Você tem variáveis ​​textuais, categóricas e numéricas aqui. Existem algumas opções que você pode tentar explorar mais.

Uma coisa que você pode fazer é usar o Natural Language Process (NLP) para ver se existem convenções de nomenclatura para classificações de filmes, ou dentro do mundo da ficção científica (ou se você escolheu fazer um gênero diferente, seja qual for o gênero escolhido!) .

Você pode alterar o código de raspagem da web para atrair muitos outros gêneros também. Com isso, você pode criar um novo banco de dados entre gêneros para ver se existem convenções de nomenclatura por gênero.

Você poderia então tentar prever o gênero com base no nome do filme. Você também pode tentar prever a classificação do IMDB com base no gênero ou ano em que o filme foi lançado. A última ideia funcionaria melhor nas últimas décadas, já que a maioria das observações está lá.

Espero que este tutorial tenha despertado a curiosidade em você sobre o mundo da ciência de dados e o que é possível!

Você descobrirá na análise exploratória de dados que sempre há mais perguntas a serem feitas. Trabalhar com essa restrição é priorizar com base na(s) meta(s) de negócios. É importante começar com esses objetivos de antemão ou você pode estar nas ervas daninhas de dados explorando para sempre.

Se o campo da ciência de dados é interessante para você e você deseja expandir seu conjunto de habilidades e entrar nele profissionalmente, considere conferir a trilha de carreira em ciência de dados da Springboard . Neste curso, o Springboard orienta você em todos os principais conceitos em profundidade com um mentor especialista 1:1 emparelhado com você para apoiá-lo em sua jornada.

Escrevi outros artigos que enquadram projetos de ciência de dados em relação a problemas de negócios e abordam abordagens técnicas para resolvê-los. Confira se tiver interesse!

Boa codificação!

Fonte: https://www.freecodecamp.org/news/web-scraping-sci-fi-movies-from-imdb-with-python/

 #python 

What is GEEK

Buddha Community

Web Scraping Em Python – Raspar Filmes De Ficção Científica Do IMDB
Sival Alethea

Sival Alethea

1624402800

Beautiful Soup Tutorial - Web Scraping in Python

The Beautiful Soup module is used for web scraping in Python. Learn how to use the Beautiful Soup and Requests modules in this tutorial. After watching, you will be able to start scraping the web on your own.
📺 The video in this post was made by freeCodeCamp.org
The origin of the article: https://www.youtube.com/watch?v=87Gx3U0BDlo&list=PLWKjhJtqVAbnqBxcdjVGgT3uVR10bzTEB&index=12
🔥 If you’re a beginner. I believe the article below will be useful to you ☞ What You Should Know Before Investing in Cryptocurrency - For Beginner
⭐ ⭐ ⭐The project is of interest to the community. Join to Get free ‘GEEK coin’ (GEEKCASH coin)!
☞ **-----CLICK HERE-----**⭐ ⭐ ⭐
Thanks for visiting and watching! Please don’t forget to leave a like, comment and share!

#web scraping #python #beautiful soup #beautiful soup tutorial #web scraping in python #beautiful soup tutorial - web scraping in python

How POST Requests with Python Make Web Scraping Easier

When scraping a website with Python, it’s common to use the

urllibor theRequestslibraries to sendGETrequests to the server in order to receive its information.

However, you’ll eventually need to send some information to the website yourself before receiving the data you want, maybe because it’s necessary to perform a log-in or to interact somehow with the page.

To execute such interactions, Selenium is a frequently used tool. However, it also comes with some downsides as it’s a bit slow and can also be quite unstable sometimes. The alternative is to send a

POSTrequest containing the information the website needs using the request library.

In fact, when compared to Requests, Selenium becomes a very slow approach since it does the entire work of actually opening your browser to navigate through the websites you’ll collect data from. Of course, depending on the problem, you’ll eventually need to use it, but for some other situations, a

POSTrequest may be your best option, which makes it an important tool for your web scraping toolbox.

In this article, we’ll see a brief introduction to the

POSTmethod and how it can be implemented to improve your web scraping routines.

#python #web-scraping #requests #web-scraping-with-python #data-science #data-collection #python-tutorials #data-scraping

Web Scraping Em Python – Raspar Filmes De Ficção Científica Do IMDB

Você já se esforçou para encontrar um conjunto de dados para seu projeto de ciência de dados? Se você é como eu sou, a resposta é sim.

Felizmente, existem muitos conjuntos de dados gratuitos disponíveis – mas às vezes você quer algo mais específico ou sob medida. Para isso, o web scraping é uma boa habilidade para ter em sua caixa de ferramentas para extrair dados do seu site favorito.

O que é abordado neste artigo?

Este artigo tem um script Python que você pode usar para extrair os dados de filmes de ficção científica (ou qualquer gênero que você escolher!) do site do IMDB . Ele pode então gravar esses dados em um dataframe para exploração adicional.

Vou concluir este artigo com um pouco de análise exploratória de dados (EDA). Com isso, você verá quais outros projetos de ciência de dados são possíveis para você experimentar.

Isenção de responsabilidade: embora o web scraping seja uma ótima maneira de extrair dados programaticamente de sites, faça-o com responsabilidade. Meu script usa a função sleep, por exemplo, para desacelerar intencionalmente os pull requests, para não sobrecarregar os servidores do IMDB. Alguns sites desaprovam o uso de raspadores da web, portanto, use-os com sabedoria.

Script de Web Scraping e Limpeza de Dados

Vamos ao script de raspagem e executá-lo. O roteiro traz títulos de filmes, anos, classificações (PG-13, R e assim por diante), gêneros, tempos de execução, resenhas e votos para cada filme. Você pode escolher quantas páginas deseja extrair com base em suas necessidades de dados.

Nota: levará mais tempo quanto mais páginas você selecionar. Leva 40 minutos para raspar 200 páginas da Web usando o Google Colab Notebook .

Para aqueles que ainda não experimentaram, o Google Colab é uma ferramenta de desenvolvimento Python estilo Jupyter Notebook baseada em nuvem que reside no pacote de aplicativos do Google. Você pode usá-lo imediatamente com muitos dos pacotes já instalados que são comuns em ciência de dados.

Abaixo está uma imagem do espaço de trabalho do Colab e seu layout:

R9sAuHzGHrEvRK_hiAWsy4W41W72et6clD38gIYeAA6AtA32e97xxw0W5ub_96xmgSMTDB2VjRK-gz_YgYtZoV1YyCHjKftaB7-HD2NQ7qt_8hcdnDfqaibp0ONwPr9-4zO5gv3FuXdxiOMsN6eF8bA

Apresentando a interface do usuário do Google Colab

Com isso, vamos mergulhar! Primeiramente, você deve sempre importar seus pacotes como sua própria célula. Se você esquecer um pacote, poderá executar novamente apenas essa célula. Isso reduz o tempo de desenvolvimento.

Nota: alguns desses pacotes precisam pip install package_nameser executados para instalá-los primeiro. Se você optar por executar o código localmente usando algo como um Jupyter Notebook, precisará fazer isso. Se você quiser começar a trabalhar rapidamente, pode usar o bloco de anotações do Google Colab. Isso tem tudo isso instalado por padrão.

from requests import get
from bs4 import BeautifulSoup
from warnings import warn
from time import sleep
from random import randint
import numpy as np, pandas as pd
import seaborn as sns

Como fazer o Web Scraping

Você pode executar o código a seguir que faz a raspagem da web real. Ele puxará todas as colunas mencionadas acima em matrizes e as preencherá um filme por vez, uma página por vez.

Há também algumas etapas de limpeza de dados que adicionei e documentei neste código. Eu removi os parênteses dos dados da string mencionando o ano do filme, por exemplo. Eu então converti aqueles para números inteiros. Coisas como essa facilitam a análise e a modelagem de dados exploratórios.

Observe que eu uso a função sleep para evitar ser restringido pelo IMDB quando se trata de percorrer suas páginas da web muito rapidamente.

# Note this takes about 40 min to run if np.arange is set to 9951 as the stopping point.

pages = np.arange(1, 9951, 50) # Last time I tried, I could only go to 10000 items because after that the URI has no discernable pattern to combat webcrawlers; I just did 4 pages for demonstration purposes. You can increase this for your own projects.
headers = {'Accept-Language': 'en-US,en;q=0.8'} # If this is not specified, the default language is Mandarin

#initialize empty lists to store the variables scraped
titles = []
years = []
ratings = []
genres = []
runtimes = []
imdb_ratings = []
imdb_ratings_standardized = []
metascores = []
votes = []

for page in pages:
  
   #get request for sci-fi
   response = get("https://www.imdb.com/search/title?genres=sci-fi&"
                  + "start="
                  + str(page)
                  + "&explore=title_type,genres&ref_=adv_prv", headers=headers)
  
   sleep(randint(8,15))
   
   #throw warning for status codes that are not 200
   if response.status_code != 200:
       warn('Request: {}; Status code: {}'.format(requests, response.status_code))

   #parse the content of current iteration of request
   page_html = BeautifulSoup(response.text, 'html.parser')
      
   movie_containers = page_html.find_all('div', class_ = 'lister-item mode-advanced')
  
   #extract the 50 movies for that page
   for container in movie_containers:

       #conditional for all with metascore
       if container.find('div', class_ = 'ratings-metascore') is not None:

           #title
           title = container.h3.a.text
           titles.append(title)

           if container.h3.find('span', class_= 'lister-item-year text-muted unbold') is not None:
            
             #year released
             year = container.h3.find('span', class_= 'lister-item-year text-muted unbold').text # remove the parentheses around the year and make it an integer
             years.append(year)

           else:
             years.append(None) # each of the additional if clauses are to handle type None data, replacing it with an empty string so the arrays are of the same length at the end of the scraping

           if container.p.find('span', class_ = 'certificate') is not None:
            
             #rating
             rating = container.p.find('span', class_= 'certificate').text
             ratings.append(rating)

           else:
             ratings.append("")

           if container.p.find('span', class_ = 'genre') is not None:
            
             #genre
             genre = container.p.find('span', class_ = 'genre').text.replace("\n", "").rstrip().split(',') # remove the whitespace character, strip, and split to create an array of genres
             genres.append(genre)
          
           else:
             genres.append("")

           if container.p.find('span', class_ = 'runtime') is not None:

             #runtime
             time = int(container.p.find('span', class_ = 'runtime').text.replace(" min", "")) # remove the minute word from the runtime and make it an integer
             runtimes.append(time)

           else:
             runtimes.append(None)

           if float(container.strong.text) is not None:

             #IMDB ratings
             imdb = float(container.strong.text) # non-standardized variable
             imdb_ratings.append(imdb)

           else:
             imdb_ratings.append(None)

           if container.find('span', class_ = 'metascore').text is not None:

             #Metascore
             m_score = int(container.find('span', class_ = 'metascore').text) # make it an integer
             metascores.append(m_score)

           else:
             metascores.append(None)

           if container.find('span', attrs = {'name':'nv'})['data-value'] is not None:

             #Number of votes
             vote = int(container.find('span', attrs = {'name':'nv'})['data-value'])
             votes.append(vote)

           else:
               votes.append(None)

           else:
               votes.append(None)

Os dataframes do Pandas recebem matrizes de dados de entrada para cada uma de suas colunas em pares chave:valor. Fiz algumas etapas extras de limpeza de dados aqui para finalizar a limpeza de dados.

Depois de executar a célula a seguir, você deve ter um dataframe com os dados coletados.

sci_fi_df = pd.DataFrame({'movie': titles,
                      'year': years,
                      'rating': ratings,
                      'genre': genres,
                      'runtime_min': runtimes,
                      'imdb': imdb_ratings,
                      'metascore': metascores,
                      'votes': votes}
                      )

sci_fi_df.loc[:, 'year'] = sci_fi_df['year'].str[-5:-1] # two more data transformations after scraping
# Drop 'ovie' bug
# Make year an int
sci_fi_df['n_imdb'] = sci_fi_df['imdb'] * 10
final_df = sci_fi_df.loc[sci_fi_df['year'] != 'ovie'] # One small issue with the scrape on these two movies so just dropping those ones.
final_df.loc[:, 'year'] = pd.to_numeric(final_df['year'])

Análise exploratória de dados

Agora que você tem os dados, uma das primeiras coisas que você pode querer fazer é aprender mais sobre eles em alto nível. Os comandos a seguir são uma primeira olhada útil em qualquer dado e nós os usaremos a seguir:

final_df.head()

Este comando mostra as primeiras 5 linhas do seu dataframe. Isso ajuda você a ver que nada parece estranho e tudo está pronto para análise. Você pode ver a saída aqui:

TCYKlpEKIJOVJIAtIGN4wzDhCySaYIXI9cyBizZxR3XHsAQO_YH9mh626hCq8fdItaAF0N0cxSs1PP1eYujRsOt8HgeXtcC3hff-y0Jl4tvN__itH97iXqb6DrN6wJrngdsNaKQTQag5StHfOIcyA0

As primeiras cinco linhas de dados geradas usando o final_df.head()comando

final_df.describe()

Este comando fornecerá a média, desvio padrão e outros resumos. Count pode mostrar se há algum valor nulo em algumas das colunas, o que é uma informação útil para saber. A coluna do ano, por exemplo, mostra a gama de filmes raspados – de 1927 a 2022.

Você pode ver a saída abaixo e inspecionar as outras:

Zeo_Y8ipyIejyYIBa2Aaocz4obHNlMVU76YTylZGl_wpRovYVFNS4e0m1DYAwkcqhpoYikJFL_dSgZSH-qoghJM3VMXESMUykrfs1e3JuXRkrp9iEZhPPnqGvsSamdYQe6Noz0Q0OA-Wen616-pmbDQ

A execução final_df.describe()produz estatísticas resumidas que mostram o número de pontos de dados, médias, desvios padrão e muito mais.

final_df.info()

Este comando permite que você conheça os tipos de dados com os quais está trabalhando em cada uma de suas colunas.

Como cientista de dados, essas informações podem ser úteis para você. Certas funções e métodos precisam de certos tipos de dados. Você também pode garantir que seus tipos de dados subjacentes estejam em um formato que faça sentido para o que são.

Por exemplo: uma classificação de 5 estrelas deve ser float ou int (se decimais não forem permitidos). Não deve ser uma string, pois é um número. Aqui está um resumo de qual era o formato de dados para cada variável após a raspagem:

PT7Fa9XFYErtorVw6bNxw7Q1mI-p2_hlKgTbTs90RRpALPDlqd95F_EOwCQ7cV2cDymqZ-mXIa_0blqxxJ5wZ8Bznzd0iFyTB6kFroIUK2DJNzfRZgwgsRHr0pjDyE1ZURQILf-22w856Oouf

A execução final_df.info()resulta em mostrar quantos valores você tem em cada coluna e quais são seus tipos de dados.

O próximo comando para saber mais sobre suas variáveis ​​produz um mapa de calor. O mapa de calor mostra a correlação entre todas as suas variáveis ​​quantitativas. Esta é uma maneira rápida de avaliar as relações que podem existir entre as variáveis. Eu gosto de ver os coeficientes ao invés de tentar decifrar o código de cores, então eu uso o annot=Trueargumento.

sns.heatmap(final_df.corr(), annot=True);

O comando acima produz a seguinte visualização usando o pacote de visualização de dados Seaborn:

niHLKP7bps1EpZ_39u5k3dPDF0Xuz8Zuhal8Bbc8wtImKUv50M_7fEH65rCAkrTglGtZTJpZ2sRfIE0E6Kjn9m_CYGkRct83_3wWzVp0rnHA8nh5UuveFO0OqtjVfoOzMsKGq0lZ2uxw66Lp

Um mapa de calor de correlações após a execuçãosns.heatmap(final_df.corr(), annot=True);

Você pode ver que a correlação mais forte é entre a pontuação do IMDB e o metascore. Isso não é surpreendente, pois é provável que dois sistemas de classificação de filmes tenham uma classificação semelhante.

A próxima correlação mais forte que você pode ver é entre a classificação do IMDB e o número de votos. Isso é interessante porque, à medida que o número de votos aumenta, você tem uma amostra mais representativa da classificação da população. É estranho ver que há uma associação fraca entre os dois, no entanto.

O número de votos aumenta aproximadamente à medida que o tempo de execução também aumenta.

Você também pode ver uma ligeira associação negativa entre IMDB ou metascore e o ano em que o filme foi lançado. Veremos isso em breve.

Você pode conferir algumas dessas relações visualmente por meio de um gráfico de dispersão com este código:

x = final_df['n_imdb']
y = final_df['votes']
plt.scatter(x, y, alpha=0.5) # s= is size var, c= is color var
plt.xlabel("IMDB Rating Standardized")
plt.ylabel("Number of Votes")
plt.title("Number of Votes vs. IMDB Rating")
plt.ticklabel_format(style='plain')
plt.show()

Isso resulta nesta visualização:

vvqxh5VwbHPoypyGlNBstgZW8puVWKa5m_hl6MYB_r78OfRC7TWBx9jxjf8PFflJO93hq83ZdIqX97uq6C_WjlZV5jorCDgtU3U3_dESuUgsStfLEgkeiikHTq2noabW_tPJQRRGpFrVmQ90gja4xAo

Classificações do IMDB versus o número de votos

A associação acima mostra alguns outliers. Geralmente, vemos um número maior de votos em filmes com classificação IMDB de 85 ou mais. Há menos comentários sobre filmes com uma classificação de 75 ou menos.

Desenhar essas caixas ao redor dos dados pode mostrar o que quero dizer. Há aproximadamente dois agrupamentos de magnitudes diferentes:

QEUbjZrtSiLCbdcXIR1MN0MKvcCZgVxeW2sPzMo4KL36pjCQq87rkRdgKKwK2yWSh2Uz0HMoIckyOa0qcNX4hCQok_kuuyqq4PddFHVuC5Tzyg9-WdZobdZgWfOpW1PnKWFKfQLaDAEDXoDHfiuU5mY

Dois grupos principais nos dados

Outra coisa que pode ser interessante ver é quantos filmes de cada classificação existem. Isso pode mostrar onde o Sci-Fi tende a pousar nos dados de classificação. Use este código para obter um gráfico de barras das classificações:

ax = final_df['rating'].value_counts().plot(kind='bar',
                                   figsize=(14,8),
                                   title="Number of Movies by Rating")
ax.set_xlabel("Rating")
ax.set_ylabel("Number of Movies")
ax.plot();

Esse código resulta neste gráfico que nos mostra que R e PG-13 compõem a maioria desses filmes de ficção científica no IMDB.

7896rs2HtqgI4nIPyI-vUU5w43C3_Dcuyc_DdjUOudq76aIHstBINNVf5e0-1G3MUZzFgKDzK_2Jhsnno5swbXIoZwMuxqg1icY8aPbxWjOSCIm3BB9lObzY7HiDSAhmLTfcpfi2HWdW4VoUjB9lObzY7HiDSAhmLTfcpfi2HWdW4VoUj

Número de filmes por classificação

Eu vi que havia alguns filmes classificados como “Aprovados” e fiquei curioso sobre o que era. Você pode filtrar o dataframe com este código para detalhar isso:

final_df[final_df['rating'] == 'Approved']

Isso revelou que a maioria desses filmes foi feita antes dos anos 80:

OIxMNDTgcXcPo_Wy8N7miq44OOAai4o-A8upYa1pNbqWjDVzPduRxNcMgUPuG9-OFyNd1AFgwWeq_o4E3Kv9pXy8xVSH7p6ZZi9uoOy78dBFK0LjvDnN9k7WYDTiZYxMowpVgCiqXokWLPuMo746jvMowpVgCiqXokWLPuMo746

Todos os filmes "Aprovados" com classificação

Fui ao site da MPAA e não havia menção a eles na página de informações de classificação. Deve ter sido descontinuado em algum momento.

Você também pode verificar se algum ano ou década superou outros em avaliações. Peguei o metascore médio por ano e tracei isso com o seguinte código para explorar mais:

# What are the average metascores by year?
final_df.groupby('year')['metascore'].mean().plot(kind='bar', figsize=(16,8), title="Avg. Metascore by Year", xlabel="Year", ylabel="Avg. Metascore")
plt.xticks(rotation=90)
plt.plot();

Isso resulta no gráfico a seguir:

BTwJBQhq0zBTr5UH5J3n7CSR6k3Ft8l9GBQ_czZRlu_LO192AXd0G_ozwXzsb6pctS-8lHCvgVLx6VZ7hWH-trp8C4oFAPCGufh2gq-F2WV96u90xt05KqUGYCqSFpmfXxPEsFKSZQceglNItwChRnfXxPEsFKSZQceglNItwChRnfXxPEsFKSZQceglNItw

Média Metascore por ano do filme

Agora, não estou dizendo que sei por que, mas há um declínio gradual e suave à medida que você progride na história na variável de metascore média. Parece que as classificações se estabilizaram em torno de 55-60 nas últimas duas décadas. Isso pode ser porque temos mais dados sobre filmes mais recentes ou filmes mais recentes tendem a ser mais revisados.

final_df['year'].value_counts().plot(kind='bar', figsize=[20,9])

Execute o código acima e você verá que o filme de 1927 teve apenas uma amostra de 1 revisão. Essa pontuação é então tendenciosa e super-inflada. Você verá também que os filmes mais recentes estão melhor representados nas resenhas, como eu suspeitava:

d2C-t1DLqSjRY8DpeoudyBNHG4SevXCZXFK4xoaw3QHpj_j4qnEf479Tn7wNyBqOwKAzR5GVidaRZ79XB5Eo36msA8LRBxNaJu_9Xk1VKE5oeo2Pue1TLnbjMX3y48Gc5xfOBnlZ1x9rdTktI_N2Gc5xfOBnlZ1x9rdTktI_N2

Número de filmes por ano

Ideias de projetos de ciência de dados para levar isso adiante

Você tem variáveis ​​textuais, categóricas e numéricas aqui. Existem algumas opções que você pode tentar explorar mais.

Uma coisa que você pode fazer é usar o Natural Language Process (NLP) para ver se existem convenções de nomenclatura para classificações de filmes, ou dentro do mundo da ficção científica (ou se você escolheu fazer um gênero diferente, seja qual for o gênero escolhido!) .

Você pode alterar o código de raspagem da web para atrair muitos outros gêneros também. Com isso, você pode criar um novo banco de dados entre gêneros para ver se existem convenções de nomenclatura por gênero.

Você poderia então tentar prever o gênero com base no nome do filme. Você também pode tentar prever a classificação do IMDB com base no gênero ou ano em que o filme foi lançado. A última ideia funcionaria melhor nas últimas décadas, já que a maioria das observações está lá.

Espero que este tutorial tenha despertado a curiosidade em você sobre o mundo da ciência de dados e o que é possível!

Você descobrirá na análise exploratória de dados que sempre há mais perguntas a serem feitas. Trabalhar com essa restrição é priorizar com base na(s) meta(s) de negócios. É importante começar com esses objetivos de antemão ou você pode estar nas ervas daninhas de dados explorando para sempre.

Se o campo da ciência de dados é interessante para você e você deseja expandir seu conjunto de habilidades e entrar nele profissionalmente, considere conferir a trilha de carreira em ciência de dados da Springboard . Neste curso, o Springboard orienta você em todos os principais conceitos em profundidade com um mentor especialista 1:1 emparelhado com você para apoiá-lo em sua jornada.

Escrevi outros artigos que enquadram projetos de ciência de dados em relação a problemas de negócios e abordam abordagens técnicas para resolvê-los. Confira se tiver interesse!

Boa codificação!

Fonte: https://www.freecodecamp.org/news/web-scraping-sci-fi-movies-from-imdb-with-python/

 #python 

Shardul Bhatt

Shardul Bhatt

1626775355

Why use Python for Software Development

No programming language is pretty much as diverse as Python. It enables building cutting edge applications effortlessly. Developers are as yet investigating the full capability of end-to-end Python development services in various areas. 

By areas, we mean FinTech, HealthTech, InsureTech, Cybersecurity, and that's just the beginning. These are New Economy areas, and Python has the ability to serve every one of them. The vast majority of them require massive computational abilities. Python's code is dynamic and powerful - equipped for taking care of the heavy traffic and substantial algorithmic capacities. 

Programming advancement is multidimensional today. Endeavor programming requires an intelligent application with AI and ML capacities. Shopper based applications require information examination to convey a superior client experience. Netflix, Trello, and Amazon are genuine instances of such applications. Python assists with building them effortlessly. 

5 Reasons to Utilize Python for Programming Web Apps 

Python can do such numerous things that developers can't discover enough reasons to admire it. Python application development isn't restricted to web and enterprise applications. It is exceptionally adaptable and superb for a wide range of uses.

Robust frameworks 

Python is known for its tools and frameworks. There's a structure for everything. Django is helpful for building web applications, venture applications, logical applications, and mathematical processing. Flask is another web improvement framework with no conditions. 

Web2Py, CherryPy, and Falcon offer incredible capabilities to customize Python development services. A large portion of them are open-source frameworks that allow quick turn of events. 

Simple to read and compose 

Python has an improved sentence structure - one that is like the English language. New engineers for Python can undoubtedly understand where they stand in the development process. The simplicity of composing allows quick application building. 

The motivation behind building Python, as said by its maker Guido Van Rossum, was to empower even beginner engineers to comprehend the programming language. The simple coding likewise permits developers to roll out speedy improvements without getting confused by pointless subtleties. 

Utilized by the best 

Alright - Python isn't simply one more programming language. It should have something, which is the reason the business giants use it. Furthermore, that too for different purposes. Developers at Google use Python to assemble framework organization systems, parallel information pusher, code audit, testing and QA, and substantially more. Netflix utilizes Python web development services for its recommendation algorithm and media player. 

Massive community support 

Python has a steadily developing community that offers enormous help. From amateurs to specialists, there's everybody. There are a lot of instructional exercises, documentation, and guides accessible for Python web development solutions. 

Today, numerous universities start with Python, adding to the quantity of individuals in the community. Frequently, Python designers team up on various tasks and help each other with algorithmic, utilitarian, and application critical thinking. 

Progressive applications 

Python is the greatest supporter of data science, Machine Learning, and Artificial Intelligence at any enterprise software development company. Its utilization cases in cutting edge applications are the most compelling motivation for its prosperity. Python is the second most well known tool after R for data analytics.

The simplicity of getting sorted out, overseeing, and visualizing information through unique libraries makes it ideal for data based applications. TensorFlow for neural networks and OpenCV for computer vision are two of Python's most well known use cases for Machine learning applications.

Summary

Thinking about the advances in programming and innovation, Python is a YES for an assorted scope of utilizations. Game development, web application development services, GUI advancement, ML and AI improvement, Enterprise and customer applications - every one of them uses Python to its full potential. 

The disadvantages of Python web improvement arrangements are regularly disregarded by developers and organizations because of the advantages it gives. They focus on quality over speed and performance over blunders. That is the reason it's a good idea to utilize Python for building the applications of the future.

#python development services #python development company #python app development #python development #python in web development #python software development

Sarah Adina

1604646180

A Beginner's Guide to Web Scraping in Python

In this article, you’re going to learn the basics of web scraping in python and we’ll do a demo project to scrape quotes from a website.

What is web scraping?

Web scraping is extracting data from a website programmatically. Using web scraping you can extract the text in HTML tags, download images & files and almost do anything you do manually with copying and pasting but in a faster way.

Should you learn web scraping?

Yeah, absolutely as a programmer in many cases you might need to use the content found on other people’s websites but those website doesn’t give you API to that, that’s why you need to learn web scraping to be able to that.

#python #python-tutorials #web-scraping-with-python #python-programming #python-tips