我从以下网站下载所有文件(代表圣保罗巴西路线 - 巴西): http://www.cruzalinhas.com/linha.json?key=12967 并且想知道是否有一种更为优雅的方式。
基本上我所做的是为00000和99999之间的所有值的循环,用#####代替这个数字 http://www.cruzalinhas.com/linha.json?key=##### 检查网站是否存在,如果存在,则下载它。
为了提高工作效率,有没有办法知道所有的密钥?
我有所有文件,但这是一个非常常见的问题,我想知道是否有解决方案的快捷方式。
答案 0 :(得分:2)
我是Cruzalinhas的创建者,并提前道歉,因为没有(还)将网站从葡萄牙语翻译成英语,否则会使这些事情更加清晰(而且这个答案更短)。
您可能已经注意到,这些数据显示了圣保罗的公共汽车,地铁和火车的运输路线,这使得更容易找到他们的连接来规划有连接的路线(谷歌地图和其他人自动生成,有时会丢失通过更多互动搜索可以找到的路线。)
它使用geohashes进行路线之间的“廉价”邻近搜索),并从圣保罗运输公司(SPTrans)抓取其数据。
回答您的第一个问题:这些ID是来自原始网站的ID。然而,它们并不是很稳定(我已经看到他们删除了旧的ID而只是因为一条线路改变了路径而更换了一个旧的ID),所以Cruzalinhas不时地进行完全爬行并更新整个数据库(我是完全取代它,但谷歌应用引擎使它比平常更难。)
好消息:该网站是MIT许可下的开源(http://github.com/chesterbr/cruzalinhas)。文档仍然是葡萄牙语,但您最感兴趣的是命令行搜寻器sptscraper
。
获取数据的最有效方式是执行sptscraper.py download
,然后sptscraper.py parse
,然后sptscraper.py dump
并从那里导入。还有更多选项,这里有一个帮助屏幕的快速翻译:
Downloads and parses data from public transportation routes from the SPTrans website. It parses HTML files and stores the result in the linhas.sqlite file, which can be used in other applications, converted to JSON or used to update cruzalinhas itself. Commands: info Shows the number of pending updates download [id] Downloads HTML files from SPTrans (all or starting with id) resume Continues the download from the last line saved. parse Reads downloaded HTMLs and (soft) inserts/updates/deletes in the database. list Outputs a JSON with the route IDs from the database. dump [id] Outputs a JSON with all routes in the database (or just one) hashes Prints a JSON with the geohashes for each line (mapping to the routes that cross the hash) upload Uploads the pending changes in the database to cruzalinhas.
请注意,此数据未经SPTrans同意,即使这是公开信息,他们legally obliged这样做。在数字信息法的特定自由通过之前,该网站和刮刀是作为抗议的行为而创建的(尽管之前已有立法规范公共服务信息的可用性,因此在此不进行任何非法行为,或如果你负责任地使用它。)
由于这个原因(并且由于后端有点......“挑战”),scaraper在限制请求时非常小心,以避免服务器过载。它使爬行跨度达到几个小时,但您不希望超载服务(这可能会迫使他们阻止您,甚至更改站点以使爬行更加困难)。
我最终会对该代码进行完全重写(这可能是我几年前编写的第一个Python / App Engine代码,并且是一个快速的黑客,专注于揭示这些公共数据在SPTrans范围之外的有用性'网站)。它将有一个更健全的爬行过程,只需点击一下就可以下载最新数据,并可能在API上提供完整的行列表。
现在,如果您只想要最后一次抓取(我在一两个月前做过),请与我联系,我很乐意向您发送sqlite / JSON文件。