Comixology - Análise de quadrinhos digitais (parte 1 - análise do site para web scraping)
May 01, 2016
Introdução
PS: Neste post, irei me referir às histórias em quadrinhos como comics, só para poupar um pouco na escrita. Tenho certeza que todos vão entender, então não tem problema.
Neste post falarei de um projeto que recentemente eu resolvi fazer, envolvendo a análise do mercado de comics digitais. Gosto do assunto há algum tempo e queria ter uma ideia geral sobre as editoras (especialmente as gigantes, Marvel e DC Comics).
Por já ter usado o Comixology para leitura de comics, optei por fazer uma análise dele. O Comixology é um site de venda de comics digitais com um acervo bem grande e muitas editoras, tanto grandes quanto menores, independentes. Se quiserem dar uma conferida: www.comixology.com
Como o Comixology não apresenta uma API, dataset para download ou qualquer coisa do tipo, tive que fazer um scraping do site. Mas o que é scraping? Neste caso, é o Web Scraping, que é o ato de extrair informações de documentos HTML (páginas) estruturados. Basicamente, você acessa (programaticamente) um endereço web e, do código fonte HTML, extrai a informação que deseja, através da identificação de padrões e do local correto onde estão as informações. Com os frameworks e linguagens modernas, é sempre plausível acreditar que existe uma estrutura nas páginas de um site que se repete, ou apresenta certos padrões que são possíveis de serem reproduzidos através de código. E esta é uma boa lição: nem sempre, em Análise de Dados, os dados estão disponíveis de forma fácil e estruturada para você, então é necessário desenvolver formas de conseguir estes dados por outros meios.
Para fazer nosso scraping, vamos usar duas libraries do Python que já vêm instaladas com o Anaconda, que são o lxml
(para fazer a depuração do código em HTML, XML e afins), juntamente com o Xpath
(que não é uma library do Python, e sim uma sintaxe para definir partes de um documento XML, e que falaremos sobre mais a frente), e o requests
, utilizado para fazer (quem diria) requests em páginas HTML e poder retornar o código fonte em si (entre outras coisas).
Este post iniciará uma série de 3 posts, onde cada um falará sobre uma parte do projeto. Neste primeiro, falarei sobre a análise que fiz do site para entender sobre a estrutura do mesmo e como poderia me preparar melhor para escrever o código que faria o scraping. No segundo post, falarei do código de scraping em si, explicando cada parte dele. E finalmente, no terceiro, farei uma análise exploratória sobre os dados que extrairmos com nosso scraping (muitas tabelas e gráficos) :).
Vamos então começar o primeiro post, a análise do site e a preparação para o scraping.
O Site
Bem, meu primeiro passo, como já falado, foi avaliar o site em si, para entender como eu faria o scraping. É necessário entender a estrutura, onde está a informação que você quer, por onde você chegará nela. O ideal era conseguir algum lugar onde os links para todos os comics estivessem reunidos ou pelo menos ligados de alguma forma. Então fui analisar o menu “Browse”, que pareceu a opção óbvia:
De cima para baixo, “Free Comics” não parecia uma boa opção, pois obviamente me limitaria apenas aos comics que eram grátis no site, o que provavelmente representa uma minoria. “Series” até poderia ser uma opção, mas eu não tinha certeza se todo quadrinho era parte de uma Série, então deixei de lado a princípio. O próximo item é “Publishers”. E aí, achei que era aonde teria minha melhor chance, pelo menos até o momento. Seguindo, “Top Rated” e “Top Selling”, também descartados por serem limitantes. A seguir, “Creator” e “Genre” também pareciam boas opções. Assim como no item “Publisher”, é razoável crer que todo comic está associado a um criador e a um gênero. Os itens restantes também não pareciam muito promissores. Com as boas opções em mãos, optei pelo item “Publisher”, e então fui analisá-lo.
Como podemos ver, a página divide-se em dois. Primeiramente temos uma tabela “Featured”, com as editoras em destaque. Novamente, se nosso objetivo é analisar o site como um todo, não é possível usar esta tabela, que é limitante. Porém, na parte debaixo, temos a tabela “All Publishers”. Aí sim. É daí que partiremos.
Esta tabela é dividida em páginas. Ela exibe 48 editoras por página, com exceção da última, onde a quantidade pode ser de 48 ou menor que 48. Desta forma, nossa estratégia consistirá em extrair o link de cada uma das editoras em uma página, ir para a página seguinte e repetir o procedimento, até que se encerrem as páginas. O que nosso código deve fazer é, extrair o número de páginas totais para esta divisão por Publishers. Neste caso, partindo do princípio que é só uma página e que a quantidade de editoras não deve variar muito, inseri o valor de páginas na mão. Então, para cada página, o código irá “descobrir” a quantidade de editoras naquela página, e então extrair o link de cada uma para então, passar para a página seguinte. Neste caso, não é possível afirmar que todas as páginas terão sempre a mesma quantidade de editoras e incluir esta quantidade na mão, pois a última sempre pode ter uma quantidade diferente. Todos os links para as páginas das editoras serão guardados em uma lista, para serem posteriormente acessados.
Vamos agora abrir o link de algumas editoras para ver a estrutura da página das editoras e se existem diferenças entre elas. Para o exemplo, abri as editoras Archie, Aspen e Marvel.
A primeira vista, começando pela Archie, parece um layout bem comum. A Archie tinha duas páginas, e cada um destes “itens” da página é uma série de comics, e não um comic em si, como pode inicialmente parecer. Na editora Aspen encontramos um primeiro caso especial, que são Bundles. Os Bundles são conjuntos grandes de comics onde, devido à grande quantidade, é dado um desconto ao comprador. Por considerar que já teríamos todos os comics nas séries, preferi não contar os bundles em minha análise, e logo, meu código de scraping deveria pegar apenas os links relativos às séries, e não aos bundles.
A Marvel possui uma grande quantidade de séries de comics, com uma quantidade considerável de páginas, que neste caso podem ser passadas pelas setas ou por uma caixa de input onde você insere o número da página para qual quer ir. A Marvel também possui bundles.
Então, para resumir, teremos que seguir um processo semelhante ao usado para conseguir o link de cada editora. Entramos no link de cada editora, e nele, descobrimos o número de páginas das séries, o número de séries na página, extraímos o link de cada série e então avançamos de página, repetindo o procedimento até que não hajam mais páginas.
Vamos agora para as séries. Como temos que cobrir todos os casos, vou abrir algumas séries bem grandes, que devem ter uma grande quantidade de tipos de comics. Esse passo necessitou de pesquisa; abrir várias séries e ir olhando e pensando no que terá que ser feito pelo código. Vamos tomar por base as seguintes séries: Batman (1940-2011), Fables e Adrasté (esta só por ser francesa, e neste caso, os comics chamam-se “Bandes Dessinées”). Estas três séries cobrem os tipos de comics que existem no site que encontrei e que teremos de extrair.
Começando, notamos uma primeira categoria de Recent Additions. Entretanto, as comics que ficam neste quadro estão sempre presentes em outras categorias, e portanto podem ser desconsideradas. Os bundles, já citados, também podem aparecer aqui, e também podem ser desconsiderados. As outras categorias entrarão todas na análise. São elas: Omnibuses, Collected Editions, Graphic Novels, Issues, Artbooks, Extras, One-Shots e os Bandes Dessinées.
Cada um destes tipos, assim como nos Publishers, pode ter uma ou mais páginas. Embora o mais comum seja encontrar páginas nas Issues, que costumam ser as mais numerosas, encontrei alguns casos onde haviam páginas para outras categorias de comic. Logo, nosso código deve enquadrar cada caso possível. Desta forma, para cada série temos então que percorrer cada tipo / categoria de comic fazendo o mesmo procedimento dos Publishers: pegar o número de páginas de uma categoria, extrair os links para todos os comics nesta categoria e página, pular para próxima página até que se acabem as páginas desta categoria. Pula-se então para a próxima categoria, repetindo o processo até que se encerrem as categorias e então, pulamos para a próxima série.
No próximo passo, vamos avaliar a página de um comic, para entender quais informações conseguimos capturar da página. Vamos abrir uma da série que já olhamos no passo anterior, quando avaliávamos as séries: Batman (1940-2011) #181.
De cara já temos informações bem interessantes para captar. Nome (obviamente), preço, avaliação, quantidade de avaliações, editora, escritor, quem fez a arte, gênero, contagem de páginas, data de lançamento, classificação etária, entre outras. Se entrarmos na parte de Sales, e abrirmos algum dos comics que lá estão, veremos também que existem comics com preços descontados, e captar essa informação também pode ser interessante, apesar de ela poder variar bastante com o momento que você fizer a análise.
Então, para resumir tudo:
- Iniciaremos nossa análise pelas Editoras. As Editoras tem Séries de comics e cada série de comics tem diferentes tipos de comics, como edições isoladas (Issues), coleções de edições (collected editions), entre outros.
- A ideia central do nosso código de scraping é extrair os links de cada Editora, passando por cada página da busca por Editora e extraindo os links de todas as editoras da página, para então passar para a próxima página até que se encerrem as páginas.
- Com os links das editoras, acessaremos cada link e então utilizaremos processo semelhante, descobrindo o número de séries de uma editora e o número de páginas de séries, para então extrair os links das séries em cada página da Editora. Terminadas as páginas, passa-se para a próxima editora, até que não haja mais Editoras para percorrer.
- Nas séries, o procedimento também é semelhante, mas deve-se percorrer as páginas de cada categoria de comics, extraindo os links dos comics para então passar a próxima categoria, repetindo o processo até o fim da série, quando deve-se passar para a próxima série.
- O passo final é acessar o link de cada comic e extrair as informações desejadas.
A explanação resumida pode parecer um pouco confusa, mas na transcrição para o código tudo ficará mais claro.
Bem, aqui encerra-se a análise que foi feita para o site. No próximo post, vou escrever e explicar o código que usei para fazer a extração dos dados.
Até a próxima!