本文更新(移步查阅): 19-04-15 新采集了2018的省市区三级坐标和行政区域边界 19-03-22 采集了2018的城市数据 18-11-28 采集了2017的城市数据
数据下载 GitHub:https://github.com/xiangyuecn/AreaCity-JsSpider-StatsGov/releases 相关更新情况,请查阅我发布的其他文章,本文以下内容不再更新。
18-01-28早上6:30的火车,从三亚回老家,票难买啊。好激动~ 声明:文中涉及到的数据和第三方接口、url仅供学习使用,请勿它用~
这几天都在磨着搭建本地测试环境,看到省市区数据表里面是空的,想着以前的老数据还是13年采集的,含省市区县4级数据共4.8万条,时间久了,使用过程中发现有些新的城市名称数据库中没有,县级数据从来就没有用到过,想着还是重新采集一份。
新采集的省市区数据有3589条,这次并没有把县级数据采过来,需要的时候再添加也挺好。
数据来源
国家统计局统计标准《2016年统计用区划代码和城乡划分代码(截止2016年07月31日)》,这个是2017-05-16发布的,当前是最新的。
数据采集
对于数据采集,根据工作需要,对于一些小的数据采集功能有些接触。因为对html和js熟些,很早以前就用IE浏览器对本地html文件支持任意跨域ajax请求数据、和支持读写Excel文件,就直接写一个html文件作为采集工具给别人使用,批量查询人员资料、考试结果什么的功能。所以采集省市区数据主要用的js。
1. 抓取原始数据
打开网页http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2016/index.html
省份的数据就有了,进入市级页面,然后进入区级页面,还可以进入县级页面。整个流程地址结构非常简单,数据格式也很好提取。
进入网页后打开浏览器控制台,执行下面代码,这段代码仅仅包含采集省市区的,把县级的阉割掉了,13年的老代码有县级的。很早以前写的代码,风格有点丑,不过能能正常使用就是好的,这个采集是“单线程的”,因为这些数据少,速度并不慢:
( function ( ) {
if ( ! window. URL ) {
throw new Error ( "浏览器版本太低" ) ;
} ;
function ajax ( url, True, False) {
var ajax= new XMLHttpRequest ( ) ;
ajax. timeout= 1000 ;
ajax. open ( "GET" , url) ;
ajax. onreadystatechange = function ( ) {
if ( ajax. readyState== 4 ) {
if ( ajax. status== 200 ) {
True ( ajax. responseText) ;
} else {
False ( ) ;
}
}
}
ajax. send ( ) ;
}
function msg ( ) {
console. log. apply ( console, arguments) ;
}
function cityClass ( name, url, code) {
this . name= name;
this . url= url;
this . code= code;
this . child= [ ] ;
this . tryCount= 0 ;
}
cityClass. prototype= {
getValue: function ( ) {
var obj= { name: this . name, code: this . code, child: [ ] } ;
for ( var i= 0 ; i< this . child. length; i++ ) {
obj. child. push ( this . child[ i] . getValue ( ) ) ;
}
return obj;
}
}
function load_all ( True) {
var path= "http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2016" ;
ajax ( path+ "/index.html" , function ( text) {
var reg= /href='(.+?)'>(.+?), match;
var idx;
if ( ( idx= text. indexOf ( "") ) + 1 ) {
reg. lastIndex= idx;
while ( match= reg. exec ( text) ) {
var url= match[ 1 ] ;
if ( url. indexOf ( "//" ) == - 1 && url. indexOf ( "/" ) != 0 ) {
url= path+ "/" + url;
}
var name= match[ 2 ] ;
DATA . push ( new cityClass ( name, url, 0 ) ) ;
}
True ( ) ;
} else {
msg ( "未发现省份数据" ) ;
}
} , function ( ) {
msg ( "读取省份列表出错" , "程序终止" ) ;
} ) ;
}
function load_shen ( True, False) {
var city= DATA [ JD . shen] ;
city. tryCount++ ;
if ( city. tryCount> 3 ) {
msg ( "读取省份[" + city. name+ "]超过3次" ) ;
False ( ) ;
return ;
} ;
function get ( ) {
msg ( "读取省份[" + city. name+ "]" , getJD ( ) ) ;
save ( ) ;
city. child[ JD . si] . tryCount= 0 ;
load_si ( function ( ) {
JD . shen++ ;
if ( JD . shen>= DATA . length) {
JD . shen= 0 ;
True ( ) ;
return ;
} ;
DATA [ JD . shen] . tryCount= 0 ;
load_shen ( True, False) ;
} , function ( ) {
False ( ) ;
} ) ;
}
if ( city. child. length) {
get ( ) ;
} else {
ajax ( city. url, function ( text) {
var reg= /.+?href='(.+?)'>(.+?)<.+?'>(.+?);
var match;
while ( match= reg. exec ( text) ) {
var url= match[ 1 ] ;
if ( url. indexOf ( "//" ) == - 1 && url. indexOf ( "/" ) != 0 ) {
url= city. url. substring ( 0 , city. url. lastIndexOf ( "/" ) ) + "/" + url;
}
var code= match[ 2 ] ;
var name= match[ 3 ] ;
city. child. push ( new cityClass ( name, url, code) ) ;
}
JD . si= 0 ;
get ( ) ;
} , function ( ) {
load_shen ( True, False) ;
} ) ;
} ;
}
function load_si ( True, False) {
var shen= DATA [ JD . shen] ;
var city= shen. child[ JD . si] ;
city. tryCount++ ;
if ( city. tryCount> 3 ) {
msg ( "读取城市[" + city. name+ "]超过3次" ) ;
False ( ) ;
return ;
} ;
function get ( ) {
msg ( "___读取城市[" + city. name+ "]" , getJD ( ) ) ;
city. child[ JD . xian] . tryCount= 0 ;
JD . si++ ;
if ( JD . si>= shen. child. length) {
JD . si= 0 ;
True ( ) ;
return ;
} ;
shen. child[ JD . si] . tryCount= 0 ;
load_si ( True, False) ;
}
if ( city. child. length) {
get ( ) ;
} else {
ajax ( city. url, function ( text) {
var reg= /class='(?:countytr|towntr)'.+?<\/tr>/ig ;
var match;
while ( match= reg. exec ( text) ) {
var reg2= /class='(?:countytr|towntr)'.+?(?: (.+?)<.+?'>(.+?)<| (.+?)<.+? (.+?)<)/ig;
var match2;
if ( match2= reg2. exec ( match[ 0 ] ) ) {
var url= match2[ 1 ] || "" ;
if ( url. indexOf ( "//" ) == - 1 && url. indexOf ( "/" ) != 0 ) {
url= city. url. substring ( 0 , city. url. lastIndexOf ( "/" ) ) + "/" + url;
}
var code= match2[ 2 ] || match2[ 4 ] ;
var name= match2[ 3 ] || match2[ 5 ] ;
city. child. push ( new cityClass ( name, url, code) ) ;
} else {
msg ( "未知城市模式:" ) ;
msg ( city. url) ;
msg ( match[ 0 ] ) ;
throw new Error ( "end" ) ;
}
}
JD . xian= 0 ;
get ( ) ;
} , function ( ) {
load_si ( True, False) ;
} ) ;
} ;
}
function getJD ( ) {
var str= "省:" + ( JD . shen+ 1 ) + "/" + DATA . length;
var shen= DATA [ JD . shen] ;
if ( shen) {
str+= " 市:" + ( JD . si+ 1 ) + "/" + shen. child. length;
var si= shen. child[ JD . si] ;
if ( si) {
str+= " 县:" + ( JD . xian+ 1 ) + "/" + si. child. length;
} else {
str+= " 县:" + JD . xian;
}
} else {
str+= " 市:" + JD . si+ " 县:" + JD . xian;
}
return str;
}
function save ( ) {
}
var DATA = [ ] ;
var JD ;
window. RunLoad = function ( shen, si, xian) {
RunLoad. T1 = Date. now ( ) ;
JD = {
shen: shen|| 0
, si: si|| 0
, xian: xian|| 0
}
function get ( ) {
DATA [ JD . shen] . tryCount= 0 ;
load_shen ( function ( ) {
console. log ( "完成:" + ( Date. now ( ) - RunLoad. T1 ) / 1000 + "秒" ) ;
save ( ) ;
var data= [ ] ;
for ( var i= 0 ; i< DATA . length; i++ ) {
data. push ( DATA [ i] . getValue ( ) ) ;
}
var url= URL . createObjectURL (
new Blob ( [
new Uint8Array ( [ 0xEF , 0xBB , 0xBF ] )
, "var CITY_LIST="
, JSON . stringify ( data, null , "\t" )
]
, { "type" : "text/plain" } )
) ;
var downA= document. createElement ( "A" ) ;
downA. innerHTML= "下载查询好城市的文件" ;
downA. href= url;
downA. download= "data.txt" ;
document. body. appendChild ( downA) ;
downA. click ( ) ;
msg ( "--完成--" ) ;
} , function ( ) {
save ( ) ;
msg ( "当前进度:" , getJD ( ) ) ;
} ) ;
}
var data= localStorage[ "load_data" ] ;
if ( data) {
DATA = JSON . parse ( data) ;
get ( ) ;
} else {
load_all ( get ) ;
}
}
} ) ( ) ;
RunLoad ( )
采集截图:
2. 处理数据和拼音标注
数据处理就简单些了,比如编号格式化、名称格式化等。
拼音标注:这个需要找一个接口对文字进行拼音翻译,只有一个要求:重庆能正常的翻译成chong qing即可,翻译成zhong qing的就low了。满足这个条件,百度上搜索到的翻译小网站80%就被干掉了。
浏览器中打开找到的翻译接口http://www.qqxiuzi.cn/zh/pinyin/
,截止到目前是能正常调用的,因为要用ajax请求数据,在页面里面就没有跨域的问题,查看网页源码,把token值记录下来,这个网站翻译请求需要带这个token,注意~刷新页面要重新获取:
拼音这个因为数据量比较多,采用了“4个线程”采集,先把第一步采集到的文件打开,把数据复制到打开的翻译网站浏览器控制台里面执行(相当于把数据导入),然后执行下面代码:
window. PageToken= window. PageToken|| "" ;
var FixTrim = function ( name) {
return name. replace ( /^\s+|\s+$/g , "" ) ;
} ;
var CITY_LIST2 ;
var QueryPinYin = function ( end) {
if ( ! window. PageToken) {
console. error ( "Need PageToken" ) ;
return ;
} ;
var ids= [ ] ;
var fixCode = function ( o) {
if ( o. deep== 0 ) {
o. orgCode= "0" ;
} else {
o. orgCode= o. code;
if ( o. deep== 1 ) {
o. code= o. code. substr ( o, 4 ) ;
} else {
o. code= o. code. replace ( /(000000|000)$/g , "" ) ;
} ;
} ;
return o;
} ;
var fix = function ( o, p) {
var name= o. name;
if ( o. deep== 0 ) {
name= name. replace ( /(市|省|(维吾尔|壮族|回族)?自治区)$/ig , "" ) ;
} else if ( o. deep== 1 ) {
if ( name== "市辖区" ) {
name= p. o2. name;
} else if ( /行政区划$/ig . test ( name) ) {
name= "直辖市" ;
} else if ( name. length> 2 ) {
name= name. replace ( /市$/ig , "" ) ;
} ;
} else {
if ( name. length> 2 && name!= "市辖区"
&& ! /(自治.|地区|矿区)$/ . test ( name) ) {
name= name. replace ( /(市|区|县|镇|管委会|街道办事处)$/ig , "" ) ;
} ;
} ;
var o2= {
name: name
, ext_name: o. name
, id: + o. code|| 0
, ext_id: + o. orgCode
, pid: p&& + p. code|| 0
, deep: o. deep
} ;
o. o2= o2;
return o2;
} ;
for ( var i= 0 ; i< CITY_LIST . length; i++ ) {
var shen= CITY_LIST [ i] ;
shen. deep= 0 ;
for ( var i2= 0 ; i2< shen. child. length; i2++ ) {
var si= shen. child[ i2] ;
if ( ! shen. code) {
shen. code= si. code. substr ( 0 , 2 ) ;
ids. push ( fix ( fixCode ( shen) ) ) ;
} ;
si. deep= 1 ;
ids. push ( fix ( fixCode ( si) , shen) ) ;
for ( var i3= 0 ; i3< si. child. length; i3++ ) {
var qu= si. child[ i3] ;
qu. deep= 2 ;
ids. push ( fix ( fixCode ( qu) , si) ) ;
} ;
} ;
} ;
CITY_LIST2 = ids;
var idx= - 1 ;
var run = function ( stack) {
stack= + stack|| 0 ;
idx++ ;
if ( idx>= ids. length) {
thread-- ;
if ( thread== 0 ) {
end ( ) ;
} ;
return ;
} ;
var idx_= idx;
var id= ids[ idx] ;
if ( id. P ) {
stack++ ;
if ( stack% 50 == 0 ) {
setTimeout ( function ( ) { run ( ) } ) ;
} else {
run ( stack) ;
} ;
return ;
} ;
var name= id. name;
var tryCount= 0 ;
var tryLoad = function ( ) {
$. ajax ( {
url: "/zh/pinyin/show.php"
, data: "t=" + encodeURIComponent ( name) + "&d=1&s=null&k=1&b=null&h=null&u=null&v=1&y=null&z=null&token=" + PageToken
, type: "POST"
, dataType: "text"
, timeout: 1000
, error: function ( e) {
if ( tryCount> 3 ) {
console. error ( "--QueryPinYin error--" + e) ;
run ( ) ;
return ;
} ;
tryCount++ ;
tryLoad ( ) ;
}
, success: function ( txt) {
txt= FixTrim ( txt. replace ( /<.+?>/g , "" ) . replace ( /\s+/g , " " ) ) ;
id. P = txt;
console. log ( "--" + idx_+ "-QueryPinYin " + name+ ":" + txt+ " --" ) ;
run ( ) ;
}
} ) ;
} ;
tryLoad ( ) ;
} ;
var thread= 4 ;
run ( ) ;
run ( ) ;
run ( ) ;
run ( ) ;
} ;
var ViewDown = function ( ) {
console. log ( "完成:" + ( Date. now ( ) - RunPinYin. T1 ) / 1000 + "秒" ) ;
window. CITY_LIST_PINYIN = CITY_LIST2 ;
var url= URL . createObjectURL (
new Blob ( [
new Uint8Array ( [ 0xEF , 0xBB , 0xBF ] )
, "var CITY_LIST_PINYIN="
, JSON . stringify ( CITY_LIST2 , null , "\t" )
]
, { "type" : "text/plain" } )
) ;
var downA= document. createElement ( "A" ) ;
downA. innerHTML= "下载查询好城市的文件" ;
downA. href= url;
downA. download= "data-pinyin.txt" ;
document. body. appendChild ( downA) ;
downA. click ( ) ;
} ;
var RunPinYin = function ( ) {
RunPinYin. T1 = Date. now ( ) ;
QueryPinYin ( ViewDown) ;
} ;
if ( window. CITY_LIST ) {
if ( ! PageToken) {
PageToken= prompt ( "Token" ) ;
} ;
RunPinYin ( ) ;
} else {
console. error ( "data.txt未输入" ) ;
} ;
这时候会提示输入token,把刚才找到的token粘贴进去,然后就开始工作了:
还挺快的,2分钟多点全部翻译完成。
3. 格式化成CSV
数据全部有了,导出成比较正常使用的格式,CSV最好了。这个导出比较简单,任意网页控制台把第二部保存的文件打开,复制数据到任意网页控制台,然后输入以下代码:
var FixTrim = function ( name) {
return name. replace ( /^\s+|\s+$/g , "" ) ;
} ;
function CSVName ( name) {
return '"' + FixTrim ( name) . replace ( /"/g , '""' ) + '"';
} ;
var CITY_CSV = [ "id,pid,deep,name,pinyin_prefix,pinyin,ext_id,ext_name" ] ;
for ( var i= 0 ; i< CITY_LIST_PINYIN . length; i++ ) {
var o= CITY_LIST_PINYIN [ i] ;
var pf= "" ;
var pinyin= FixTrim ( o. P ) . toLowerCase ( ) ;
var ps= pinyin. split ( " " ) ;
for ( var j= 0 ; j< ps. length&& j< 3 ; j++ ) {
pf+= ps[ j] . substr ( 0 , j== 0 ? 2 : 1 ) ;
} ;
CITY_CSV . push ( o. id+ "," + o. pid+ "," + o. deep+ "," + CSVName ( o. name)
+ "," + CSVName ( pf) + "," + CSVName ( o. P )
+ "," + CSVName ( o. ext_id+ "" ) + "," + CSVName ( o. ext_name) ) ;
} ;
var url= URL . createObjectURL (
new Blob ( [
new Uint8Array ( [ 0xEF , 0xBB , 0xBF ] )
, CITY_CSV . join ( "\n" )
]
, { "type" : "text/plain" } )
) ;
var downA= document. createElement ( "A" ) ;
downA. innerHTML= "下载查询好城市的文件" ;
downA. href= url;
downA. download= "ok_data.csv" ;
document. body. appendChild ( downA) ;
downA. click ( ) ;
OK,数据全部搞完:
数据问题
id编号和国家统计局的编号基本一致,方便以后更新。
id重复项目前是没有(已优化过了),不过以前采集后直接对统计局的编号进行简单缩短后会有重复现象(算是精度丢失)。
拼音前缀取的是第一个字前两个字母和后两个字首字母,意图是让第一个字相同名称的尽量能排序在一起。排序1:黑龙江helj、湖北hub、湖南hun
;排序2:湖北hb、黑龙江hlj、湖南hn
,排序一胜出。
因为区名字是直接去掉市、区后缀,存在那么几对名字变得完全一样的,需要手动吧市区后缀加上,不然会产生小问题。
最终数据已上传了一份到CSDN,含所有代码和本文档:http://download.csdn.net/download/xiangyuecn/10226964
,GitHub下载最新数据
你可能感兴趣的:(采集)
QQ群采集助手,精准引流必备神器
2401_87347160
其他 经验分享
功能概述微信群查找与筛选工具是一款专为微信用户设计的辅助工具,它通过关键词搜索功能,帮助用户快速找到相关的微信群,并提供筛选是否需要验证的群组的功能。主要功能关键词搜索:用户可以输入关键词,工具将自动查找包含该关键词的微信群。筛选功能:工具提供筛选机制,用户可以选择是否只显示需要验证或不需要验证的群组。精准引流:通过上述功能,用户可以更精准地找到目标群组,进行有效的引流操作。3.设备需求该工具可以
nosql数据库技术与应用知识点
皆过客,揽星河
NoSQL nosql 数据库 大数据 数据分析 数据结构 非关系型数据库
Nosql知识回顾大数据处理流程数据采集(flume、爬虫、传感器)数据存储(本门课程NoSQL所处的阶段)Hdfs、MongoDB、HBase等数据清洗(入仓)Hive等数据处理、分析(Spark、Flink等)数据可视化数据挖掘、机器学习应用(Python、SparkMLlib等)大数据时代存储的挑战(三高)高并发(同一时间很多人访问)高扩展(要求随时根据需求扩展存储)高效率(要求读写速度快)
TDengine 签约前晨汽车,解锁智能出行的无限潜力
涛思数据(TDengine)
tdengine 汽车 大数据
在全球汽车产业转型升级的背景下,智能网联和新能源技术正迅速成为商用车行业的重要发展方向。随着市场对环保和智能化需求的日益增强,企业必须在技术创新和数据管理上不断突破,以满足客户对高效、安全和智能出行的期待。在这一背景下,前晨汽车凭借其在新能源智能商用车领域的前瞻性布局和技术实力,成为行业中的佼佼者。前晨汽车采用整车数据采集和全车数据打通策略,能够实时将数据推送至APP端客户。然而,这导致整体写入和
Python神器!WEB自动化测试集成工具 DrissionPage
亚丁号
python 开发语言
一、前言用requests做数据采集面对要登录的网站时,要分析数据包、JS源码,构造复杂的请求,往往还要应付验证码、JS混淆、签名参数等反爬手段,门槛较高。若数据是由JS计算生成的,还须重现计算过程,体验不好,开发效率不高。使用浏览器,可以很大程度上绕过这些坑,但浏览器运行效率不高。因此,这个库设计初衷,是将它们合而为一,能够在不同须要时切换相应模式,并提供一种人性化的使用方法,提高开发和运行效率
基于STM32与Qt的自动平衡机器人:从控制到人机交互的的详细设计流程
极客小张
stm32 qt 机器人 物联网 人机交互 毕业设计 c语言
一、项目概述目标和用途本项目旨在开发一款基于STM32控制的自动平衡机器人,结合步进电机和陀螺仪传感器,实现对平衡机器人的精确控制。该机器人可以用于教育、科研、娱乐等多个领域,帮助用户了解自动控制、机器人运动学等相关知识。技术栈关键词STM32单片机步进电机陀螺仪传感器AD采集电路Qt人机界面实时数据监控二、系统架构系统架构设计本项目的系统架构设计包括以下主要组件:控制单元:STM32单片机传感器
童年 九 上
Y于生
我把自己的童年时代比喻成蜂巢,形形色色平凡又普通的人们如同蜜蜂,把各自采集到的生活和知识的蜂蜜源源不断地输送给我,为我的成长提供丰富的养料。尽管这养料又脏又苦,但只要是知识,它就是蜂蜜,虽苦犹甜。自从“好极了”离开后,我又跟彼得大叔成了好朋友。他长得很像外公,瘦削、利落,收拾得干干净净,只是整个人都比外公小一号。他就像一个专门为逗人乐而装扮成老头儿的调皮孩子,他的脸像由无数根细条编成的鸟笼子,在这
如何建设数据中台(五)——数据汇集—打破企业数据孤岛
weixin_47088026
学习记录和总结 中台 数据中台 程序人生 经验分享
数据汇集——打破企业数据孤岛要构建企业级数据中台,第一步就是将企业内部各个业务系统的数据实现互通互联,打破数据孤岛,主要通过数据汇聚和交换来实现。企业采集的数据可以是线上采集、线下数据采集、互联网数据采集、内部数据采集等。线上数据采集主要载体分为互联网和移动互联网两种,对应有系统平台、网页、H5、小程序、App等,可以采用前端或后端埋点方式采集数据。线下数据采集主要是通过硬件来采集,例如:WiFi
音视频知识图谱 2022.04
关键帧Keyframe
前些时间,我在知识星球上创建了一个音视频技术社群:关键帧的音视频开发圈,在这里群友们会一起做一些打卡任务。比如:周期性地整理音视频相关的面试题,汇集一份音视频面试题集锦,你可以看看《音视频面试题集锦2022.04》。再比如:循序渐进地归纳总结音视频技术知识,绘制一幅音视频知识图谱。下面是2022.04月知识图谱新增的内容节选:1)图谱路径:**采集/音频采集/声音三要素/响度******主观计量响
分享一个基于python的电子书数据采集与可视化分析 hadoop电子书数据分析与推荐系统 spark大数据毕设项目(源码、调试、LW、开题、PPT)
计算机源码社
Python项目 大数据 大数据 python hadoop 计算机毕业设计选题 计算机毕业设计源码 数据分析 spark毕设
作者:计算机源码社个人简介:本人八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流!学习资料、程序开发、技术解答、文档报告如需要源码,可以扫取文章下方二维码联系咨询Java项目微信小程序项目Android项目Python项目PHP项目ASP.NET项目Node.js项目选题推荐项目实战|p
tushare库获取金融股票数据
罔闻_spider
python进阶 python
定义:Tushare是一个为金融量化分析师和数据爱好者设计的开源工具,提供从数据采集、清洗加工到数据存储的全流程服务。它能够实时抓取沪深两市的股票和期货市场数据,包括交易价格、成交量、市值、市盈率等关键指标,同时也提供历史数据的采集。Tushare的数据采集功能是其核心优势之一,它支持多种数据类型,包括日K线数据和分钟级数据,满足不同分析需求。Tushare的数据清洗与加工功能提供了强大的工具集,
【STM32系统】基于STM32设计的锂电池电量/电压检测报警器系统——文末完整资料下载(程序源码/电路原理图/电路PCB/设计文档/模块资料/元器件清单/实物图/答辩问题技巧/PPT模版等)
阿齐Archie
单片机嵌入式项目 stm32 嵌入式硬件 单片机
基于STM32设计的锂电池电量/电压检测报警器系统系统视频:摘要:本设计旨在研究一个基于STM32F103C8T6微控制器的锂电池电量/电压检测报警器系统,应用于便携式电子设备电池管理。系统通过STM32的ADC模块对锂电池电压进行采集,利用LCD1602显示模块实时显示电池电压,当检测到电池电量不足或电压异常时,蜂鸣器报警模块会发出警报提醒用户。系统采用简单的硬件结构和优化的软件架构,通过对实际
拼多多商家电话采集工具 爬虫教程分享
小电商达人
爬虫
以下是使用Python编写的拼多多商家电话采集爬虫教程:一、前期准备安装Python:从Python官方网站下载并安装最新版本的Python,安装过程中注意勾选将Python添加到系统路径选项。安装相关库:在命令提示符中运行以下命令来安装所需的库。pipinstallrequests:用于发送HTTP请求获取网页内容。pipinstallbeautifulsoup4:用于解析HTML页面。二、分析
全面指南:用户行为从前端数据采集到实时处理的最佳实践
数字沉思
营销 流量运营 系统架构 前端 内容运营 大数据
引言在当今的数据驱动世界,实时数据采集和处理已经成为企业做出及时决策的重要手段。本文将详细介绍如何通过前端JavaScript代码采集用户行为数据、利用API和Kafka进行数据传输、通过Flink实时处理数据的完整流程。无论你是想提升产品体验还是做用户行为分析,这篇文章都将为你提供全面的解决方案。设计一个通用的ClickHouse表来存储用户事件时,需要考虑多种因素,包括事件类型、时间戳、用户信
Python爬虫代理池
极客李华
python授课 python 爬虫 开发语言
Python爬虫代理池网络爬虫在数据采集和信息抓取方面起到了关键作用。然而,为了应对网站的反爬虫机制和保护爬虫的真实身份,使用代理池变得至关重要。1.代理池的基本概念:代理池是一组包含多个代理IP地址的集合。通过在爬虫中使用代理池,我们能够隐藏爬虫的真实IP地址,实现一定程度的匿名性。这有助于防止被目标网站封锁或限制访问频率。2.为何使用代理池:匿名性:代理池允许爬虫在请求目标网站时使用不同的IP
【监控告警】02-Promtheus的学习之路
Kearey.
监控告警 微服务网关 学习方法
prometheus采用的是拉模式为主,推模式为辅的方式采集数据。Prometheus作为一个指标系统天生就不是精确的——由于指标本身就是稀疏采样的,事实上所有的图表和警报都是”估算”,我们也就不必太纠结于图表和警报的对应性,能够帮助我们发现问题解决问题就是一个好监控系统。当然,有时候我们也得证明这个警报确实没问题,那可以看一眼`ALERTS`指标。`ALERTS`是Prometheus在警报计算
什么是埋点测试,app埋点测试怎么做?
自动化测试 老司机
自动化测试 软件测试 测试工程师 功能测试 appium 测试工具 单元测试 postman 软件测试 自动化测试
前言埋点测试是指在应用程序或网站中预设检查点,收集程序运行时的数据,以便于后续对程序进行性能分析或故障排查。埋点测试通常用于监控和追踪用户在软件产品中的行为,以收集有关用户体验、功能使用情况和潜在问题的数据。这些数据对于软件产品的优化和改进至关重要,有助于开发人员了解用户需求和产品存在的问题,从而制定针对性的改进方案。App埋点测试是一种基于数据采集的增长分析方法,旨在通过在App代码中埋点来记录
建筑能源管理(4)——建筑能源监管
Fo*(Bi)
Energy and Building 能源
为了全面落实科学发展观,提高建筑能源管理水平,进一步降低能源和水资源消耗、合理利用资源,以政府办公建筑和大型公共建筑的运行节能管理为突破口,建立了既有政府办公建筑和大型公共建筑运行节能监管体系,旨在提高政府办公建筑和大型公共建筑整体运行节能管理水平,指导和规范政府办公建筑和大型公共建筑的能耗数据采集工作。1、能源统计对国家机关办公建筑和大型公共建筑进行能耗的基本情况计量、能源消耗(水、电、气等能源
工业智能网关在工业生产中的核心作用-天拓四方
weixin_36369259
随着工业4.0时代的到来,物联网(IoT)和智能制造技术日益成熟,工业智能网关作为连接工业设备与物联网系统的关键设备,正逐步成为现代工业生产不可或缺的重要组成部分。本文将详细探讨工业智能网关在工业生产中的多重作用,揭示其如何助力企业实现数字化转型与智能化管理。一、工业智能网关概述工业智能网关,也称为工业物联网网关、工业边缘计算网关等,是一种专为工业环境设计的网络连接设备。它集成了数据采集、传输、协
边缘计算网关在机床数据采集中的应用-天拓四方
各自安好吧
边缘计算 人工智能
随着工业4.0和智能制造的快速发展,机床作为制造业的核心设备,其数据采集与分析对于提升生产效率、保证产品质量、优化加工过程具有重要意义。传统的数据采集方式存在数据传输速度慢、实时性差、数据处理能力有限等问题。为了解决这些问题,边缘计算网关在机床数据采集领域的应用逐渐受到关注。本文将详细探讨边缘计算网关在机床数据采集中的应用,并分析其带来的优势。一、边缘计算网关概述边缘计算网关是一种集成了数据采集、
工业数据采集网关的作用-天拓四方
北京天拓四方
边缘计算 物联网 iot
工业数据采集网关是一种专门用于采集、处理、传输工业现场数据的设备。它能够实时收集来自各种传感器、仪表和设备的数据,并通过网络将这些数据传输到云端或数据中心。同时,数据采集网关还具备数据清洗、转换和压缩等功能,确保数据的质量和传输效率。随着工业4.0时代的来临,数字化转型已成为工业发展的必然趋势。工业数据采集网关作为连接物理世界与数字世界的桥梁,其在工业数字化转型中发挥着至关重要的作用。本文将详细探
HalconDotNet中的图像视频采集
0仰望星空007
音视频 数码相机 计算机视觉 Halcon C#
文章目录1.单相机视频图像采集2.多相机视频图像采集3.设置相机曝光时间4.实时图像显示5.图像采集与保存1.单相机视频图像采集 使用HalconDotNet进行单相机视频图像采集的基本步骤包括初始化相机、设置采集参数、开始采集、处理图像以及停止采集。usingHalconDotNet;publicvoidSingleCameraCapture(){HFramegrabberframegrabb
Java服务端中的性能监控:Prometheus与Grafana的集成
微赚淘客系统@聚娃科技
java prometheus grafana
Java服务端中的性能监控:Prometheus与Grafana的集成大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在构建和维护Java服务端应用时,性能监控是确保系统稳定性和性能的重要环节。Prometheus与Grafana是当前最流行的性能监控工具组合之一,能够提供强大的数据采集、存储和可视化功能。本文将介绍如何在Java服务端中集成Prometheus与
网关智能电表是什么?什么是网关智能电表?
BZWL_BZWL
自动化 运维 数据库 能源 网络
一、网关智能电表概述1.定义网关智能电表是一种集成了通信网关功能的智能计量设备,用于监测和记录电力消耗数据,并通过内置或外接的通信模块将这些数据传输到远程服务器或管理系统中。这种电表不仅能够实现传统电表的基本功能,还能够提供更加丰富的数据管理和分析功能。2.工作原理网关智能电表的核心部件包括计量单元、数据处理单元以及通信模块。计量单元负责实时采集电流、电压等电气参数,并计算出实际的用电量。数据处理
三相电表智能抄表是什么?
BZWL_BZWL
自动化 运维 人工智能 数据分析 大数据
一、三相电表智能抄表简述三相电表智能抄表操作系统是电力领域科学化管理不可或缺的一部分,它利用先进的物联网,完成了对三相电表数据库的自动采集、传送、解决与分析,大大提升了电力经营效率和服务水平。二、原理与优势1.原理:智能电表内嵌感应器,可精准测量三相电电压、电流和功率等数据。这些信息根据无线通讯模块(如GPRS、NB-IoT等)传送到云服务器,完成智能抄表。与此同时,电度表还能实时检测电网情况,防
4G物联网智能电表是什么?什么叫4G物联网智能电表?
HZZD_HZZD
物联网 人工智能 服务器 数据分析 大数据 数据库
4G物联网智能电表是一种结合了4G无线通信技术的新型电能计量设备,用于实时采集和传输用户的用电数据。它通过集成现代信息技术和电力电子技术,不仅能够精确测量电力消耗,还能实现远程数据传输、数据分析、远程控制等多种功能。本文将详细介绍4G物联网智能电表的主要功能、技术优势及其应用场景。一、定义与功能1.定义4G物联网智能电表是一种能够通过4G网络将电能消耗数据实时传输到电力公司或数据中心的智能计量设备
一张图详解开源监控夜莺(Nightingale)的架构
夜莺开源监控
开源 架构 夜莺监控 Nightingale 开源夜莺
夜莺监控是一款开源云原生观测分析工具,采用All-in-One的设计理念,集数据采集、可视化、监控告警、数据分析于一体,与云原生生态紧密集成,提供开箱即用的企业级监控分析和告警能力。夜莺于2020年3月20日,在github上发布v1版本,已累计迭代100多个版本。夜莺最初由滴滴开发和开源,并于2022年5月11日,捐赠予中国计算机学会开源发展委员会(CCFODC),为CCFODC成立后接受捐赠的
ELK 架构中 ES 性能优化
xianjie0318
elk 架构 elasticsearch
1.背景由于目前日志采集流程中,经常遇到用户磁盘IO占用超过90%以上的场景,但是观察其日志量大约在2k~5k之间,整体数据量不大,所以针对该问题进行了一系列的压测和实验验证,最后得出这篇优化建议文档2.压测前期准备2.1制造大量日志该阶段为数据源输入阶段,为了避免瓶颈在数据制造侧,所以需要保证filebeat具有足够的日志制造能力最后效果,filebeat可以达到70kQPS的数据发往logst
【Python技术学习】- 如何搭建一个爬虫代理服务?
xiaoli8748_软件开发
python技术学习 python 学习 爬虫
由于之前一直在做爬虫采集相关的开发,这个过程那肯定少不了跟「代理IP」打交道,这篇文章就来记录一下,如何实现一个爬虫代理服务,本篇文章主要以讲解思路为主。起因做过爬虫的人应该都知道,抓的网站和数据多了,如果爬虫抓取速度过快,免不了触发网站的防爬机制。而这些网站应对爬虫的办法,几乎用的同一招就是封IP。那么我们还想稳定、持续地抓取这些网站的数据,如何解决呢?一般解决方案有2个:使用同一个服务器IP抓
ROS下使用usb_cam驱动读取摄像头数据
小杨~~~~
ubuntu
因为darknet_ros会直接订阅指定的图像话题名,然后对图像进行检测,绘制检测框,并发布相应的检测话题,因此首先需要找一个能够发布图像话题的ROS包,这里经推荐使用ROS官方提供的usb_cam驱动包,可以直接将小车摄像头采集的图像发布为ROS图像话题。1、下载摄像头驱动包usb_cam#方式一:直接终端输入,通过apt便捷安装cdtest/src/sudoapt-getinstallros-
EG边缘计算网关连接中移ONENET物联网平台(MQTT协议)
成都纵横智控科技官方账号
边缘计算网关 物联网 工业网关 边缘计算 物联网 MQTT 中移ONENET
上文:EG边缘计算网关连接阿里云物联网平台(MQTT协议)需求概述本章节主要实现一个流程:EG8200mini采集ModbusRTU数据,通过MQTT协议连接中移ONENET物联网平台ModbusRTU采集此处不做过多赘述,可参考其他案例(串口读取Modbus传感器数据)介绍。下文默认已经采集到ModbusRTU数据。要采集的Modbus点位表:地址(Doc)数据类型属性名称00001Boolea
戴尔笔记本win8系统改装win7系统
sophia天雪
win7 戴尔 改装系统 win8
戴尔win8 系统改装win7 系统详述
第一步:使用U盘制作虚拟光驱:
1)下载安装UltraISO:注册码可以在网上搜索。
2)启动UltraISO,点击“文件”—》“打开”按钮,打开已经准备好的ISO镜像文
BeanUtils.copyProperties使用笔记
bylijinnan
java
BeanUtils.copyProperties VS PropertyUtils.copyProperties
两者最大的区别是:
BeanUtils.copyProperties会进行类型转换,而PropertyUtils.copyProperties不会。
既然进行了类型转换,那BeanUtils.copyProperties的速度比不上PropertyUtils.copyProp
MyEclipse中文乱码问题
0624chenhong
MyEclipse
一、设置新建常见文件的默认编码格式,也就是文件保存的格式。
在不对MyEclipse进行设置的时候,默认保存文件的编码,一般跟简体中文操作系统(如windows2000,windowsXP)的编码一致,即GBK。
在简体中文系统下,ANSI 编码代表 GBK编码;在日文操作系统下,ANSI 编码代表 JIS 编码。
Window-->Preferences-->General -
发送邮件
不懂事的小屁孩
send email
import org.apache.commons.mail.EmailAttachment;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.HtmlEmail;
import org.apache.commons.mail.MultiPartEmail;
动画合集
换个号韩国红果果
html css
动画 指一种样式变为另一种样式 keyframes应当始终定义0 100 过程
1 transition 制作鼠标滑过图片时的放大效果
css
.wrap{
width: 340px;height: 340px;
position: absolute;
top: 30%;
left: 20%;
overflow: hidden;
bor
网络最常见的攻击方式竟然是SQL注入
蓝儿唯美
sql注入
NTT研究表明,尽管SQL注入(SQLi)型攻击记录详尽且为人熟知,但目前网络应用程序仍然是SQLi攻击的重灾区。
信息安全和风险管理公司NTTCom Security发布的《2015全球智能威胁风险报告》表明,目前黑客攻击网络应用程序方式中最流行的,要数SQLi攻击。报告对去年发生的60亿攻击 行为进行分析,指出SQLi攻击是最常见的网络应用程序攻击方式。全球网络应用程序攻击中,SQLi攻击占
java笔记2
a-john
java
类的封装:
1,java中,对象就是一个封装体。封装是把对象的属性和服务结合成一个独立的的单位。并尽可能隐藏对象的内部细节(尤其是私有数据)
2,目的:使对象以外的部分不能随意存取对象的内部数据(如属性),从而使软件错误能够局部化,减少差错和排错的难度。
3,简单来说,“隐藏属性、方法或实现细节的过程”称为——封装。
4,封装的特性:
4.1设置
[Andengine]Error:can't creat bitmap form path “gfx/xxx.xxx”
aijuans
学习Android遇到的错误
最开始遇到这个错误是很早以前了,以前也没注意,只当是一个不理解的bug,因为所有的texture,textureregion都没有问题,但是就是提示错误。
昨天和美工要图片,本来是要背景透明的png格式,可是她却给了我一个jpg的。说明了之后她说没法改,因为没有png这个保存选项。
我就看了一下,和她要了psd的文件,还好我有一点
自己写的一个繁体到简体的转换程序
asialee
java 转换 繁体 filter 简体
今天调研一个任务,基于java的filter实现繁体到简体的转换,于是写了一个demo,给各位博友奉上,欢迎批评指正。
实现的思路是重载request的调取参数的几个方法,然后做下转换。
android意图和意图监听器技术
百合不是茶
android 显示意图 隐式意图 意图监听器
Intent是在activity之间传递数据;Intent的传递分为显示传递和隐式传递
显式意图:调用Intent.setComponent() 或 Intent.setClassName() 或 Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。
隐式意图;不指明调用的名称,根据设
spring3中新增的@value注解
bijian1013
java spring @Value
在spring 3.0中,可以通过使用@value,对一些如xxx.properties文件中的文件,进行键值对的注入,例子如下:
1.首先在applicationContext.xml中加入:
<beans xmlns="http://www.springframework.
Jboss启用CXF日志
sunjing
log jboss CXF
1. 在standalone.xml配置文件中添加system-properties:
<system-properties> <property name="org.apache.cxf.logging.enabled" value=&
【Hadoop三】Centos7_x86_64部署Hadoop集群之编译Hadoop源代码
bit1129
centos
编译必需的软件
Firebugs3.0.0
Maven3.2.3
Ant
JDK1.7.0_67
protobuf-2.5.0
Hadoop 2.5.2源码包
Firebugs3.0.0
http://sourceforge.jp/projects/sfnet_findbug
struts2验证框架的使用和扩展
白糖_
框架 xml bean struts 正则表达式
struts2能够对前台提交的表单数据进行输入有效性校验,通常有两种方式:
1、在Action类中通过validatexx方法验证,这种方式很简单,在此不再赘述;
2、通过编写xx-validation.xml文件执行表单验证,当用户提交表单请求后,struts会优先执行xml文件,如果校验不通过是不会让请求访问指定action的。
本文介绍一下struts2通过xml文件进行校验的方法并说
记录-感悟
braveCS
感悟
再翻翻以前写的感悟,有时会发现自己很幼稚,也会让自己找回初心。
2015-1-11 1. 能在工作之余学习感兴趣的东西已经很幸福了;
2. 要改变自己,不能这样一直在原来区域,要突破安全区舒适区,才能提高自己,往好的方面发展;
3. 多反省多思考;要会用工具,而不是变成工具的奴隶;
4. 一天内集中一个定长时间段看最新资讯和偏流式博
编程之美-数组中最长递增子序列
bylijinnan
编程之美
import java.util.Arrays;
import java.util.Random;
public class LongestAccendingSubSequence {
/**
* 编程之美 数组中最长递增子序列
* 书上的解法容易理解
* 另一方法书上没有提到的是,可以将数组排序(由小到大)得到新的数组,
* 然后求排序后的数组与原数
读书笔记5
chengxuyuancsdn
重复提交 struts2的token验证
1、重复提交
2、struts2的token验证
3、用response返回xml时的注意
1、重复提交
(1)应用场景
(1-1)点击提交按钮两次。
(1-2)使用浏览器后退按钮重复之前的操作,导致重复提交表单。
(1-3)刷新页面
(1-4)使用浏览器历史记录重复提交表单。
(1-5)浏览器重复的 HTTP 请求。
(2)解决方法
(2-1)禁掉提交按钮
(2-2)
[时空与探索]全球联合进行第二次费城实验的可能性
comsci
二次世界大战前后,由爱因斯坦参加的一次在海军舰艇上进行的物理学实验 -费城实验
至今给我们大家留下很多迷团.....
关于费城实验的详细过程,大家可以在网络上搜索一下,我这里就不详细描述了
在这里,我的意思是,现在
easy connect 之 ORA-12154: TNS: 无法解析指定的连接标识符
daizj
oracle ORA-12154
用easy connect连接出现“tns无法解析指定的连接标示符”的错误,如下:
C:\Users\Administrator>sqlplus username/
[email protected] :1521/orcl
SQL*Plus: Release 10.2.0.1.0 – Production on 星期一 5月 21 18:16:20 2012
Copyright (c) 198
简单排序:归并排序
dieslrae
归并排序
public void mergeSort(int[] array){
int temp = array.length/2;
if(temp == 0){
return;
}
int[] a = new int[temp];
int
C语言中字符串的\0和空格
dcj3sjt126com
c
\0 为字符串结束符,比如说:
abcd (空格)cdefg;
存入数组时,空格作为一个字符占有一个字节的空间,我们
解决Composer国内速度慢的办法
dcj3sjt126com
Composer
用法:
有两种方式启用本镜像服务:
1 将以下配置信息添加到 Composer 的配置文件 config.json 中(系统全局配置)。见“例1”
2 将以下配置信息添加到你的项目的 composer.json 文件中(针对单个项目配置)。见“例2”
为了避免安装包的时候都要执行两次查询,切记要添加禁用 packagist 的设置,如下 1 2 3 4 5
高效可伸缩的结果缓存
shuizhaosi888
高效可伸缩的结果缓存
/**
* 要执行的算法,返回结果v
*/
public interface Computable<A, V> {
public V comput(final A arg);
}
/**
* 用于缓存数据
*/
public class Memoizer<A, V> implements Computable<A,
三点定位的算法
haoningabc
c 算法
三点定位,
已知a,b,c三个顶点的x,y坐标
和三个点都z坐标的距离,la,lb,lc
求z点的坐标
原理就是围绕a,b,c 三个点画圆,三个圆焦点的部分就是所求
但是,由于三个点的距离可能不准,不一定会有结果,
所以是三个圆环的焦点,环的宽度开始为0,没有取到则加1
运行
gcc -lm test.c
test.c代码如下
#include "stdi
epoll使用详解
jimmee
c linux 服务端编程 epoll
epoll - I/O event notification facility在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是epoll。相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且,在linu
Hibernate对Enum的映射的基本使用方法
linzx0212
enum Hibernate
枚举
/**
* 性别枚举
*/
public enum Gender {
MALE(0), FEMALE(1), OTHER(2);
private Gender(int i) {
this.i = i;
}
private int i;
public int getI
第10章 高级事件(下)
onestopweb
事件
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/
孙子兵法
roadrunners
孙子 兵法
始计第一
孙子曰:
兵者,国之大事,死生之地,存亡之道,不可不察也。
故经之以五事,校之以计,而索其情:一曰道,二曰天,三曰地,四曰将,五
曰法。道者,令民于上同意,可与之死,可与之生,而不危也;天者,阴阳、寒暑
、时制也;地者,远近、险易、广狭、死生也;将者,智、信、仁、勇、严也;法
者,曲制、官道、主用也。凡此五者,将莫不闻,知之者胜,不知之者不胜。故校
之以计,而索其情,曰
MySQL双向复制
tomcat_oracle
mysql
本文包括:
主机配置
从机配置
建立主-从复制
建立双向复制
背景
按照以下简单的步骤:
参考一下:
在机器A配置主机(192.168.1.30)
在机器B配置从机(192.168.1.29)
我们可以使用下面的步骤来实现这一点
步骤1:机器A设置主机
在主机中打开配置文件 ,
zoj 3822 Domination(dp)
阿尔萨斯
Mina
题目链接:zoj 3822 Domination
题目大意:给定一个N∗M的棋盘,每次任选一个位置放置一枚棋子,直到每行每列上都至少有一枚棋子,问放置棋子个数的期望。
解题思路:大白书上概率那一张有一道类似的题目,但是因为时间比较久了,还是稍微想了一下。dp[i][j][k]表示i行j列上均有至少一枚棋子,并且消耗k步的概率(k≤i∗j),因为放置在i+1~n上等价与放在i+1行上,同理