Neste tutorial, você vai aprender como logar em site que requerem um usuário e uma senha antes de mostrar páginas específicas.
Autor: Lazar Telebak (English Version) • Tradução: Lucas Maekawa
Se você é novo no Scrapy, certifique-se de acessar o tutorial de Scrapy para aprender como criar um projeto e um crawler e também a extrair páginas web.
Neste tutorial, vamos utilizar este site: quotes.toscrape.com (um site de demonstração que foi criado com fins de aprendizado). Como você pode verificar, todas as páginas do site contém o botão de Login, que nos direciona para a página /login. Nesta página, você pode digitar qualquer combinação de usuário e senha e pressionar o botão Login para ser redirecionado para a página inicial, que agora conta com o botão Logout, que indica que você está logado.
Em um site real, após realizar o login, você conseguirá encontrar vários pontos de dados e URLs que você não tem acesso sem estar logado, mas como este é um site de demonstração, não há tudo isso.
Analisando a Requisição de Login
Agora, vamos começar para ver como logar utilizando o Scrapy. Primeiramente, certifique-se de que você não está logado, abra a página Login no seu navegador, Chrome ou Firefox, clique na página com o botão direito, selecione “Inspect” e vá para a aba “Network”, onde você pode analisar o tráfego e ver quais URLs o servidor está requisitando durante o login.
Neste caso, temos duas requisições, o POST e o GET. Após clicar no Login, o método POST vai estar acompanhado do status 302, que quer dizer que você foi redirecionado da página de login para outra página. Aqui está uma captura de tela do Chrome:
Clicando nessa requisição, você encontrará várias abas, entre elas a aba “Headers”, que é a que você precisa. Role para baixo até encontrar a seção “Form Data”, onde há três argumentos importantes (em outros sites, pode haver outros argumentos). O primeiro deles é o “csrf_token” que é um token que muda dinamicamente, e uma combinação de “username” e “password”.
Editando Seu Código Scrapy
Voltando para o seu código, o que precisa ser adicionado é um submódulo do Scrapy chamado FormRequest. Então no começo do seu código digite:
1 2 |
from scrapy.http import FormRequest |
e substituia o parâmetro de start_urls para:
1 2 |
start_urls = ('http://quotes.toscrape.com/login',) |
Adicione seu código de login para a função parse(). Neste caso, o token csrf_token vai mudar automaticamente se você atualizar a página. Então você precisa primeiro extrair o valor do csrf_token do código-fonte da página. Para fazer isso, use “Inspect” na página quotes.toscrape.com/login e você vai achar um input com o nome csrf_token.
Este seletor Xpath vai selecionar todo nó HTML cujo atributo name seja igual a csrf_token e extrair a primeira instância desse nó. Como você só tem uma instância, ele vai retornar o token que você precisa.
1 2 |
token = response.xpath('//*[@name="csrf_token"]/@value').extract_first() |
Então, para outros sites, você pode apenas copiar os argumentos do “Form Data” (como mostrado nas capturas de tela acima), e se você encontrar algum dos detalhes mudando, tente inspecionar a página para achar o que muda e extraia ele para uma variável.
Então use o return FormRequest incluindo os detalhes de login e também o nome da função de callback que vai determinar o que você quer extrair da página para qual você será redirecionado após o login; aqui vamos chamar de scrape_pages, por exemplo. Então sua função parse vai parecer assim:
1 2 3 4 5 6 7 8 9 10 |
def parse(self, response): token = response.xpath('//*[@name="csrf_token"]/@value').extract_first() return FormRequest.from_response(response, formdata={ 'csrf_token'=token, 'password'='foobar', 'username'='foobar'}, callback=self.scrape_pages) |
Testando Seu Código de Login Scrapy
Se você quiser testar seu código, você pode adicionar a seguinte linha no começo do seu código:
1 2 |
from scrapy.utils.response import open_in_browser |
e, no começo da função scrape_pages() adicione esta linha, que vai abrir no navegador o site que você está extraindo, mais precisamente a página que você vai ser redirecionado depois do login:
1 2 |
open_in_browser(response) |
Na mesma função scrape_pages() complete o código que vai extrair as páginas após o login.
Finalmente, abra o Terminal ou o Prompt de Comando e use o seguinte comando para rodar o spider; certifique-se de substituir o “quotes” com o nome do seu spider se ele for diferente.
1 2 |
scrapy crawl quotes |
Se tudo estiver certo, uma página vai abrir no seu navegador mostrando o que seu programa está extraindo. Neste exemplo, ele vai mostrar a página inicial do site demo, incluindo um botão Logout no topo, que significa que você conseguiu se logar.
Código Final
Isto é tudo para este tutorial de login com Scrapy, e aqui está o código completo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# -*- coding: utf-8 -*- from scrapy import Spider from scrapy.http import FormRequest from scrapy.utils.response import open_in_browser class QuotesSpider(Spider): name = 'quotes' start_urls = ('http://quotes.toscrape.com/login',) def parse(self, response): token = response.xpath('//*[@name="csrf_token"]/@value').extract_first() return FormRequest.from_response(response, formdata={'csrf_token': token, 'password': 'foobar', 'username': 'foobar'}, callback=self.scrape_pages) def scrape_pages(self, response): open_in_browser(response) # Complete your code here to scrape the pages that you are redirected to after logging in # .... # .... |
Você também pode baixar o código do Github.
Se você tem alguma dúvida, sinta-se a vontade para enviá-las abaixo nos comentários.
Curso Compreensivo de Scrapy
Este tutorial é parte do nosso curso compreensivo online: Scrapy, Powerful Web Scraping & Crawling with Python – ganhe 90% de desconto usando este cupom.