Web Scraping para coletar sequências de DNA com Python

Renan Gonçalves de Almeida
5 min readNov 2, 2022

--

Imagem de Web Developer Ninja no youtube

Depois de alguns cursos da udemy , linkedin learning e uma leitura parcial do livro Data Science do Zero de Joel Grus, criei coragem para desenvolver meu primeiro (pequeno, mas eficiente) projeto. Web Scraping, ou raspagem de dados, é uma das primeiras técnicas em ciência de dados que tive a oportunidade de por em prática e me permitiu coletar 307 sequências de DNA da web rapidamente para ser utilizado em minha Tese de Conclusão de Curso.

Web Scraping é a arte de extrair dados da web para algum objetivo. É útil para uma infinidade de coisas, como por exemplo extrair dados de pesquisas de mercado com a finalidade de obter vantagem competitiva.

Empresas podem contratar profissionais que manjam dessa técnica para extrair informações relevantes de fontes públicas ou privadas de, por exemplo, concorrentes de um determinado setor. É importante que sejam fontes confiáveis e reconhecidas.

Coletar e analisar esses dados de forma rápida e rotineira com o uso de Web Scraping, pode resultar em vantagens no mercado como:

  • Identificação de tendências.
  • Precificação dinâmica de produtos.
  • Monitoramento de concorrentes.
  • Comparação de preços.
  • Marketing inteligente e direcionado.

No meu caso, utilizei o Web Scraping para coletar sequências de DNA de um site chamado isfinder.

Eu precisava fazer uma mineração em sequências de inserção em DNAs utilizando o algoritmo de ECLAT para descobrir possíveis padrões. Porém, eu só possuia 16 amostras que foram coletadas manualmente por meio do site tncentral, sendo uma quantidade pequena para realizar a mineração.

Pesquisando um pouco, descobri uma base de dados disponilizada no github (fonte: https://github.com/thanhleviet/ISfinder-sequences ). Nele contém um arquivo csv que possui mais de 6000 sequências de DNA contendo informações como nome, família, grupo, entre outros. No arquivo também é disponibilizado o link que leva para o site do isfinder onde é possível ter acesso á sequência.

As sequências estavam disponíveis em páginas web. O problema, é que haviam centenas de sequências as quais eu estava interessado em extrair, o que tomaria varias horas do meu dia para coleta-las. Sendo assim, uma boa oportunidade para colocar em prática o uso de Web Scrapping e automatizar essa tarefa.

Para realizar a extração utilizei a linguagem Python que é a linguagem que estou aprendendo no momento e uma das mais utilizadas para esse fim. Como os DNAs se encontram em uma página web a qual é escrita em HTML, pensei em utilizar a biblioteca Beautiful Soup no Python, que constrói uma árvore com os elementos da página e fornece uma interface simples de acesso à eles (Joel Grus, Data Science do Zero), e a biblioteca Requests para fazer solicitações HTTP e carregar o conteúdo da página, assim, trabalhando em sintonia com o Beautiful Soup que tornará esse conteúdo mais simples e de fácil acesso.

“Perfeito!!! Ter o Python e as bibliotecas BeautifulSoup e Requests comigo é o que preciso para por as mãos nessas sequências.” (Eu mesmo)

Criei um ambiente virtual, abri o Jupyter e coloquei a mão na massa.

Como mencionado anteriormente, o arquivo está em csv, então foi preciso o import do Pandas para melhor manipulação da base em um dataframe. Gosto de deixar os imports tudo no mesmo bloco de código, por questões de boa prática, então já importei as 3 bibliotecas que utilizei:

Instalação da biblioteca request, para ser possível o import do requests:

pip install request

Import das bibliotecas:

import pandas as pd
import requests
from bs4 import BeautifulSoup as bs

Atribuí a base de dados obtida no github “database.csv” á uma variável “df” com o pandas:

df = pd.read_csv(‘database.csv’)

Meu foco era as sequências da família “IS4”, então filtrei a tabela:

#Filtrando pela família IS4
df = df.loc[(df['Family']=='IS4')]

O objetivo era buscar as sequencias e escreve-las em um arquivo .fasta com o nome do respectivo DNA. Então das várias colunas da base, eu precisava selecionar apenas o “name” e a “url”:

#Filtrando apenas o nome e a url
df_name_url = df[['Name', 'url']]

Para melhor manipulação desses dados, os adicionei em um dicionário onde a chave é o nome da sequência e o valor é a url:

#Separando as variáveis em listas e adicionando em um dicionário
nomes = [Name for Name in df_name_url['Name']]
urls = [url for url in df_name_url['url']]
dict_name_url = dict(zip(nomes, urls))

Agora tinha tudo pronto para colocar o BeautifulSoup e o requests em ação. Percorri o dicionário e, para cada url, fiz a solicitação HTTP da página com o requests, criei a interface para fácil acesso aos elementos com BeutifulSoup e escrevi em um arquivo “sequencias.fasta”:

# Acessando as urls e escrevendo no arquivo .fasta o nome e o respectivo DNA
with open("sequencias.fasta", "a") as outfile:
for key in dict_name_url.keys():
url = dict_name_url[key]

#O parametro verify=False impede a verificação de certificado do site.
#Por padrão é true, e estava barrando o acesso á pagina
#Então, desativei (Mas não recomendo, faça isso de forma consciente)
page = requests.get(url, verify=False)

#Construindo interface com o Soup
soup = bs(page.text, "html.parser")

#Buscando o elemento da página onde contém a sequência.
#No caso, o elemento 'div' com a classe 'seq'
tag_div_seq = soup.find("div", class_='seq')

#Obtendo apenas o texto do elemento, que é o que interessa
seq_text = tag_div_seq.get_text()

#Finalmente, escrevendo no arquivo sequencias.fasta
outfile.write(('>' + key + '\n' + seq_text + '\n\n').replace("'", ""))

E é isso. O arquivo foi preenchido com 307 sequências extraídas de forma rápida e prática da web e prontas para a posterior mineração. Uma parte das sequências coletadas pode ser visualizada na imagem abaixo:

Amostra do arquivo sequencias.fasta, resultado da extração.

Espero ter contribuído de alguma forma através dessa publicação. Ansioso para trazer mais conteúdos aqui e mostrar um pouquinho do que estou aprendendo. Até mais.

Você pode conferir o código completo no meu repositório no github e o dataset está disponível também no github.

--

--

Renan Gonçalves de Almeida
0 Followers

Compartilhando aprendizados na área de dados.