CFR SA, a empresa romena de administração de infraestrutura ferroviária nacional, oferece um serviço de informações on-line ao vivo (baseado em formulários ASPX com envio de postback viewstate e validação de eventos) para obter dados quase em tempo real sobre partidas, chegadas e plataformas onde os trens chegam às estações e atrasos nas viagens e atualizações. Na época, todo esse sistema carece de uma API ou mesmo de uma interface decente, fácil de usar e fácil de encontrar para os usuários finais.
Esta API baseada em Flask extrai dados do webapp CFR conforme solicitado no URL API Endpoint e gera dados JSON reutilizáveis. O programa extrai todas as informações da variável __VIEWSTATE do ASP.Net.
Você precisa do Python 3.6+ e do Pipenv instalados em seu sistema.
$ apto instalar python3 python3-pip $ pip3 instalar pipenv
Clone o repositório e instale as dependências do módulo:
$ git clone https://github.com/BodoMinea/cfr-iris-scraper.git $ cd cfr-raspador de íris $ instalação do pipenv
Execute o servidor API conforme especificado na documentação do Flask.
$ pipenv executar frasco executar
Pode ser necessário editar o Pipfile para corresponder à sua versão local do Python para instalar com êxito
python_version = "3.6.9"
O Flask escuta por padrão apenas solicitações locais. É aconselhável mantê-lo assim e instalar um proxy reverso para implantações maiores, mas para acessar sua máquina de teste pela LAN, execute com:
$ pipenv execute flask execute --host 0.0.0.0
Isso será vinculado a todas as interfaces disponíveis.
Agora você pode apontar seu navegador para http://localhost:5000/station/ID para ver a mágica. ID é o código exclusivo da unidade de estação; uma lista é fornecida pelo endpoint http://localhost:5000/get-stations/.
Por exemplo, para obter um objeto JSON com o quadro atual de partida/chegada e informações de atraso para a estação ferroviária de Bucareste Norte (a principal e maior em nosso país), você apontaria seu navegador ou a variável de URL para qualquer aplicativo que estiver consumindo os dados para: http://localhost:5000/station/10017.
Da mesma forma que você pode obter os trens atuais em uma determinada estação ferroviária, você pode obter as informações atuais de um determinado trem. O CFR fornece informações como atrasos, a última estação pela qual o trem passou (com atraso de 7 minutos), a próxima estação e outras informações úteis.
Basta apontar seu navegador para http://localhost:5000/train/ID, onde ID é o número exclusivo do trem. Você pode obter esses IDs no feed de informações da estação. Por exemplo, você pode recuperar as informações do trem IR 1651 de Bucareste Norte para Suceava Norte (válido a partir de abril de 2017) acessando http://localhost:5000/train/1651.
Há também um cliente web incluído na API. Vá para http://localhost:5000/static/station.html, http://localhost:5000/static/train.html ou http://localhost:5000/static/train.html?tren=9351 (trem predefinido número) para vê-lo.
Embora os aplicativos oficiais funcionem, mas possam não parecer tão bons, os desenvolvedores romenos fizeram o possível para criar alguns projetos de código aberto e serviços on-line realmente interessantes relacionados a transporte e infraestrutura. Veja este mapa ao vivo, este conversor proprietário para GTFS, este planejador de viagem, etc.
Usando esta API e outros recursos públicos, você pode criar seu próprio estilo de painel de partida de estação, serviço de notificação de atraso, aplicativo móvel de aparência interessante, enquanto aprende como programar e trabalhar com dados estruturados.
Este é um projeto totalmente de código aberto, construído em módulos e bibliotecas de código aberto e licenciado sob Do What the Fuck You Want to Public License Versão 2.
Além disso, você é totalmente responsável pelo que faz com ele - lembre-se de que a CFR SA e a InfoFer (a empresa de TI estatal das ferrovias que desenvolve seu software) não são particularmente transparentes ou amigáveis para desenvolvedores terceirizados. Se você fizer scraping em massa ou desenvolver algum serviço acessível ao público que gere muito tráfego do mesmo servidor para eles ou clone seus dados em um banco de dados por vários motivos, poderá ter alguns problemas, como esse colega entusiasta fez ao criar um web planejador de viagem usando o horário do CFR Calatori em seu site.
Mas para mexer, brincar e trabalhar com dados em tempo real que claramente não podem confundir ninguém se o erro não for do próprio CFR, você deve estar bem e do lado certo da lei, pelo menos pela minha experiência. Talvez eles ofereçam sua própria API com regras e licenciamento adequados em algum momento.
As solicitações não são autenticadas e nenhuma limitação de taxa é implementada, portanto não está de forma alguma pronta para ser exposta na web.
Isso não é particularmente rápido, porque a página do CFR também não é. Você provavelmente desejará solicitações e cache em segundo plano. Após a solicitação inicial ser feita, ele aguardará 8 segundos antes de analisar os dados. Se os dados não tiverem sido exibidos na página da web, serão aguardados mais 20 segundos. Depois disso, a API gerará um objeto em branco - isso pode significar que o serviço web copiado está inativo, é muito lento para responder ou não há realmente nenhuma viagem atual parando naquela estação específica (à noite ou em uma pequena parada, por exemplo). exemplo). Corrigido: se a API estiver inativa, você receberá um status de erro 5xx.
Isso é raspagem e análise, portanto, qualquer atualização estrutural na página do CFR, embora altamente improvável em um futuro próximo, pode quebrar isso.
O feed de informações do trem não fornece detalhes sobre os atrasos do trem e outras informações úteis que o Infofer oferece com seu serviço. Isso será atualizado no futuro. Corrigido: todas as informações públicas do IRIS são geradas nesta API.
Serviço web de informação pública fornecido pela CFR SA através da Informatica Feroviara: http://appiris.infofer.ro/SosPlcRO.aspx, http://appiris.infofer.ro/MyTrainRO.aspx, http://appiris.infofer.ro /MersTrenRo.aspx. Estas são informações da administração da infraestrutura e não de uma transportadora de passageiros específica. Os horários oficiais dos passageiros podem ser encontrados aqui: http://mersultrenurilor.infofer.ro, e fonte de dados XML estáticos com horários atualizados no final de cada ano: http://data.gov.ro/organization/sc-informatica-feroviara- sa