获取大众点评数据

使用.NET实现一个从大众点评抓取一些基础数据(商家名称,地址,电话,经纬度)的小程序。

实现逻辑:

1、以异步方式从列表上获取前三项(商家名称、地址、电话);

2、把获取下来的数据保存到数据库表里;

3、把存在数据表里的地址信息读取出来,通过调用QQ地图API把地址转化成经纬度;

4、按行更新GIS信息。

代码如下:

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml;

namespace DianPing_MeiFa
{
public partial class test : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// string url = "http://www.dianping.com/search/category/2/50/p";
//this.lblNames.Text = "begin...";
//for (int i = 1; i < 51; i++)//循环分页
//{
// string url = "http://www.dianping.com/search/category/2/50/p";
// url += i;
// this.SaveMeiFaData(url);
//}
this.setMapLocation();
}

/// <summary>
/// 获取数据
/// </summary>
/// <returns></returns>
private DataTable GetMeifa()
{
string sql = "SELECT * FROM t_meifa";
DataSet ds = SqlHelper.ExecuteDataset(SqlHelper.GetConnection(), CommandType.Text, sql);
return ds.Tables[0];
}

private void setMapLocation()
{
DataTable dt = this.GetMeifa();
IList<MeiFa> mfList = new List<MeiFa>();
//将DataTable转化成对象
foreach (DataRow dr in dt.Rows)
{
MeiFa mf = new MeiFa
{
Id = int.Parse(dr["id"].ToString()),
Name = dr["name"].ToString(),
Address = dr["address"].ToString()
};
mfList.Add(mf);
}

//设置获经纬度
foreach (MeiFa mf in mfList)
{
QQMapGeocoder qmg = this.GetGeocoder(mf.Address);
mf.lat = qmg.result.location.lat;
mf.lng = qmg.result.location.lng;

this.UpdateMeiFaLocation(mf);
}

}

private void UpdateMeiFaLocation(MeiFa mf)
{
string sql = "UPDATE t_meifa_bak SET [email protected],[email protected] WHERE [email protected]";
SqlParameter[] sps ={
new SqlParameter("@lng",mf.lng),
new SqlParameter("@lat",mf.lat),
new SqlParameter("@id",mf.Id),
};

SqlHelper.ExecuteNonQuery(SqlHelper.GetConnection(), CommandType.Text, sql, sps);
}

/// <summary>
/// 根据地理位置获取经纬度
/// </summary>
/// <param name="address">地址</param>
/// <returns></returns>
private QQMapGeocoder GetGeocoder(string address)
{
string apiMapUrl = "http://apis.map.qq.com/ws/geocoder/v1/?region=北京&address={0}&key=Y5QBZ-DEDR4-3W3U7-XL37W-VVMT6-3KB6K";
apiMapUrl = string.Format(apiMapUrl, address);
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(apiMapUrl);
request.Method = "GET";

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream newstream = response.GetResponseStream();
StreamReader srRead = new StreamReader(newstream, Encoding.UTF8);
string json = srRead.ReadToEnd();
QQMapGeocoder qmg = QQMapGeocoder.DeserializeGeocoder(json);
return qmg;
}

/// <summary>
/// 将列表保存到数据库
/// </summary>
/// <param name="url"></param>
private void SaveMeiFaData(string url)
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
request.Method = "GET";
request.KeepAlive = true;
request.ContentType = "application/x-www-form-urlencoded";

request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8";

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream newstream = response.GetResponseStream();
StreamReader srRead = new StreamReader(newstream, Encoding.UTF8);
string outString = srRead.ReadToEnd();

IList<MeiFa> mfList = this.getMeiFaList(outString);
this.InsertDb(mfList);
}

private string GetContent(IList<string> list)
{
string str = string.Empty;
foreach (string s in list)
{
str += s;
}
return str;
}

/// <summary>
/// 将列表数据转化成对象
/// </summary>
/// <param name="html"></param>
/// <returns></returns>
public IList<MeiFa> getMeiFaList(string html)
{
IList<MeiFa> mfList = new List<MeiFa>();
string reg = @"<ul[^>]*class=""detail""[^>]*>[\s\S]*?</ul>";
MatchCollection mc = Regex.Matches(html, reg);
foreach (Match m in mc)
{
string strDom = m.Value;
strDom = strDom.Replace("&nbsp;", " ");
MeiFa mf = MeiFa.CreateMeifa(strDom);
mfList.Add(mf);
}
return mfList;
}

public string ReplaceHtml(string HTMLStr)
{
return Regex.Replace(HTMLStr, "<[^>]*>", "");
}

public void InsertDb(IList<MeiFa> mfs)
{
foreach (var mf in mfs)
{
if (string.IsNullOrEmpty(mf.Name))
continue;

try
{
this.InsertDb(mf);
}
catch
{
continue;
}
}
}

/// <summary>
/// 插入到数据表里
/// </summary>
/// <param name="mf"></param>
public void InsertDb(MeiFa mf)
{
string sql = "INSERT INTO t_meifa(name,address,tel) values(@name,@address,@tel)";

SqlParameter[] sps ={
new SqlParameter("@name",mf.Name),
new SqlParameter("@address",mf.Address),
new SqlParameter("@tel",mf.Tel),
};

SqlHelper.ExecuteNonQuery(SqlHelper.GetConnection(), CommandType.Text, sql, sps);
}

public class MeiFa
{
public int Id { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public string Tel { get; set; }
public float? lng { get; set; }
public float? lat { get; set; }

public MeiFa()
{

}

public static MeiFa CreateMeifa(string domStr)
{
MeiFa m = new MeiFa();
try
{
Debug.WriteLine(domStr);

XmlDocument dom = new XmlDocument();
dom.LoadXml(domStr);

XmlNode nameNode = dom.SelectSingleNode("//ul/li[@class=\"shopname\"]/a[@data-hippo-type=\"shop\"]");
m.Name = nameNode.InnerText;

XmlNode addressNode = dom.SelectSingleNode("//ul/*/li[@class=\"address\"]");
string at = ReplaceAddress(addressNode.InnerText);
string[] ats = getArr(at);
m.Address = ats[0];
m.Tel = ats[1];
}
catch
{
m = new MeiFa();
}
return m;
}
/// <summary>
/// 生成数组
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
static private string[] getArr(string str)
{
string[] tempArr = str.Split(‘ ‘);
List<string> ss = new List<string>();
for (int i = 0; i < tempArr.Length; i++)
{
if (!string.IsNullOrEmpty(tempArr[i]))
{
ss.Add(tempArr[i]);
}
}

return ss.ToArray();
}

static private string ReplaceAddress(string s)
{
s = s.Replace("地址:", "");
s = s.Replace("\n", "");
return s;
}
}
}
}

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace DianPing_MeiFa
{
//[JsonProperty]
public class QQMapGeocoder
{
public int status { get; set; }
public string message { get; set; }
public QQMapResult result { get; set; }

public static QQMapGeocoder DeserializeGeocoder(string jsonStr)
{
JsonSerializerSettings jsz = new JsonSerializerSettings();
QQMapGeocoder qg = JsonConvert.DeserializeObject<QQMapGeocoder>(jsonStr, jsz);
return qg;
}
}

public class QQMapResult
{
public QQMapLocation location { get; set; }
public QQMapAddressComponents address_components { get; set; }
public string similarity { get; set; }
}

public class QQMapLocation
{
public float? lng { get; set; }
public float? lat { get; set; }
}

public class QQMapAddressComponents
{
public string province { get; set; }
public string city { get; set; }
public string district { get; set; }
public string street { get; set; }
public string street_number { get; set; }

}

}

注:仅供学习使用!

时间: 2024-08-10 02:11:50

获取大众点评数据的相关文章

大众点评数据交换工具Wormhole设计与实现

1.1.1 数据交换工具Wormhole设计与实现 1.1.1.1 Wormhole整体设计 Wormhole是框架加插件的设计,各模块的设计思路: 1)  框架分为读管理器.双端缓冲队列和写管理器.读写管理器分别持有读写线程池,双端缓冲队列负责读写线程的数据交换. 2)  每种数据存储的插件分为或读写两种类型,每种类型又具体分为读或写.预和后处理.分片三种类型的插件.用不同接口来标识每种插件.扩展一种数据存储类型的方式是实现这些插件. 3)  插件的类型信息存在任务的配置文件中,以便解耦合,任

抓取大众点评网站数据

使用PHP单线程抓取,速度比较慢,可以抓取所有的团购信息:店铺信息也可以抓取: 公司测试产品需要使用一些数据,所有试着抓取的,感觉就是写正则,不指定别人是怎么样的实现思路,感觉使用php多线程应该会速度更好吧. 我主要是抓评论跟一些图片,但是其他思路基本一样.按理来说,只要能显示出到网页上的,都可以抓下来. 我抓取的思路是第一步获取所有的city信息即test_get_city_info: 第二部通过city的url抓取每个city的每个类别的商品团购信息test_get_web_info 第三

Hawk: 20分钟无编程抓取大众点评17万数据

1. 主角出场:Hawk介绍 Hawk是沙漠之鹰开发的一款数据抓取和清洗工具,目前已经在Github开源.详细介绍可参考:http://www.cnblogs.com/buptzym/p/5454190.html,强烈建议先读这篇文章,该文介绍了详细原理和抓取链家二手房的攻略,以此为基础,才能较好的理解整个操作. 本文将讲解通过本软件,获取大众点评的所有美食数据,可选择任一城市,也可以很方便地修改成获取其他生活门类信息的爬虫. 本文将省略原理,一步步地介绍如何在20分钟内完成爬虫的设计,基本不需

大众点评网2014年5月份数据更新(超900万)

数据说明:大众点评全网数据(所有城市,所有分类,不含境外城市),本次共采集商户数据超过915万条(9156120条). 大众点评数据总量 更新说明:■  修复部分"区"为空的Bug.■  增加了谷歌经纬度.团购.会员卡等字段. 详细字段说明:"shop_id"(商户ID,唯一.不变),"name"(商户名称),"alias"(别名),"province"(省),"city"(市),&qu

python爬虫实例详细介绍之爬取大众点评的数据

python 爬虫实例详细介绍之爬取大众点评的数据 一. Python作为一种语法简洁.面向对象的解释性语言,其便捷性.容易上手性受到众多程序员的青睐,基于python的包也越来越多,使得python能够帮助我们实现越来越多的功能.本文主要介绍如何利用python进行网站数据的抓取工作.我看到过利用c++和Java进行爬虫的代码,c++的代码很复杂,而且可读性.可理解性较低,不易上手,一般是那些高手用来写着玩加深对c++的理解的,这条路目前对我们不通.Java的可读性还可以,就是代码冗余比较多,

采集大众点评、美团等数据进行大数据挖掘

当你有了一只美丽的爬虫后你可以做很多有意思的事情,比如爬虫爬到了很多餐饮数据后就可以做餐饮地区活跃度分析了,这些分析指标是很有意义的,特别是对准备开店的人.首先要将数据从大众点评.美团或其他网站数据采集下来,方式可以从美食产品入口,然后找到餐饮公司信息,然后找到地址,地区等信息.采集的时候要做好防重策略,这样可以节省很多时间,还有就是不要并发太大,以免影响正常的业务.将采集到的数据写入数据库,以备后用.有了这些数据就可以对餐饮公司的分布做统计分析了,能很容易统计出某个城市餐饮公司的地区分布情况,

2015年全国大众点评网商户信息数据

2015年更新全国总数据量将近1500万条 [数据说明] 大众点评网商户信息数据 1500万 条 [更新时间] 2015年10月 [字段说明] 商户ID,是否加V,是否停业,商户名称,别名,省,市,城市拼音,城市ID,区,一级分类,一级分类ID,二级分类,二级分类ID,地址,商圈,联系电话,营业时间,均价,星级,图片,描述,标签,地图类型,腾讯纬度,腾讯经度,GPS经度,GPS纬度,导航,交通,氛围,特色,支付,产品评分,环境评分,服务评分,总点评数,5星数,4星数,3星数,2星数,1星数,推荐

大众点评的大数据实践-CSDN.NET

大众点评的大数据实践-CSDN.NET 大众点评的大数据实践 爬虫工程师成大数据时代的"宠儿" - 杭州新闻中心 - 杭州网 爬虫工程师成大数据时代的"宠儿"

iOS_21团购_发送请求获取【点评】数据

请求结果简单显示: 用到的点评封装的类: 使用tableView简单展示: // // DealListController.m // 帅哥_团购 // // Created by beyond on 14-8-14. // Copyright (c) 2014年 com.beyond. All rights reserved. // 点击dock上面的[团购]按钮对应的控制器,上面是导航栏,导航栏右边是searchBar,导航栏左边是一个大按钮(TopMenu)(内部由三个小按钮组成<TopM