Um tutorial do Semalt: raspagem da Web em Python

Visitei recentemente o KinoPoisk (versão russa do IMDB) e descobri que, ao longo dos anos, consegui classificar mais de 1000 filmes. Eu pensei que seria interessante pesquisar esses dados mais detalhadamente: o gosto do meu filme mudou com o tempo? Durante quais épocas do ano eu assisto mais filmes?

Porém, antes de analisar e criar belos gráficos, precisamos obter os dados. Infelizmente, muitos serviços não possuem API pública, portanto, você deve arregaçar as mangas e analisar as páginas html.

Este artigo é destinado a quem sempre quis aprender como usar o Web Scrapping, mas não o colocou nas mãos ou não sabia por onde começar.

Tarefa

Nossa tarefa é extrair os dados dos filmes já vistos: o título do filme, a data e a hora da exibição, a classificação do usuário.

De fato, nosso trabalho será realizado em duas etapas:

Etapa 1: baixar e salvar páginas html

Etapa 2: analisar html em um formato adequado para análises adicionais (csv, json, pandas dataframe etc.)

Instrumentos

Existem muitas bibliotecas python para enviar solicitações http. O mais famoso e muito útil é Solicitações.

Também é necessário escolher uma biblioteca para análise de html.

BeatifulSoup, lxml

Essas são as duas bibliotecas mais populares para analisar html e escolher uma delas é apenas uma preferência pessoal. Além disso, essas bibliotecas estão intimamente conectadas entre si: BeautifulSoup começou a usar o lxml como um analisador interno para aceleração e, no lxml, um módulo do analisador de sopa foi adicionado. Para comparar as abordagens, analisarei os dados com BeautifulSoup e usando os seletores XPath no módulo lxml.html.

Download de dados

Vamos começar a baixar dados. Primeiro, vamos apenas tentar obter a página por url e salvá-la em um arquivo local.

Abrimos o arquivo resultante e vemos que não é tão simples: o site nos considerou um robô e não mostra os dados.

Vamos descobrir como o site funciona

O navegador não tem nenhum problema em obter informações do site. Vamos ver exatamente como ele envia a solicitação. Para fazer isso, usamos o painel "Rede" nas "Ferramentas do desenvolvedor" no navegador (eu uso o Firebug para isso); geralmente, a solicitação que precisamos é a mais longa.

Como podemos ver, o navegador também envia para os cabeçalhos UserAgent, cookie e outro número de parâmetros. Primeiro, tentaremos enviar o UserAgent correto para um cabeçalho.

Desta vez, somos bem-sucedidos e agora recebemos os dados necessários. É importante notar que, às vezes, o site também verifica a validade do cookie. Nesse caso, as sessões na biblioteca de solicitações ajudarão.

Download de todas as tarifas

Agora somos capazes de salvar uma página com taxas. Mas geralmente o usuário tem muitas taxas e é necessário percorrer todas as páginas. O número da página que nos interessa é fácil de transferir diretamente para o URL.

Coletando dados do HTML

Agora vamos direto à coleta de dados do html. A maneira mais fácil de entender como a página html está estruturada é usando a função "Inspecionar elemento" no navegador. Nesse caso, tudo é bem simples: a tabela inteira com taxas está na etiqueta. Selecione este nó:

de bs4 import BeautifulSoup

de lxml import html

# Sopa Bonita

soup = BeautifulSoup (texto)

film_list = soup.find ('div', ('class': 'profileFilmsList'))

# lxml

tree = html.fromstring (texto)

film_list_lxml = tree.xpath ('// div [@class =' 'profileFilmList' ']]') [0]

Vamos aprender como extrair o título russo do filme e um link para a página do filme (também como obter o texto e o valor do atributo).

Se você precisar extrair o título em inglês, basta alterar "nameRus" para "nameEng".

Resultados

Aprendemos como analisar sites, nos familiarizamos com as bibliotecas Requests, BeautifulSoup e lxml, além de recebermos dados adequados para análises adicionais de filmes já vistos no KinoPoisk.