Extraindo dados com Scrapy e salvando em um banco de dados SQLite

Paulo Henrique
5 min readJul 10, 2022

Principais conceitos e passos inicias para criar o seu scrapping com Scrapy e salvar ele em algum banco de dados, no nosso caso o SQLite.

Introdução

Pensando em como automatizar alguns processos que fazemos no dia a dia, como por exemplo consultar as principais notícias em um website e utilizar essas informações para outra finalidade que não seja necessariamente estar informado, vamos aprender como coletar dados em páginas web utilizando o Scrapy (https://scrapy.org/), um framework escrito em python que tem como objetivo extrair informações de websites.

O que vamos extrair?

Existe um portal de notícias que gosto bastante, o https://thenewscc.com.br/, que oferece o serviço de informar as principais notícias no Brasil e no mundo na sua caixa de entrada do seu e-mail.

Vamos criar um spider(script que fará a extração dos dados), para extrair as principais notícias do thenewscc.

Começando

Vou considerar que você já tenha o python instalado em sua máquina, então você só precisa instalar o Scrapy com o comando:

pip install Scrapy

E em seguida criar o nosso projeto que irá coletar os dados:

scrapy startproject articles_the_news

Opcional

Como boa prática, talvez você queira utilizar um ambiente virtual como o virtualenv(https://virtualenv.pypa.io/), então basta cria o seu ambiente virtual e adicionar o scrapy em um arquivo de dependências como por exemplo em um arquivo chamado requirements.txt.

E para acessar o seu ambiente virtual criado, pode seguir os passo abaixo.

1- virtualenv env
2- source env/bin/activate
3- pip install -r requirements.txt

Estrutura do projeto

O scrapy cria uma estrutura definida pra gente, de forma que possamos trabalhar com seus arquivos e criar o nosso scrapping.

articles_the_news/
scrapy.cfg # deploy configuration file

articles_the_news/ # project's Python module, you'll import your code from here
__init__.py

items.py # project items definition file

middlewares.py # project middlewares file

pipelines.py # project pipelines file

settings.py # project settings file

spiders/ # a directory where you'll later put your spiders
__init__.py

Vamos entender o que significa alguns dos arquivos que o nosso framework criou.

items
Contém os nossos modelos que irá representar a informação extraída pelos nossos spiders. Como vamos extrair notícias, nada melhor que criar um modelo para essa finalidade.

pipelines
São as nossas rotinas, aquilo queremos que seja executado na informação extraída. Aqui é importante você saber que a pipeline é executa para cada item do nosso spider.

settings
Esse é um arquivo de configuração do nosso projeto, presente na maioria dos frameworks em python, vamos adicionar nele a codificação dos nossos dados com a variável FEED_EXPORT_ENCODING = ‘utf-8’ e descomentar o ITEM_PIPELINES(vamos usar ele para salvar nossos dados em um banco de dados SQLite).

FEED_EXPORT_ENCODING = 'utf-8'

spiders

Aqui é onde ficará os nossos scripts para extrair as informações do website, vamos renomear o arquivo já existente nessa pasta para news_spider.py.

Criando o nosso spider

Primeiro podemos imaginar um modelo para os nossos dados, vou chamá-lo de NewsItem, criando ele no nosso arquivo de items.py

Inspecionando o elemento do site https://thenewscc.com.br/noticias, é possível observar até o momento da criação desse scrapping, que existe uma classe chamada elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-9a761cc, que possui o agrupamento de notícias pela tag em html chamada article.

Com isso podemos salvar esses dados de article da seguinte forma:

articles = response.xpath('//div[@class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-9a761cc"]//article')

E percorrer cada article buscando por informações como título, links, data e o texto da notícia.

O que esse script faz é:

  1. Definir um nome para nosso spider.
  2. Informar a url que irá acessar.
  3. Percorrer as notícias.
  4. Criar um objeto com base no nosso modelo definido anteriormente .
  5. Retornar todas as notícias coletadas.

Você pode ter observado que utilizamos a linguagem xpath e dentro do nosso laço de repetição, essas barras: "././/", isso indica que estamos acessando os elementos no contexto atual do elemento html article, e não dando continuidade a nossa primeira construção feita antes do laço de repetição.

Ao final é feito um yield, que funciona como uma forma de segurar os dados e somente retorná-los ao final do laço de repetição. Caso você faça por exemplo um return yield, ele retornará apenas o primeiro elemento.

Testando o nosso spider

Para testar o nosso script, você pode executar o comando:

scrapy crawl news -O news.json

Com isso ele irá executar o spider de nome news, criando um arquivo chamado news.json , se esse arquivo já existir ele será apagado qualquer informação presente nele.

Salvando as notícias em SQLite

Como o nosso python já possui o SQLite, vamos apenas utilizá-lo com a biblioteca sqlite3 para criar e acessar nosso banco de dados.

Lembra de nosso arquivo pipelines.py que eu havia dito anteriormente que ele recebe nossos items do spider?. Vamos entrar nesse arquivo e alterar o nome da pipeline que existe para SqliteSaveNewsPipeline.

Nosso script de pipeline cria o nosso banco de dados e a tabela news, além de na função process_item, verificar se a notícia já existe no banco de dados através da coluna title, para finalmente salvar a notícia.

Não esqueça de descomentar a linha ITEM_PIPELINES no arquivo settings.py, e apontar corretamente para a nossa pipeline.

ITEM_PIPELINES = {'articles_the_news.pipelines.SqliteSaveNewsPipeline': 300,}

Você pode executar o mesmo comando para o nosso spider.

scrapy crawl news -O news.json

E com isso verificar que além de criar o nosso arquivo news.json com as notícias, ele também criou um arquivos news_the_news.db que possui as notícias salvas em nosso banco de dados na tabela news.

Conclusão

Vimos que é bem fácil de entender como o scrapy funciona e como ele faz a captura dos dados.

Utilizamos aqui a linguagem xpath ao invés de seletores css (um seletor css converte para xpath).

As vezes pode ser muito chato depois de você fazer a análise do html do website que você quer extrair as informações e ficar executando o script como teste de forma massiva. Para isso existe um shell, que pode ser acessado pelo comando abaixo.

scrapy shell "https://thenewscc.com.br/noticias/"

Ele permite que você teste o seu xpath antes de colocá-lo em seu spider. Não deixe de consultar a documentação para obter outras possibilidades com o scrapy https://docs.scrapy.org/.

Repositório

--

--