Pessoalmente, sou fã de trens. Eles são um método legal, embora lento, para se locomover pelo país. O Canadá não é o melhor candidato ao trânsito ferroviário, desde que a área bastante grande entre costas, no entanto, por meio de ferroviário opere o serviço de trem de rotina em seu corredor entre Windsor, bem como a cidade de Quebec.
Infelizmente, o trilho de viajantes tem que produzir para o trilho industrial no Canadá, que geralmente desencadeia atrasos. Depois de perceber que alguns trens têm atrasos extremamente regulares, parecia que seria benéfico entender o desempenho típico de cada um por meio de trem. por meio de não fornecer publicamente esses dados.
No entanto, eles fornecem alguns dados sobre a chegada, bem como os horários de partida. Cavando nos dados oferecidos com qualquer tipo de navegador Verificando o por meio do local ferroviário, foi possível inquérito para os dados de chegada do passado / real. O resultado é Trainstats.ca, uma tela de via de desempenho em tempo hábil. Junte-se a mim após o intervalo enquanto eu vou exatamente como isso tudo funciona, bem como exatamente como escolher um campeão ao receber o seu próximo bilhete de trem.
Obtendo os dados
A via fornece dados de rotina para o dia anterior, assim como no dia seguinte em sua página de condição. Isso nos deixaria desenvolver um conjunto de dados de viagem, no entanto apenas um dia de cada vez. Felizmente, podemos terminar o inspetor do Chrome, bem como descobrir esta solicitação:
http://reservia.viarail.ca/tsi/gettrainstatus.aspx?l=en&tsiccode=via&tsitrainnumber=87&departuredEnter=2015-12-01&arrivaldate=2015-12-01&traininstancedate=2015-12-01&t=1449033500354.
Há alguns parâmetros suculentos aqui. Tsitrainnumber é, sem dúvida, o número do trem que estamos olhando. O parada é a data que o trem saiu, assim como a chegada da chegada é quando chegou. Traininstancedate igualmente parece ser definido até a data em que o trem saiu. Com isso em mente, é hora de pular em Python, bem como utilizar a incrível biblioteca de pedidos para criar alguns pedidos.
Esses dados consistem em texto unicode bidirecional que podem ser interpretados ou compilados de uma maneira diferente do que aparece abaixo. Para revisar, abra os dados em um editor que expõe caracteres ocultos Unicode.
Descubra muito mais sobre caracteres unicode bidirecionais
Mostrar personagens escondidos
Payload = {‘l’: ‘en’,
‘Tsiccode’: ‘Via’,
‘Tsitrainnumber’: Train_number,
‘Partido’: Trip_date,
‘ChegadaDate’: Trip_date,
‘Traininstancedate’: Trip_date}
r = solicitações.get (‘http://reservia.viarail.ca/tsi/gettrainstatus.aspx' ;,
params = payload)
Ver Raw
request.py.
realizada por github
Este código nos permite buscar dados para qualquer tipo de número de trem em qualquer tipo de data. Depois de alguns testes, descobrimos que os dados de Via voltaram a abril de 2015, o que nos fornece mais de 6 meses de dados. Para cada viagem, recebemos a chegada organizada e real, bem como os horários de partida para cada estação. Mantendo essa informação, podemos determinar rapidamente como são atrasados os trens.
Com os dados da página fetched como HTML, um script foi hackeado juntos usando beautifulsoup para extrair todos os valores. Esse script produz objetos para os dados da viagem, bem como armazena-os em um banco de dados PostgreSQL utilizando SQLALCHEMY. Isso torna simples, bem como eficaz para obter acesso aos dados mais tarde.
O último passo foi iterar em todos os números de trem, bem como dias para puxar os dados. Este script utiliza alguns loops aninhados para manter os dados, bem como armazená-lo. Mais um script pega os dados do dia anterior, bem como armazena no banco de dados. Isso é configurado em um trabalho cron, então o banco de dados permanece fresco.
Construindo um site (barato)
Trainstats.ca site
Neste ponto, temos dados de chegada sobre mais de 12.000 viagens. Embora possamos executar manualmente as consultas, além de compor scripts para produzir parcelas, é muito mais divertido colocar os dados on-line. Isso indica que é hora de desenvolver um site. Fazer as coisas parecem ótimas na web não é meu forte, então [Phil Everson] pulou para fazer algum desenvolvimento web.
Para adicionar uma restrição, desejamos tornar o site o mais acessível possível. Plataforma como ofertas de serviços como Heroku rodou cerca de US $ 20 por mês. Um servidor pessoal on-line do Digitalocean despesas de pelo menos US $ 5. A escolha menos cara foi fazer um site estático.
Uma página da Web estática é uma viagem de volta aos dias das Geocities. Você pode realizar arquivos, no entanto, não pode fazer nenhum tipo de processamento no servidor. Felizmente, isso funcionou bem para o tipo de dados que estávamos fornecendo. Todos os dados de viagem agregados podem ser exportados para arquivos JSON, bem como JavaScript no lado do cliente, podem tocar os dados, bem como parcelas de tela.
O site Trainstats consiste em alguns HTML, CSS, bem como JavaScript que é executado no seu navegador, bem como uma coleção de dados JSON com os dados. O conjunto de dados é gerado diariamentepor mais um trabalho do cron, que permite que todo o processamento ocorra em uma posição em um computador regional. Em seguida, a interface de linha de comando da Amazon Web Services é utilizada para empurrar os dados para S3, onde ele pode ser recuperado pelos usuários. Como os conjuntos de dados são pequenos, bem como S3 é barato, isso faz os custos menores que a hospedagem normal.
Os resultados
Este hack foi desenvolvido principalmente por diversão, no entanto, tem algumas descobertas fascinantes. No meu normal Ottawa para a rota de Toronto, sou muito mais propensos a selecionar o trem que é de uma maneira oportuna 84% do tempo, versus o que só lança na estação sem demora em 28% das viagens. Alguns outros viajantes podem descobrir as estatísticas benéficas também. De qualquer forma, foi um exercício fascinante em raspando um conjunto de dados, bem como fornecimento de um serviço da Web no barato.
Se você está pensando na fonte, está tudo no GitHub para a tomada. Nós gentilmente solicitamos que você não dDos por meio de trilho com ele.