A raspagem da Web é um dos melhores métodos de coleta de dados para coletar dados e criar conjuntos de dados personalizados sobre eles.

Ter conjuntos de dados de alta qualidade é essencial nesta era de tomada de decisão baseada em dados. Embora existam vários conjuntos de dados disponíveis publicamente, às vezes você pode precisar criar conjuntos de dados personalizados que atendam às suas necessidades específicas. A raspagem da Web permite extrair dados de sites. Você pode usar esses dados para criar seu conjunto de dados personalizado.

Visão geral dos métodos de coleta de dados

Existem diferentes métodos de coleta de dados. Eles incluem entrada manual de dados, APIs, conjuntos de dados públicos e web scraping. Cada método tem suas vantagens e limitações.

A entrada manual de dados é demorada e propensa a erros humanos, especialmente para coleta de dados em grande escala. No entanto, é útil para coleta de dados em pequena escala e quando os dados não estão disponíveis por outros meios.

As APIs permitem que os desenvolvedores acessem e recuperem dados de maneira estruturada. Eles geralmente fornecem informações em tempo real ou atualizadas regularmente. No entanto, o acesso à API pode ser limitado, exigir autenticação ou ter restrições de uso.

instagram viewer

Os conjuntos de dados públicos abrangem uma ampla gama de tópicos e domínios. Eles são pré-coletados e geralmente vêm em um formato estruturado, tornando-os facilmente acessíveis. Eles podem economizar tempo e esforço quando os dados necessários se alinham com os conjuntos de dados disponíveis. No entanto, eles podem nem sempre cobrir suas necessidades específicas ou estar atualizados.

A raspagem da Web fornece uma maneira de coletar dados de sites que não oferecem APIs ou têm acesso limitado. Ele permite personalização, escalabilidade e capacidade de coletar dados de várias fontes. No entanto, requer habilidades de programação, conhecimento da estrutura HTML e adesão às diretrizes legais e éticas.

Escolhendo Web Scraping para coleta de dados

A raspagem da Web permite extrair informações diretamente de páginas da Web, fornecendo acesso a uma ampla variedade de fontes de dados. Ele também oferece controle sobre quais dados extrair e como estruturá-los. Isso facilita a adaptação do processo de raspagem para atender aos seus requisitos específicos e extrair as informações precisas de que você precisa para o seu projeto.

Identificando a fonte de dados

O primeiro passo na raspagem da web é identificar a fonte de dados. Este é o site que contém os dados que você deseja raspar. Ao escolher a fonte de dados, certifique-se de alinhar com os termos de serviço da fonte. Este artigo usará o IMDb (Internet Movie Database) como fonte de dados.

Configurando seu ambiente

Configure um ambiente virtual. Em seguida, execute o seguinte comando para instalar as bibliotecas necessárias.

solicitações de instalação do pip beautifulsoup4 pandas

Você vai usar o solicitações de biblioteca para fazer solicitações HTTP. belasopa4 para analisar o conteúdo HTML e extrair dados de páginas da web. Finalmente, você usará pandas para manipular e analisar dados.

O código-fonte completo está disponível em um Repositório GitHub.

Escrevendo o script de raspagem da Web

Importe as bibliotecas instaladas em seu script para poder usar as funções que elas fornecem.

importar solicitações de
de bs4 importar Belasopa
importar tempo
importar pandas como pd
importar

O tempo e os módulos fazem parte da biblioteca padrão do Python. Portanto, não requer instalações separadas.

tempo adicionará atrasos ao processo de raspagem enquanto vai lidar com expressões regulares.

Você irá use Beautiful Soup para raspar o site de destino.

Crie uma função que enviará uma solicitação HTTP GET para sua URL de destino. Ele deve então recuperar o conteúdo da resposta e criar um Belasopa objeto do conteúdo HTML.

defobter_sopa(url, params=Nenhum, cabeçalhos=Nenhum):
resposta = request.get (url, params=params, headers=headers)
sopa = BeautifulSoup (resposta.conteúdo, "html.parser")
retornar sopa

O próximo passo é extrair as informações do Belasopa objeto.

Para extrair as informações, você precisa entender a estrutura do site de destino. Isso envolve a inspeção do código HTML do site. Isso ajudará você a identificar os elementos e atributos que contêm os dados que deseja extrair. Para inspecionar o site de destino, abra o link em um navegador da Web e navegue até a página da Web que contém os dados que você deseja coletar.

Em seguida, clique com o botão direito do mouse na página da Web e selecione Inspecionar no menu de contexto. Isso abrirá as ferramentas de desenvolvedor do navegador.

No código HTML da página da Web, procure elementos que contenham os dados que você deseja raspar. Preste atenção às tags HTML, classes e atributos associados aos dados de que você precisa. Você os usará para criar seletores para extrair os dados usando o BeautifulSoup. Na captura de tela acima, você pode ver que o título do filme está dentro do cabeçalho do item da lista aula. Inspecione cada recurso que deseja extrair.

Crie uma função que irá extrair informações do Belasopa objeto. Nesse caso, a função localiza o título, a classificação, a descrição, o gênero, a data de lançamento, os diretores e as estrelas do filme usando tags HTML e atributos de classe apropriados.

defextract_movie_data(filme):
titulo = filme.find("h3", turma_="cabeçalho do item da lista").encontrar("a").texto
avaliação = filme.find("div", turma_="avaliações-imdb-avaliação").strong.text
descrição = filme.find("div", turma_="lister-item-content").encontrar tudo("p")[1].text.strip()
gênero_elemento = filme.find("período", turma_="gênero")
genero = genero_elemento.text.strip() se genero_elemento outroNenhum
data_lançamento = filme.find("período", turma_="lister-item-year text-muted unbold").text.strip()
director_stars = movie.find("p", turma_="texto silenciado").encontrar tudo("a")
diretores = [pessoa.texto para pessoa em diretor_estrelas[:-1]]
estrelas = [pessoa.texto para pessoa em diretor_estrelas[-1:]]
dados_filme = {
"Título": título,
"Avaliação": avaliação,
"Descrição": descrição,
"Gênero": genero,
"Data de lançamento": data de lançamento,
"Diretores": diretores,
"Estrelas": estrelas
}
retornar movie_data

Por fim, crie uma função que fará a raspagem real usando as duas funções acima. Levará o ano e o número máximo de filmes que você deseja copiar.

defscrape_imdb_movies(ano, limite):
base_url = " https://www.imdb.com/search/title"
cabeçalhos = {"Aceitar-Idioma": "pt-BR, en; q=0,9"}
filmes = []
início = 1
enquanto len (filmes) < limite:
parâmetros = {
"data de lançamento": ano,
"organizar": "num_votos, desc",
"começar": começar
}
sopa = get_soup (base_url, params=params, headers=headers)
movie_list = sopa.find_all("div", turma_="modo lister-item-avançado")
se len (lista_de_filmes) == 0:
quebrar
para filme em movie_list:
movie_data = extract_movie_data (filme)
filmes.append (movie_data)
se len (filmes) >= limite:
quebrar
iniciar += 50# IMDb exibe 50 filmes por página
hora de dormir(1) # Adicione um atraso para evitar sobrecarregar o servidor
retornar filmes

Então ligue para o def scrape_imdb_movies para fazer a raspagem.

# Scrape 1000 filmes lançados em 2023 (ou quantos disponíveis)
filmes = scrape_imdb_movies(2023, 1000)

Agora você raspou os dados.

A próxima etapa é criar um conjunto de dados a partir desses dados.

Criando um conjunto de dados a partir dos dados extraídos

Crie um DataFrame usando Pandas a partir dos dados raspados.

df = pd. DataFrame (filmes)

Em seguida, faça o pré-processamento e a limpeza dos dados. Nesse caso, remova as linhas com valores ausentes. Em seguida, extraia o ano da data de lançamento e converta-o em numérico. Remova colunas desnecessárias. Converter o Avaliação coluna para numérico. Por fim, remova os caracteres não alfabéticos do Título coluna.

df = df.dropna()
df['Ano de lançamento'] = df['Data de lançamento'].str.extract(r'(\d{4})')
df['Ano de lançamento'] = pd.to_numeric (df['Ano de lançamento'],
erros='coagir').astype('Int64')
df = df.drop(['Data de lançamento'], eixo=1)
df['Avaliação'] = pd.to_numeric (df['Avaliação'], erros='coagir')
df['Título'] = df['Título'].aplicar(lambda x: re.sub(r'\W+', ' ', x))

Armazene os dados em um arquivo para uso posterior em seu projeto.

df.to_csv("imdb_movies_dataset.csv", índice=Falso)

Por fim, imprima as primeiras cinco linhas do seu conjunto de dados para ter uma visão de como fica.

df.head()

A saída é mostrada na captura de tela abaixo:

Agora você tem um conjunto de dados obtido por meio de web scraping.

Web Scraping usando outras bibliotecas Python

Beautiful Soup não é a única biblioteca Python que você pode usar para web scraping. Existem outras bibliotecas por aí. Cada um com suas próprias vantagens e limitações. Pesquise-os para descobrir qual deles se adapta melhor ao seu caso de uso.