不分类别的效果

不同分类的分布效果图

从海友网获取各个企业名单保存进mysql

cmfishhelper.py

从下列网址得到各个企业名片的网址保存进表cmfish

cds = get_cds()
http://www.cmfish.com/cd/cd_style.php?pageNum_Recordset1=%d&totalRows_Recordset1=191&id=%d

访问企业名片页面获得名称联系人地址保存进数据库

update_cds()
取出地址,从百度地图获得经纬度保存进数据库
http://api.map.baidu.com/geocoder/v2/
update_lnglat()
把名称,经纬度取出来生成个json文件
en_json()
#encoding=utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
sys.path.append('..')
import requests
from bs4 import BeautifulSoup
import pprint
from utils.db import sqlhelper
from utils import setting
import re
import pymysql
import traceback
from requests.utils import get_encoding_from_headers, get_encodings_from_content
import urllib2
import json typeto,pageto = 7,5
cardurls = "http://www.cmfish.com/cd/cd_style.php?id=%d"
cdpages = "http://www.cmfish.com/cd/cd_style.php?pageNum_Recordset1=%d&totalRows_Recordset1=191&id=1"
mysqldb = setting.YAMLDATA.get('mysqldb2')
host,user,pwd,db=mysqldb.get('host'),mysqldb.get('user'),mysqldb.get('pwd'),mysqldb.get('cmfishdb')
sh=sqlhelper.SqlHelper(host,user,pwd,db,'mysql')
cardidrec=re.compile('((id=)([^&][^&]*))', re.IGNORECASE)
hotrec=re.compile('((hot=)([^&][^&]*))', re.IGNORECASE)
daterec=re.compile('(\xbc\xd3\xc8\xeb\xc8\xd5\xc6\xda: ([\\s\\S]*?)</td>)', re.IGNORECASE)
namerec=re.compile('(</a> > <strong>([\\s\\S]*?)</strong>)', re.IGNORECASE)
contactrec=re.compile('(\xc1\xaa \xcf\xb5 \xc8\xcb</td>\r\n <td>([\\s\\S]*?)</td>)', re.IGNORECASE)
mobilerec=re.compile('(\xc1\xaa\xcf\xb5\xb5\xe7\xbb\xb0</td>\r\n <td>([\\s\\S]*?)</td>\r\n)', re.IGNORECASE)
mailrec=re.compile('(\xb5\xe7\xd7\xd3\xd3\xca\xcf\xe4</td>\r\n <td>([\\s\\S]*?)</td>\r\n)', re.IGNORECASE)
addressrec=re.compile('(\xc1\xaa\xcf\xb5\xb5\xd8\xd6\xb7</td>\r\n <td>([\\s\\S]*?)</td>\r\n)', re.IGNORECASE)
noterec=re.compile('(<td>    ([\\s\\S]*?)</td>\r\n)', re.IGNORECASE) def get_cds():
cds = []
for i in range(1,typeto+1):
for j in range(0,pageto):
url = 'http://www.cmfish.com/cd/cd_style.php?pageNum_Recordset1=%d&totalRows_Recordset1=191&id=%d' % (j,i)
req=requests.get(url)
soup = BeautifulSoup(req.text, 'html.parser')
links=soup.find_all('a')
for link in links:
href = link.attrs['href']
if "cd.php?id=" in href and href<>'cd.php?id=&hot=':
cdlink = "http://www.cmfish.com/cd/"+href
pprint.pprint(cdlink)
save_cd(i,j,cdlink)
cds.append(cdlink)
return cds def save_cd(typeid,pageid,url):
sql = r"insert into card(typeid,pageid,url) values(%d,%d,'%s')" % (typeid,pageid,url)
sh.ExecNonQuery(sql) def re_result(strrec,str,value):
searched = strrec.findall(str)
if searched <> None and len(searched)>0:
pprint.pprint(searched[0][1])
try:
return searched[0][1].decode('gb2312')
except:
return searched[0][1].decode('gbk')
else:
return value def url_result(strrec,str,value):
searched = strrec.findall(str)
if searched <> None and len(searched)>0:
print searched[0][2]
return searched[0][2]
else:
return value def get_detail(selsql,updsql):
results=sh.ExecQuery(selsql)
for result in results:
try:
id,url=result[0],result[1]
cardid,hot = url_result(cardidrec,url,''),url_result(hotrec,url,0)
#req = requests.get(url)
#req.encoding=get_encodings_from_content(req.content)
request = urllib2.Request(url)
response = urllib2.urlopen(request)
content = response.read() date = re_result(daterec,content,'')
name = re_result(namerec,content,'')
contact = re_result(contactrec,content,'')
mobile=re_result(mobilerec,content,'')
mail = re_result(mailrec,content,'')
address = re_result(addressrec,content,'')
note = re_result(noterec,content,'')
sql = updsql % (cardid,hot,pymysql.escape_string(date),pymysql.escape_string(name),pymysql.escape_string(contact),pymysql.escape_string(mobile),pymysql.escape_string(mail),pymysql.escape_string(address),pymysql.escape_string(note),id)
sh.ExecNonQuery(sql)
except Exception,e:
print 'error:',e.message,traceback.format_exc() def update_cds():
selsql= "select id,url from card where cardid is null"
updsql = "update card set cardid=%s,hot=%s,date='%s',name='%s',contact='%s',mobile='%s',mail='%s',address='%s',note='%s' where id=%d"
get_detail(selsql,updsql) def get_lnglat(address):
print address
url = 'http://api.map.baidu.com/geocoder/v2/'
output = 'json'
ak = 'c7aBgFWD6cMDPOe4BSiG8HLNlvXNKvCW'
uri = url + '?' + 'address=' + address + '&output=' + output + '&ak=' + ak
temp = urllib2.urlopen(uri)
temp = json.loads(temp.read())
return temp def save_lnglat(selsql,updsql):
results=sh.ExecQuery(selsql)
for result in results:
try:
id,address=result[0],result[1]
if '例如' not in address:
address = address.replace(' ',',')
result = get_lnglat(address)
if result.get('result') <> None:
lat,lng = result.get('result').get('location').get('lat'),result.get('result').get('location').get('lng')
sql = updsql % (lat,lng,id)
sh.ExecNonQuery(sql)
except Exception,e:
print 'error:',e.message,traceback.format_exc()
#result[1] def update_lnglat():
selsql= "select id,address from card where lat is null"
updsql = "update card set lat=%f,lng=%f where id=%d"
save_lnglat(selsql,updsql) def gen_json(ofile='./../json/cards.json'):
selsql = "select name,lat,lng,typeid from card where lat is not null"
results=sh.ExecQuery(selsql)
objs = []
for res in results:
objs.append({"name":res[0],"lat":float(res[1]),"lng":float(res[2]),"typeid":int(res[3])})
jsonstr =json.dumps(objs)
with open(ofile,'w') as f:
f.write(jsonstr)
print jsonstr if __name__ == '__main__':
#cds = get_cds()
#print len(cds)
#update_cds()
#print get_lnglat('台灣省桃園縣龜山鄉振興路1089巷15-1號')
#update_lnglat()
gen_json()

  

读取生成的json文件,显示在地图上

用file://访问html的时候读取json文件的时候会报错不能跨域的错误,发布成网站访问就可以

cmfish.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/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>海友网企业全国分布</title>
</head> <body> <div id="main" style="width: 1200px;height:1200px;"></div>
<script type="text/javascript" src="../js/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="../js/echarts-all-3.js"></script>
<script type="text/javascript" src="../js/china.js"></script>
<!-- 为ECharts准备一个具备大小(宽高)的Dom --> <script type="text/javascript"> var cards_arr= new Array()
cards_arr[0] = []
cards_arr[1] = []
cards_arr[2] = []
cards_arr[3] = []
cards_arr[4] = []
cards_arr[5] = []
cards_arr[6] = [] $.ajax({
url: "../json/cards.json",//json文件位置
type: "GET",//请求方式为get
dataType: "json", //返回数据格式为json
success: function(data) {//请求成功完成后要执行的方法
//each循环 使用$.each方法遍历返回的数据date
$.each(data ,function(i, item) {
cards_arr[item.typeid-1].push({
name: item.name,
value: [item.lng, item.lat]
}); loaddata(cards_arr)
})
}
}) function loaddata(data){
//初始化
var myChart = echarts.init(document.getElementById('main'));
//myChart.showLoading();//加载数据前显示的动画效果
/*
res.push({
name: "白玉路346号",
value: [121.423744, 31.23829] //这里concat后面的值就是value,这里统一设置成1。
});
res.push({
name: "新民路城南工商所对面巷子( 南苑菜市旁边 )",
value: [106.577573, 31.082472] //这里concat后面的值就是value,这里统一设置成1。
});
*/
//console.log(data)
var chart = echarts.init(document.getElementById('main')); //这里是主体的初始化echart方法,与上面的简单demo类似。
chart.setOption({
backgroundColor: '#404a59',
title: {
text: '海友网企业全国分布',
subtext: 'data from cmfish',
sublink: 'http://www.cmfish.com',
x: 'center',
textStyle: {
color: '#fff'
}
},
tooltip: {
trigger: 'item'
},
legend: {
orient: 'vertical',
x: 'left',
data: ['生产厂商','进出口商','代理商','店铺','繁殖','个人','其他'],
textStyle: {
color: 'orange'
} },
//地图坐标系必备的配置,具体的含义可以参考api,索性都是中文的,没有什么阅读障碍。
geo: {
silent:false,
map: 'china',
label: {
normal: {
show: false
},
emphasis: {
show: true
}
},
itemStyle: {
hoverAnimation:true,
normal: {
areaColor: '#323c48',
borderColor: '#000'
},
emphasis: {
areaColor: '#2a333d',
opacity:0
}
}
},
series: [
{
name: '生产厂商',
type: 'scatter',
coordinateSystem: 'geo', //参照系:之前设置的geo。
//这里是api数据接受的的地方
data: data[0],
symbolSize: 10, //散点半径
label: {
normal: {
formatter: '{b}',
show: false
},
emphasis: {
show: true
}
},
hoverAnimation:true,
silent:false,
animation:false,
z:3
},
{
name: '进出口商',
type: 'scatter',
coordinateSystem: 'geo', //参照系:之前设置的geo。
//这里是api数据接受的的地方
data:data[1],
symbolSize: 10, //散点半径
label: {
normal: {
formatter: '{b}',
show: false
},
emphasis: {
show: true
}
},
hoverAnimation:true,
silent:false,
animation:false,
z:3
},
{
name: '代理商',
type: 'scatter',
coordinateSystem: 'geo', //参照系:之前设置的geo。
//这里是api数据接受的的地方
data:data[2],
symbolSize: 10, //散点半径
label: {
normal: {
formatter: '{b}',
show: false
},
emphasis: {
show: true
}
},
hoverAnimation:true,
silent:false,
animation:false,
z:3
},
{
name: '店铺',
type: 'scatter',
coordinateSystem: 'geo', //参照系:之前设置的geo。
//这里是api数据接受的的地方
data:data[3],
symbolSize: 10, //散点半径
label: {
normal: {
formatter: '{b}',
show: false
},
emphasis: {
show: true
}
},
hoverAnimation:true,
silent:false,
animation:false,
z:3
},
{
name: '繁殖',
type: 'scatter',
coordinateSystem: 'geo', //参照系:之前设置的geo。
//这里是api数据接受的的地方
data:data[4],
symbolSize: 10, //散点半径
label: {
normal: {
formatter: '{b}',
show: false
},
emphasis: {
show: true
}
},
hoverAnimation:true,
silent:false,
animation:false,
z:3
},
{
name: '个人',
type: 'scatter',
coordinateSystem: 'geo', //参照系:之前设置的geo。
//这里是api数据接受的的地方
data:data[5],
symbolSize: 10, //散点半径
label: {
normal: {
formatter: '{b}',
show: false
},
emphasis: {
show: true
}
},
hoverAnimation:true,
silent:false,
animation:false,
z:3
},
{
name: '其他',
type: 'scatter',
coordinateSystem: 'geo', //参照系:之前设置的geo。
//这里是api数据接受的的地方
data:data[6],
symbolSize: 10, //散点半径
label: {
normal: {
formatter: '{b}',
show: false
},
emphasis: {
show: true
}
},
hoverAnimation:true,
silent:false,
animation:false,
z:3
}
]
});
} //myChart.setOption(option) </script> </body>
</html>

以上代码提交在github上,可以下载所用到的echarts的js文件

https://github.com/sui84/pytest

使用echarts生成海友网企业全国分布地图的更多相关文章

  1. 32、出任爬虫公司CEO(爬取职友网招聘信息)

    职友集,搜索到全国上百家招聘网站的最新职位.   https://www.jobui.com/rank/company/   打开网址后,你会发现:这是职友集网站的地区企业排行榜,里面含有     本 ...

  2. 博客转移到 海胖网 http://haipz.com/ 希望你能支持我们!

    博客转移到 海胖网 http://haipz.com/ 希望你能支持我们! 博客转移到 海胖网 http://haipz.com/ 希望你能支持我们! 博客转移到 海胖网 http://haipz.c ...

  3. echarts生成的图表大小怎么随屏幕的大小改变自适应

    最近在做图表,记录一下用到的知识点,当做自己的日记吧,会不断添加新内容 1,echarts生成的图表大小怎么随屏幕的大小改变自适应? this.chart.setOption(this.options ...

  4. 公司须要内部的地图服务,准备自己去开发可是成本太高,如今有没有专门为企业提供GIS地图开发的产品呀?大概价格多少?

    公司须要内部的地图服务,准备自己去开发可是成本太高,如今有没有专门为企业提供GIS地图开发的产品呀?大概价格多少?

  5. 一键生成APP官网

    只需要输入苹果下载地址,安卓市场下载地址,或者内测下载地址,就能一键生成APP的官网,方便在网上推广. 好推APP官网 www.hotapp.cn/app

  6. C#+JQuery+.Ashx+百度Echarts实现全国省市地图和饼状图动态数据图形报表的统计

    在目前的一个项目中,需要用到报表表现数据,这些数据有多个维度,需要同时表现出来,同时可能会有大量数据呈现的需求,经过几轮挑选,最终选择了百度的echarts作为报表基础类库.echarts功能强大,界 ...

  7. Python爬网获取全国各地律师电话号

    [本文出自天外归云的博客园] 从64365网站获取全国各地律师电话号,用到了python的lxml库进行对html页面内容的解析,对于xpath的获取和正确性校验,需要在火狐浏览器安装firebug和 ...

  8. PHP 使用Echarts生成数据统计报表

    echarts统计,心血来潮~~ 先看下效果图 看下代码 HTML页面  为ECharts准备一个Dom,宽高自定义 <div class="panel panel-info" ...

  9. Thinkphp+ECharts生成柱状图

    1.首先进ECharts官网下载echarts.js 点击下载,结合TP5讲解,主要代码在js里面,更多请到ECharts官网 2.引进echarts.js <!DOCTYPE html> ...

随机推荐

  1. web渗透思维导图

    更新中!!

  2. kubernetes 实践一:基本概念和架构

    这里记录kubernetes学习和使用过程中的内容. CentOS7 k8s-1.13 flanneld-0.10 docker-18.06 etcd-3.3 kubernetes基本概念 kuber ...

  3. Spring核心概念学习笔记

    1.Spring主要用到两种设计模式 1.1 工厂模式 Spring容器就是实例化和管理全部Bean的工厂. 工厂模式可以将Java对象的调用者从被调用者的实现逻辑中分离出来. 调用者只关心被调用者必 ...

  4. java之struts2的action优化配置

    当一个Action处理类中处理多个业务时,action的配置 文件将会急剧增加,导致配置文件很臃肿的问题. struts2提供了两种方案来解决这个问题.一种是动态方法调用,另一种是使用通配符来配置Ac ...

  5. [C#] 匿名方法的方便和安全

    static void Main(string[] args) { int count = 5; //不安全写法 Task.Run(() => { Thread.Sleep(1000); Con ...

  6. 【BZOJ 2351】Matrix(Hash)

    题目链接 二维\(Hash\)类似二维前缀和,每一行看成一个\(h\)进制数,每一个以(1,1)为左上角的矩阵看成一个由每一行的\(Hash\)值组成的\(l\)进制数. 然后自己推推柿子就行. #i ...

  7. js数据类型及判断数据类型

    众所周知,js有7种数据类型 1. null 2. undefined 3. boolean 4. number 5. string 6. 引用类型(object.array.function) 7. ...

  8. 【填坑】Ubuntu安装vsftpd

    1.安装vsftpdsudo apt-get install vsftpd 安装完毕后或许会自动生成一个帐户"ftp",/home下也会增加一个文件夹.如果没有生成这个用户的话可以 ...

  9. Laravel5.6---搜索查询 自带paginate()分页 get传参

    laravel的paginate()分页,如果用post传参,点击第二页时会默认使用get,就会返回原始数据了 需要把查询数据get方式也放到paginate()分页参数中 一.路由 Route::g ...

  10. Windows环境下大数据处理的构想(一)

    为什么不呢?我们有了RPC/RMI和MAP,为什么不能在windows环境下处理大数据呢?windows是迄今为止最普及的操作系统,据市调公司NetMarketShare最新(2019年5月)统计数据 ...