Python para iniciantes: como comandar a Web

Uma jornada para a automação web simples



imagem


Problema: O envio de trabalhos de casa exige a navegação em um labirinto de páginas da Web tão complexas que enviei a tarefa para o local errado várias vezes. Além disso, embora esse processo leve apenas 1 a 2 minutos, às vezes parece um obstáculo intransponível (por exemplo, quando eu terminei uma tarefa muito tarde da noite e mal consigo lembrar minha senha).



Solução: Use Python para enviar tarefas concluídas automaticamente! Idealmente, eu poderia salvar a tarefa, digitar algumas teclas e carregar meu trabalho em segundos. Parecia bom demais para ser verdade no começo, mas então descobri o Selenium, uma ferramenta que pode ser usada com o Python para navegar na web.



imagem


Sempre que repetimos ações tediosas na Internet com a mesma sequência de etapas, é uma ótima chance de escrever um programa para automatizar o processo. Com o Selenium e o Python, precisamos escrever o script apenas uma vez e, em seguida, podemos executá-lo quantas vezes quisermos e evitar a repetição de tarefas repetitivas (e, no meu caso, é impossível enviar o trabalho para o lugar errado)!



Aqui, abordarei uma solução que desenvolvi para enviar automaticamente (e corretamente) minhas tarefas. Ao longo do caminho, abordaremos o básico do uso de Python e selênio para controle programático da Web. Enquanto este programa funciona (eu o uso todos os dias!), É bastante individual, portanto você não poderá copiar e colar o código do seu aplicativo. No entanto, os métodos gerais aqui podem ser aplicados a um número ilimitado de situações. (Se você quiser ver o código completo, ele está disponível no GitHub ).



Uma abordagem



Antes de começarmos a parte divertida da automação, precisamos descobrir a estrutura geral da nossa solução. Começar a codificar sem um plano é uma ótima maneira de perder horas e ficar frustrado. Quero escrever um programa para enviar tarefas de aula concluídas para o local correto no Canvas ( “sistema de gerenciamento de aprendizado” da minha universidade). Primeiro, preciso de uma maneira de dizer ao programa o nome do trabalho a ser enviado e a classe. Adotei uma abordagem simples e criei uma pasta para armazenar tarefas concluídas com pastas filho para cada classe. Nas pastas filho, coloquei um documento final nomeado para um trabalho específico. O programa pode descobrir o nome da classe pela pasta e o nome da tarefa pelo nome do documento.

Aqui está um exemplo em que o nome da classe é EECS491 e a tarefa é Tarefa 3 - Saída em modelos gráficos grandes. "



imagem



Estrutura do arquivo (esquerda) e Tarefa completa (direita).



A primeira parte do programa é um loop que percorre as pastas para encontrar o trabalho e a classe que armazenamos em uma tupla Python:



# os for file management
import os
# Build tuple of (class, file) to turn in
submission_dir = 'completed_assignments'
dir_list = list(os.listdir(submission_dir))
for directory in dir_list:
    file_list = list(os.listdir(os.path.join(submission_dir, 
directory)))
    if len(file_list) != 0:
        file_tup = (directory, file_list[0])
    
print(file_tup)


('EECS491', 'Tarefa 3 - Inferência em modelos gráficos maiores.txt')



Isso cuida do gerenciamento de arquivos e agora o programa conhece a classe e a tarefa a serem incluídas. O próximo passo é usar o Selenium para navegar para a página da web correta e carregar o trabalho.



Controle da Web com Selenium



Para começar o Selenium, importamos a biblioteca e criamos um driver da Web, que é um navegador controlado por nosso programa. Nesse caso, usarei o Chrome como navegador e publicarei o driver no site do Canvas, onde envio trabalhos.



import selenium
# Using Chrome to access web
driver = webdriver.Chrome()
# Open the website
driver.get('https://canvas.case.edu')


Quando abrimos a página da Web Canvas, nos deparamos com o primeiro obstáculo - a caixa de login! Para contornar isso, precisaremos inserir o ID e a senha e pressionar o botão de login.



imagem



Imagine que um driver da Web é alguém que nunca viu uma página da Web antes: precisamos dizer exatamente onde clicar, o que imprimir e quais botões clicar. Existem várias maneiras de dizer ao driver da Web quais elementos encontrar e todos eles usam seletores. Um seletor é um identificador exclusivo para um elemento em uma página da web. Para encontrar um seletor para um elemento específico, diga o campo "CWRU ID", precisamos examinar o código da página da web. No Chrome, isso pode ser feito pressionando Ctrl + Shift + I ou clicando com o botão direito do mouse em qualquer elemento e escolhendo Exibir código. Isso abreFerramentas para desenvolvedores do Chrome , um aplicativo extremamente útil que exibe o HTML subjacente a qualquer página da web .



Para encontrar o seletor para o campo "CWRU ID", cliquei com o botão direito do mouse no campo, cliquei em View Code e vi o seguinte nas ferramentas do desenvolvedor. A linha destacada corresponde ao elemento id_box (essa linha é chamada de tag HTML).



imagem



Esse HTML pode parecer esmagador, mas podemos ignorar a maioria das informações e focar em partes id = "username"e name = "username". (eles são conhecidos como atributos de tag HTML).

Para selecionar um campo idusando nosso driver da web, podemos usar o atributo idou nameque encontramos nas ferramentas do desenvolvedor. Os drivers da web do Selenium têm várias maneiras diferentes de selecionar elementos em uma página da web e geralmente existem várias maneiras de selecionar o mesmo elemento:



# Select the id box
id_box = driver.find_element_by_name('username')
# Equivalent Outcome! 
id_box = driver.find_element_by_id('username')


Nosso programa agora tem acesso id_boxe podemos interagir com ele de várias maneiras, como digitar teclas ou pressionar (se tivermos selecionado um botão).



# Send id information
id_box.send_keys('my_username')


Passamos pelo mesmo processo para o campo de entrada de senha e o botão de login, escolhendo cada um deles, dependendo do que vemos nas ferramentas de desenvolvedor do Chrome. Em seguida, enviamos informações aos itens ou clicamos neles, conforme necessário.



# Find password box
pass_box = driver.find_element_by_name('password')
# Send password
pass_box.send_keys('my_password')
# Find login button
login_button = driver.find_element_by_name('submit')
# Click login
login_button.click()


Assim que entramos, somos recebidos por esta barra de ferramentas um pouco intimidadora:



imagem



novamente precisamos navegar pelo programa pela página da web, especificando os itens exatos para clicar e as informações a serem inseridas. Nesse caso, digo ao programa para selecionar cursos no menu à esquerda e depois a turma correspondente à tarefa que preciso passar:



# Find and click on list of courses
courses_button = driver.find_element_by_id('global_nav_courses_link')
courses_button.click()
# Get the name of the folder
folder = file_tup[0]
    
# Class to select depends on folder
if folder == 'EECS491':
    class_select = driver.find_element_by_link_text('Artificial Intelligence: Probabilistic Graphical Models (100/10039)')
elif folder == 'EECS531':
    class_select = driver.find_element_by_link_text('Computer Vision (100/10040)')
# Click on the specific class
class_select.click()


O programa encontra a classe correta usando o nome da pasta que salvamos na primeira etapa. Nesse caso, eu uso o método select find_element_by_link_textpara encontrar uma classe específica. O "texto do link" para um elemento é apenas outro seletor que podemos encontrar olhando a página:



imagem



Esse fluxo de trabalho pode parecer um pouco entediante, mas lembre-se de que só precisamos fazer isso uma vez quando escrevemos nosso programa! Depois disso, podemos clicar em "Executar" quantas vezes quisermos, e o programa irá para todas essas páginas para nós.

Usamos o mesmo processo de validação de uma página - selecionando um elemento - interagindo com um elemento para passar por mais algumas telas. Por fim, chegamos à página de envio de vagas:



imagem



Nesse ponto, eu pude ver a linha de chegada, mas inicialmente essa tela me intrigou. Eu poderia ter clicado na caixa Selecionar arquivo com bastante facilidade, mas como eu deveria selecionar o arquivo que desejo enviar? A resposta acaba sendo incrivelmente simples! Encontramos o campo Choose Fileusando um seletor e usamos um método send_keyspara passar o caminho exato do arquivo (nomeado file_locationno código abaixo) para o bloco:



# Choose File button
choose_file = driver.find_element_by_name('attachments[0][uploaded_data]')
# Complete path of the file
file_location = os.path.join(submission_dir, folder, file_name)
# Send the file location to the button
choose_file.send_keys(file_location)


Ao enviar o caminho exato do arquivo, podemos pular todo o processo de navegação da pasta para encontrar o arquivo que queremos. Depois de enviar o caminho, temos a seguinte tela mostrando que nosso arquivo está carregado e pronto para ser enviado.



imagem



Agora, selecionamos o botão "Enviar tarefa", clique e nossa tarefa é enviada!



# Locate submit button and click
submit_assignment = driver.find_element_by_id('submit_file_button')
submit_assignent.click()


imagem


Limpeza



O gerenciamento de arquivos é sempre uma etapa crítica e quero garantir que não reenvie ou perca trabalhos antigos. Imaginei que a melhor solução seria salvar o arquivo a ser colocado em uma pasta completed_assignmentse movê -los para a pasta submitted_assignmentsassim que eles fossem baixados. O último bit de código usa o módulo os para mover o trabalho concluído para o local correto.



# Location of files after submission
submitted_file_location = os.path.join(submitted_dir, submitted_file_name)
# Rename essentially copies and pastes files
os.rename(file_location, submitted_file_location)


Todo o código-fonte é empacotado em um script que eu posso executar na linha de comando. Para limitar a possibilidade de erros, submeto apenas um trabalho por vez, o que não é grande coisa, considerando que leva apenas 5 segundos para iniciar o programa!



É assim que eu executo o programa:



imagem



O programa me dá a oportunidade de garantir que este seja o trabalho correto antes do carregamento. Após a conclusão do programa, recebo a seguinte saída:



imagem



Enquanto o programa está sendo executado, posso observar o Python executando para mim:



imagem



conclusões



As técnicas de automação com Python são ótimas para muitas tarefas, tanto gerais quanto no meu campo de ciência de dados. Por exemplo, poderíamos usar o Selenium para baixar automaticamente novos arquivos de dados todos os dias (supondo que o site não possua uma API ). Embora os scripts possam parecer entediantes à primeira vista, a vantagem é que podemos forçar o computador a repetir essa sequência quantas vezes quisermos exatamente da mesma maneira. O programa nunca perderá o foco e irá para o Twitter. Ele seguirá as etapas exatamente em uma sequência perfeita (o algoritmo funcionará bem até que o site seja alterado).



Devo mencionar que você deve ter cuidado antes de automatizar tarefas críticas. Este exemplo é um risco relativamente baixo, pois sempre posso voltar e reenviar tarefas, e costumo verificar novamente o programa para funcionar. Os sites são alterados e, se você não alterar o programa em troca, poderá acabar com um script que faz algo completamente diferente do que você pretendia originalmente!



Em termos de ROI, esse programa me poupa cerca de 30 segundos por tarefa e leva 2 horas para escrever. Portanto, se eu usá-lo para concluir 240 tarefas, receberei uma vantagem no tempo! No entanto, a recompensa deste programa reside no desenvolvimento de uma solução interessante para o problema e ensina muito no processo. Embora meu tempo tenha sido gasto com mais eficiência na conclusão de tarefas, em vez de descobrir como entregá-las automaticamente, eu gostei muito do desafio. Há algumas coisas tão satisfatórias quanto a solução de problemas, e o Python acaba sendo uma ferramenta muito boa para isso. ...



imagem



Descubra os detalhes de como obter uma profissão de alto nível do zero ou subir de nível em habilidades e salário fazendo os cursos on-line pagos do SkillFactory:











All Articles