概述

有时候我们需要去查询某些地点的坐标,那么我们可以用百度提供的坐标拾取系统http://api.map.baidu.com/lbsapi/getpoint/index.html,但是会发现它只能一个一个的查,还要不停的点击,要是查询的量特别大,比如说要查某个省的所有村,甚至全国所有村的坐标怎么办,人工查寻绝对会累趴下。所以我就写了一个这样的工具:自动查取地点坐标工具

功能

现在这个工具主要是针对的村和镇,因为查询市,县范围比较大,百度的坐标拾取系统也经常拾取不到坐标。

1.数据框要求输入是json格式

2.结果框输出的也是json格式

原理

原理主要就是利用webbrowser控件与页面元素交互,例如实现自动点击,监控页面变化做出下一步相应的操作,下面我会详细讲解代码

主要代码逻辑

点击事件里声明了一条线程,并且让webbrowser跳转到百度坐标拾取系统,但是并没有开始线程,为什么现在不开始线程呢,因为如果现在开始线程可能什么页面元素也捕捉不到,现在页面还没有加载完,所以只有等页面加载完了才能去与页面交互

private void button1_Click(object sender, EventArgs e)
{
this.button1.Enabled = false;
webBrowser1.Navigate("http://api.map.baidu.com/lbsapi/getpoint/index.html");//加载初始化页面
th = new Thread(new ThreadStart(getGps));
th.IsBackground = false;
isfirst = true;
islast = false; }

webBrowser1_DocumentCompleted事件是页面加载完激发的事件,线程在这里开始

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
isCompel = true;
if (isfirst)
{
isfirst = false;
th.Start();
} }

页面加载完成后,开始操作页面

              //填写地址
HtmlElement htmlGpsName = doc.GetElementById("localvalue");
htmlGpsName.SetAttribute("value", d.city + d.village);
//点击查询
HtmlElement htmlBut = doc.GetElementById("localsearch");
htmlBut.InvokeMember("click");

然后又添加了一个timer控件,这个控件会隔断时间轮询一个方法,那么timer控件主要在这里得作用是什么呢?当利用webbrowser点击百度拾取坐标系统的百度一下按钮时,页面会异步加载一些数据,这时webBrowser1_DocumentCompleted就无能为力了,我们利用timer执行一个方法监视页面的变化当出现特定的某些内容时说明页面已经加载完成,此时我们就可以执行下一步的页面操作了,timer的作用就是在这里监视页面变化的作用。

private void timer1_Tick(object sender, EventArgs e)
{ checkComplete();
}
//页面抓取数据 坐标
public void checkComplete()
{
result r = new result();
HtmlDocument doc = this.webBrowser1.Document;
if (doc.Body.InnerHtml.Contains("功能简介"))
{
//如果一直有 功能简介 这些字样说明点击按钮页面还没有加载
return;
}
this.timer1.Enabled = false;
if (doc.Body.InnerHtml.Contains("id=no0"))
{
HtmlElement rightdiv = doc.GetElementById("txtPanel");
bool ishave = false; foreach (HtmlElement e in rightdiv.Children[].Children)
{ r.village = villageName;
r.twon = twonName;
r.county = countyName;
r.city = cityName;
r.provice = proviceName;
ishave = false; //判断页面中有没有查询到该村
HtmlElement ap = e.GetElementsByTagName("div")[];
if (ap.InnerText.Contains(villageName))
{ if (ap.InnerHtml.Contains(cityName) && (ap.InnerHtml.Contains(villageName) || ap.InnerHtml.Contains(villageName.Replace("社区", "区"))))
{
string Coordinate = reg_zb.Match(ap.InnerHtml).Value;
r.Coordinate = Coordinate;
results.Add(r);
ishave = true;
break;
}
} }
if (!ishave)
{
//没有该村记录
results.Add(r);
} //停止定时页面加载 }
if (doc.Body.InnerHtml.Contains("没有找到相关的地点"))
{
results.Add(r);
} //如果是最后一条记录
if (!islast)
{
webBrowser1.Navigate("http://api.map.baidu.com/lbsapi/getpoint/index.html");
}
else
{
this.txt_result.Text = JsonConvert.SerializeObject(this.results);
this.button1.Enabled = true; } }

源码

由于用工具写的博客不能插入下载的文件,所以在这里贴出源码,json用的是第三方的:Newtonsoft.Json

大家学习了这个以后会掌握webbrowser与页面交互的方法,举一反三,能够极大的方便工作和生活,写出更多的自动化程序,也希望大家能够分享出来方便他人

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Collections;
using System.Text.RegularExpressions;
using System.Threading;
using Newtonsoft.Json;
using System.IO; //1.点击开始按钮,加载初始化页面,同时声明多线程 getgps方法
//2.浏览器家在完成以后触发webBrowser1_DocumentCompleted 事件,将iscompel初始化true,表示加载完成页面可以进行下一步操作,同时isfirst变为false,说明th.start只执行一次
//3.开始执行线程getGps方法
//while (!isCompel)
// {
// Thread.Sleep(200);
// }
//判断页面有没有加载完成,没有完成就等待页面加载完成
//4.读取相关,村,镇等信息
//5.设置timer=true,开始抓去页面
//6.抓去完也面上的信息后设置timer=false,并且设置浏览器跳转页面
//7.线程getgps()继续等待iscompel完成,完成后继续从2开始
namespace mapCoordinate
{ public partial class Form1 : Form
{
string villageName = string.Empty;
string cityName = string.Empty;
string proviceName = string.Empty;
string twonName = string.Empty;
string countyName = string.Empty;
List<result> results = new List<result>(); Regex noid = new Regex(@"no\d+
");
Regex reg_zb = new Regex(@"\d+\.\d+,\d+\.\d+
", RegexOptions.IgnorePatternWhitespace); Thread th = null;
bool islast = false;
StringBuilder sbNoCun = new StringBuilder();
StringBuilder sb = new System.Text.StringBuilder();
bool isCompel = false;//是否加载完成
bool isfirst = false;
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{ }
public void getGps()
{ List<data> dt = getVillageName();
if (dt.Count == )
{
this.Invoke(new Action(() =>
{
this.timer1.Enabled = true;
})); this.button1.Enabled = true;
return; }
int i = ;
foreach (data d in dt)
{ i++;
//iscompel加载没有完成等待
while (!isCompel)
{
Thread.Sleep();
}
isCompel = false;
Thread.Sleep();
HtmlDocument doc = null;
this.Invoke(new Action(() =>
{
doc = this.webBrowser1.Document;
})); cityName = d.city;
villageName = d.village;
proviceName = d.provice; HtmlElement htmlGpsName = doc.GetElementById("localvalue");
htmlGpsName.SetAttribute("value", d.city + d.village);
HtmlElement htmlBut = doc.GetElementById("localsearch");
htmlBut.InvokeMember("click");
this.Invoke(new Action(() =>
{
this.timer1.Enabled = true;
})); if (i == dt.Count)
{
islast = true;
}
} }
//要查询的数据源
public List<data> getVillageName()
{ List<data> dt = JsonConvert.DeserializeObject<List<data>>(this.txt_data.Text);
return dt;
}
private void button1_Click(object sender, EventArgs e)
{
this.button1.Enabled = false;
webBrowser1.Navigate("http://api.map.baidu.com/lbsapi/getpoint/index.html");//加载初始化页面
th = new Thread(new ThreadStart(getGps));
th.IsBackground = false;
isfirst = true;
islast = false; } //定时器 private void timer1_Tick(object sender, EventArgs e)
{ checkComplete();
}
//页面抓取数据 坐标
public void checkComplete()
{
result r = new result();
HtmlDocument doc = this.webBrowser1.Document;
if (doc.Body.InnerHtml.Contains("功能简介"))
{
//如果一直有 功能简介 这些字样说明点击按钮页面还没有加载
return;
}
this.timer1.Enabled = false;
if (doc.Body.InnerHtml.Contains("id=no0"))
{
HtmlElement rightdiv = doc.GetElementById("txtPanel");
bool ishave = false; foreach (HtmlElement e in rightdiv.Children[].Children)
{ r.village = villageName;
r.twon = twonName;
r.county = countyName;
r.city = cityName;
r.provice = proviceName;
ishave = false; //判断页面中有没有查询到该村
HtmlElement ap = e.GetElementsByTagName("div")[];
if (ap.InnerText.Contains(villageName))
{ if (ap.InnerHtml.Contains(cityName) && (ap.InnerHtml.Contains(villageName) || ap.InnerHtml.Contains(villageName.Replace("社区", "区"))))
{
string Coordinate = reg_zb.Match(ap.InnerHtml).Value;
r.Coordinate = Coordinate;
results.Add(r);
ishave = true;
break;
}
} }
if (!ishave)
{
//没有该村记录
results.Add(r);
} //停止定时页面加载 }
if (doc.Body.InnerHtml.Contains("没有找到相关的地点"))
{
results.Add(r);
} //如果是最后一条记录
if (!islast)
{
webBrowser1.Navigate("http://api.map.baidu.com/lbsapi/getpoint/index.html");
}
else
{
this.txt_result.Text = JsonConvert.SerializeObject(this.results);
this.button1.Enabled = true; } } private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
isCompel = true;
if (isfirst)
{
isfirst = false;
th.Start();
} } }
}

声明

写博客辛苦,希望大家能点个赞,关注我,转载需注明出去。

利用webbrowser自动查取地点坐标的更多相关文章

  1. 利用WebBrowser彻底解决Web打印问题

    原文:利用WebBrowser彻底解决Web打印问题 利用WebBrowser彻底解决Web打印问题(包括后台打印) BS架构下的打印大家是怎么解决的呢,我最近作了一个项目正好负责这一块,不仅要求打印 ...

  2. scrapy实现自动抓取51job并分别保存到redis,mongo和mysql数据库中

    项目简介 利用scrapy抓取51job上的python招聘信息,关键词为“python”,范围:全国 利用redis的set数据类型保存抓取过的url,现实避免重复抓取: 利用脚本实现每隔一段时间, ...

  3. linux(以ubuntu为例)下Android利用ant自动编译、修改配置文件、批量多渠道,打包生成apk文件

    原创,转载请注明:http://www.cnblogs.com/ycxyyzw/p/4555328.html  之前写过一篇<windows下Android利用ant自动编译.修改配置文件.批量 ...

  4. C/S模式开发中如何利用WebBrowser控件制作导航窗体

    原文:C/S模式开发中如何利用WebBrowser控件制作导航窗体 转自: CSDN 相信不少同学们都做过MIS系统的开发,今天这里不讨论B/S模式开发的问题.来谈谈winform开发.用过市面上常见 ...

  5. 利用WebBrowser实现Web打印的分析

    原文:利用WebBrowser实现Web打印的分析 WebBrowser是IE内置的浏览器控件,无需用户下载.本文档所讨论的是有关IE6.0版本的WebBrowser控件技术内容.其他版本的IE应该也 ...

  6. Asp.Net Core 轻松学-利用 Swagger 自动生成接口文档

    前言     目前市场上主流的开发模式,几乎清一色的前后端分离方式,作为服务端开发人员,我们有义务提供给各个客户端良好的开发文档,以方便对接,减少沟通时间,提高开发效率:对于开发人员来说,编写接口文档 ...

  7. 学习笔记CB010:递归神经网络、LSTM、自动抓取字幕

    递归神经网络可存储记忆神经网络,LSTM是其中一种,在NLP领域应用效果不错. 递归神经网络(RNN),时间递归神经网络(recurrent neural network),结构递归神经网络(recu ...

  8. winform下利用webBrowser执行javascript

    目前很多网站为了防止恶意提交表单信息,大多都采用了加密的方式对提交信息进行处理,加密处理后通过POST提交给服务器验证,这种操作一般都是用Javascipt进行加密,若是我们想要正确提交表单到网站,就 ...

  9. PYTHON 爬虫笔记八:利用Requests+正则表达式爬取猫眼电影top100(实战项目一)

    利用Requests+正则表达式爬取猫眼电影top100 目标站点分析 流程框架 爬虫实战 使用requests库获取top100首页: import requests def get_one_pag ...

随机推荐

  1. WPF实战俄罗斯方块

    概述 本文试图通过经典的游戏-俄罗斯方块,来演示WPF强大的图形界面编程功能. 涉及的图形方面有这几个方面: 1.不规则界面的设置 2.布局系统的使用 3.2D图形的应用 4.输入事件的响应 5.风格 ...

  2. 如何导出SHP文件中的点坐标?(ArcGIS10)

    行政区域坐标,网上流传较广的版本是包括海域的,假如你仅仅想要把陆地边界绘出,那么怎么办呢? 现在讲一下用arcgis 10从shp线.面文件中获取对应区域的坐标呢?(点图层忽略第一步) 首先用在arc ...

  3. 深入理解计算机系统——系统级I/O

    一.UNIX I/O     在UNIX系统中有一个说法,一切皆文件.所有的I/O设备,如网络.磁盘都被模型化为文件,而所有的输入和输出都被当做对相应文件的读和写来执行.这种将设备映射为文件的方式,允 ...

  4. 结构之美——优先队列基本结构(四)——二叉堆、d堆、左式堆、斜堆

    实现优先队列结构主要是通过堆完成,主要有:二叉堆.d堆.左式堆.斜堆.二项堆.斐波那契堆.pairing 堆等. 1. 二叉堆 1.1. 定义 完全二叉树,根最小. 存储时使用层序. 1.2. 操作 ...

  5. GPUImage源码解读之GLProgram

    简述 GLProgram是GPUImage中代表openGL ES 中的program,具有glprogram功能.其实是作者对OpenGL ES program的面向对象封装 初始化 - (id)i ...

  6. hiveSql常见错误记录

    1. In strict mode, if ORDER BY is specified, LIMIT must also be specified. 这个错误提示是因为在hive下写的sql使用了or ...

  7. office365离线安装

    office版本是在线安装,每次安装比较麻烦,所以还是离线安装合适,这里推荐一篇博文https://www.cnblogs.com/Devopser/p/7919245.html 但是由于部署工具变化 ...

  8. LL(1)文法--递归下降程序

    递归下降程序 递归下降程序一般是针对某一个文法的.而递归下降的预测分析是为每一个非终结符号写一个分析过程,由于文法本身是递归的,所以这些过程也是递归的. 以上是前提. Sample 假如给的是正规式子 ...

  9. mac 装5.6版本mysql 设置密码

    最的mysql在装的时候就可以设置 ,但是低版本的好像不行,需要在装了以后才能设置. mac下,mysql5.7.18连接出错,错误信息为:Access denied for user 'root'@ ...

  10. float(浮动)的属性和使用方法

    1float浮动的属性值 left:向左浮动 right:向右浮动 2.当父元素未浮动,子元素浮动时,就会造成浮动塌陷 实例: 父元素: #mainDiv{ border: 5px solid red ...