抓取epsg.io的内容
简述
epsg.io是一个查询EPSG坐标系相关信息的好网站,内容很全。有各种格式的定义可以直接下载,也有坐标系的范围名称等相关信息,所以想抓取这些信息下来,方便对接各个系统。
epsg.io本身是开源的,代码在https://github.com/klokantech/epsg.io上,但是这个我分析出数据来源,应该是在epsg.io/gml/gml.sqlite文件中,但是我打开这个文件发现没有相关的记录。
抓取说明
抓取的时候使用的是proj4项目里的nad/epsg文件中的记录作为索引,找到对应的epsg代码去拼成对应url去下载。
下面是代码,用的是libcurl进行的相关操作。日志记录简单的用了一下glog,可以去掉,去掉之后就是纯C的代码了。
抓取的结果直接写在程序目录下的epsg.io目录下,请先创建好这个目录。
保存的html文件的解析,可以参考HTML解析库Gumbo简单使用记录
抓取好的文件可以在这里epsg.io.7z下载,解压压缩之后会有三百多兆,共5754个文件。
分析后提取的内容,生成了一个超大的JSON文件,可以再这里epsg.io.json.7z下载。

我把抓取的内容处理成json后,又将其导入了MongoDB数据库。
这里将数据备份后上传在这里https://files.cnblogs.com/files/oloroso/epsg.io.mongodb.7z,这个数据可以直接使用mongorestore工具恢复到数据库。
导入MongoDB的数据中,wgs84_bound字段名改为84box,proj_bound字段改为projbox,中心点坐标经过处理,不会有null出现。
代码
// g++ epsg.spider.cpp -o epsg.spider -lcurl  -lglog -lpthread
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <curl/curl.h>
#include <glog/logging.h>
int downpage(int epsgcode)
{
	int ret = 0;
	char url[1024];
	sprintf(url,"./epsg.io/%d.html",epsgcode);
	FILE* fp = fopen(url,"wb");
	if(fp == NULL){
		fprintf(stderr,"\n创建输出文件失败i\n");
		ret = -1;
		return ret;
	}
	sprintf(url,"http://epsg.io/%d",epsgcode);
	CURL *hnd = curl_easy_init();
	curl_easy_setopt(hnd, CURLOPT_CUSTOMREQUEST, "GET");
	curl_easy_setopt(hnd, CURLOPT_URL, url);
	curl_easy_setopt(hnd, CURLOPT_COOKIEFILE, "./epsg.spider.cookie");
	//curl_easy_setopt(hnd, CURLOPT_COOKIE, cookie_buffer);
	curl_easy_setopt(hnd, CURLOPT_WRITEDATA, fp);
	CURLcode res = (CURLcode)curl_easy_perform(hnd);
	if(res != CURLE_OK) {
		fprintf(stderr,"\n%s curl_easy_perform failed:%s\n",url,curl_easy_strerror(res));
		ret = -2;
	}
	fclose(fp);
	curl_easy_cleanup(hnd);
	return ret;
}
int main(int c,char** v)
{
       // 打开epsg文件
	FILE* fp = fopen("epsg","r");
	if(fp == NULL){
		puts("open epsg fiaild");
		return 0;
	}
	google::InitGoogleLogging(v[0]);
	FLAGS_log_dir = ".";
	  /*
	   * 这个函数只能用一次,如果这个函数在curl_easy_init函数调用时还没调用,
	   * 它讲由libcurl库自动调用,所以多线程下最好在主线程中调用一次该函数以防止在线程
	   * 中curl_easy_init时多次调用
	   */
	  curl_global_init(CURL_GLOBAL_ALL);
	char s[4096];
	puts("开始下载:");
	while(!feof(fp) && limit > 0){
		int epsgcode = 0;
		static char name[1024];
		static char proj[1024];
		fgets(s,sizeof s,fp);
		if(s[0] == '#' ){
			sscanf(s,"# %[^\n]s",name);
		}
		sscanf(s,"<%d> %[^\n<]s",&epsgcode,proj);
		if(epsgcode == 0){
			continue;
		}
		char path[128];
		sprintf(path,"./epsg.io/%d.html",epsgcode);
		struct stat st;
		if(stat(path,&st) == 0) {
			if(st.st_size > 1024){
				// printf("%5d   %s exsits\n",epsgcode,path);
				continue;
			}
		}
		printf("\r正在下载:http://epsg.io/%d ",epsgcode);
		LOG(INFO) << "begin download http://epsg.io/"<<epsgcode;
		if( downpage(epsgcode) != 0){
			break;
		}
		LOG(INFO) << "finish download http://epsg.io/"<<epsgcode;
	}
	//在结束libcurl使用的时候,用来对curl_global_init做的工作清理。类似于close的函数
	curl_global_cleanup();
	fclose(fp);
	return 0;
}
												
											抓取epsg.io的内容的更多相关文章
- python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息,抓取政府网新闻内容
		
python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI,采用Python语言编写 ...
 - C#抓取AJAX页面的内容
		
原文 C#抓取AJAX页面的内容 现在的网页有相当一部分是采用了AJAX技术,所谓的AJAX技术简单一点讲就是事件驱动吧(当然这种说法可能很不全面),在你提交了URL后,服务器发给你的并不是所有是页面 ...
 - php抓取网页中的内容
		
以下就是几种常用的用php抓取网页中的内容的方法.1.file_get_contentsPHP代码代码如下:>>>>>>>>>>>&g ...
 - Java 抓取网页中的内容【持续更新】
		
背景:前几天复习Java的时候看到URL类,当时就想写个小程序试试,迫于考试没有动手,今天写了下,感觉还不错 内容1. 抓取网页中的URL 知识点:Java URL+ 正则表达式 import jav ...
 - 【新手向】使用nodejs抓取百度贴吧内容
		
参考教程:https://github.com/alsotang/node-lessons 1~5节 1. 通过superagent抓取页面内容 superagent .get('http://www ...
 - 还没被玩坏的robobrowser(4)——从页面上抓取感兴趣的内容
		
背景 本节的知识实际上是属于Beautiful Soup的内容. robobrowser支持Beautiful Soup,一般来说通过下面3个方法获取页面上感兴趣的内容 find find_all s ...
 - python3抓取淘宝评论内容
		
好久没有写爬虫了,今天研究了下淘宝商品评论的内容. 一开始用最简单的方法,挂代理,加请求头,对网页请求,是抓不到数据的,在网上找了一些相关文章,也基本已经过时了,就是网站逻辑有改动,用旧的方法是抓不到 ...
 - 用C#抓取AJAX页面的内容
		
现在的网页有相当一部分是采用了AJAX技术,不管是采用C#中的WebClient还是HttpRequest都得不到正确的结果,因为这些脚本是在服务器发送完毕后才执行的! 但我们用IE浏览页面时是正常的 ...
 - sax 动态切换 抓取感兴趣的内容(把element当做documnet 处理)
		
由switch 类触发事件 import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.hel ...
 
随机推荐
- 基于bootstrap的基本模板
			
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
 - ERP退货系统管理(四十五)
			
添加的存储过程:(添加退货申请信息的存储过程) CREATE PROCEDURE [dbo].[BioBackSendGoods_ADD] @SendBackID INT OUTPUT, ), @Ap ...
 - hdu 5256  最少修改多少个数 能使原数列严格递增  (LIS)
			
Problem Description我们有一个数列A1,A2...An,你现在要求修改数量最少的元素,使得这个数列严格递增.其中无论是修改前还是修改后,每个元素都必须是整数. 请输出最少需要修改多少 ...
 - Linux学习 用户管理
			
0.新建用户 sudo useradd -d /home/zookeeper -m zookeeper -d 指定用户组目录 -m 如果前面指定的用户组目录不存在,就创建改目录 passwd 1./e ...
 - [HNOI2010]CITY 城市建设
			
问题: 给一张图,支持边长度修改,求MST 题解: 自己想就想不到了.. 考虑cdq分治 1.首先求出一定有用的边 对于未处理的边,全部设为-INF,求一次MST,出现在MST上的边一定最终出现在后面 ...
 - day5模块学习--re正则模块
			
1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十 ...
 - Python subprocess方法
			
import subprocess #subprocess.call("df -h",shell=True,stdout=subprocess.PIPE)#打印到视图,但是不能保存 ...
 - BZOJ1607 [Usaco2008 Dec]Patting Heads 轻拍牛头 筛法
			
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1607 题意概括 给出n个数,每一个数字<1000000,对于每一个数,让你求剩余的n-1个数 ...
 - PHP通过PDFParser解析PDF文件
			
之前一直找到的资料都是教你怎么生成pdf文档,比如:TCPDF.FPDF.wkhtmltopdf.而我碰到的项目里需要验证从远程获取的pdf文件是否受损.文件内容是否一致这些问题,这些都不能直接提供给 ...
 - def 函数的不定长函数
			
*args 不定长函数传值可直接传,也可以拆包传,参数默认为元组: 参数为字典的时候: