Pentium.Labs

System全家桶:https://zhuanlan.zhihu.com/c_1238468913098731520

导航

panoramio

记得2005年Google Earth刚发布那时候,里面集成了一个功能叫Panoramio,它允许用户上传自己拍的照片,并在地图坐标上标记出来。在那个还没有全景地图,也没有微博和Instagram的年代,我在Panoramio上看到了世界很多地方的风景,而且多年来上面也积累了很多老照片。

(图片来自网络)

 

然而这个功能在2017年已经被google彻底关闭了...上面的资料也全部被删除了。

最近我突然想搜集一些家乡的老照片,找了一圈什么都没找到...于是想起了多年前用过的Panoramio,记得当时上面还是有很多老照片的。但是有什么方法能穿越到过去找到那些照片呢?

幸运的是,还有很多记忆被保存了下来:

  1. 在2017年Panoramio被彻底关闭之前,Internet Archive对Panoramio的网页版进行了整站镜像,并且挂到了他们网站上(https://archive.org/details/archiveteam_panoramio)。另外通过wayback machine也可以访问到网页版的镜像(例如:http://web.archive.org/web/20161011225620/http://www.panoramio.com/photo/15

  2. 有爱好者甚至专门建立了网站来记录相关资料(https://www.archiveteam.org/index.php?title=Panoramio

但是Internet Archive的镜像有两个问题:1. 使用的是一种专有的格式,打开非常麻烦    2. archive是以html的形式保存的网站,但并没有对其进行索引。假如想找title包含某地的图片,或者指定经纬度附近的图片,那就无解了。    于是我就想,可以把archive存储的html全部抓取下来,然后对其进行索引,就可以像当年那样查找照片啦!

[2]网站上我们可以找到Panoramio当年的网站结构:photo id从0到134000000000按顺序排序,直接加到url末尾即可。最早的图片是15号,上传于July 29, 2005,最晚的是134000002,上传于Oct.4th.2016。另外简单分析它的html源码,我们还可以从中提取出每张图片(在archive镜像上)的下载地址,title,其他用户的评论,以及最重要的坐标经纬度信息(分析发现Panoramio从2005年建立到2017年下线,一共用过三种版本的网页结构,但它们都是非常类似的。坐标信息也记录在html内,用正则表达式就可以解析出来)。有了这些我们就可以先写个爬虫抓取下来啦!

因为任务比较简单,我就没有用复杂的scrapy,用了两天的业(mo)余(yu)时间直接自己实现了。我试验了多进程(multiprocessing)和多线程(threading.Thread)两种方法。多进程虽然占资源多一点,但是速度要快一些,也稳定一些(可能是我多线程写的不好hhhh)。因为我在抓取的过程中还要解析html找出坐标等信息,而python中多进程可以充分利用多核cpu,所以会好一些。

另外中间还有一些坑需要考虑:1. 由于网络因素有些页面第一次抓取可能会失败,我设置了一个进程共享的Queue,只要抓取失败了就加回到队尾,最后再集中处理。另外为了防止我的ip访问数过多被ban掉,我开了10台vps作为代理服务器,每个进程(线程)都从中随机选一个,每次完成一部分爬虫任务后将所有代理服务器都换一次公网ip。  2. 在本地端我开了四个节点(在ebay上淘了几台古董电脑),每台都使用不同的账号上网,这样就躲开了公寓对单个账号的带宽限制。  3. 因为硬盘容量有限,第一步我先只爬取了坐标经纬度和html纯文本用于检索,图片就先不管啦。毕竟有了id之后就可以直接得到图片的下载地址。

这样设置好之后,每个节点根据电脑配置开50-100个线程,爬取每一小块(2000000个页面)大约用时6-8小时。考虑到都是零碎的小文件,而且是古董级的机器,这个速度我已经比较满意啦(其实多开一些代理,多加节点还能跑更快,但是买不起了....)。

 

经过漫长的爬虫之后,我们得到了坐标和文本数据。抓取下来的格式是这样的:

 

抓取下来后一个重要的任务就是对它们建立索引。网页文本还比较简单,用elasticsearch即可。坐标信息就有点麻烦了...但是当年我都是通过坐标查找到附近图片的(因为大家都懒得写title...),所以对坐标信息建索引其实比文本还重要。

我们的需求可以抽象为:在约1.3亿个二维坐标点中,找出距离某个给定的点最近的K个点,或者在某个坐标区域内的所有点。

 

 

 

https://blog.csdn.net/zhaoyingm/article/details/84078084

https://www.cnblogs.com/huangguifeng/p/7632799.html

https://blog.csdn.net/stone9159/article/details/80696988

https://www.cnblogs.com/Fantinai/p/8433136.html

https://blog.csdn.net/wonengguwozai/article/details/80325745

https://www.v2ex.com/t/301628

posted on 2006-07-21 17:28  Pentium.Labs  阅读(451)  评论(0编辑  收藏  举报



Pentium.Lab Since 1998