利用webbrowser自动查取地点坐标
概述
有时候我们需要去查询某些地点的坐标,那么我们可以用百度提供的坐标拾取系统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自动查取地点坐标的更多相关文章
- 利用WebBrowser彻底解决Web打印问题
原文:利用WebBrowser彻底解决Web打印问题 利用WebBrowser彻底解决Web打印问题(包括后台打印) BS架构下的打印大家是怎么解决的呢,我最近作了一个项目正好负责这一块,不仅要求打印 ...
- scrapy实现自动抓取51job并分别保存到redis,mongo和mysql数据库中
项目简介 利用scrapy抓取51job上的python招聘信息,关键词为“python”,范围:全国 利用redis的set数据类型保存抓取过的url,现实避免重复抓取: 利用脚本实现每隔一段时间, ...
- linux(以ubuntu为例)下Android利用ant自动编译、修改配置文件、批量多渠道,打包生成apk文件
原创,转载请注明:http://www.cnblogs.com/ycxyyzw/p/4555328.html 之前写过一篇<windows下Android利用ant自动编译.修改配置文件.批量 ...
- C/S模式开发中如何利用WebBrowser控件制作导航窗体
原文:C/S模式开发中如何利用WebBrowser控件制作导航窗体 转自: CSDN 相信不少同学们都做过MIS系统的开发,今天这里不讨论B/S模式开发的问题.来谈谈winform开发.用过市面上常见 ...
- 利用WebBrowser实现Web打印的分析
原文:利用WebBrowser实现Web打印的分析 WebBrowser是IE内置的浏览器控件,无需用户下载.本文档所讨论的是有关IE6.0版本的WebBrowser控件技术内容.其他版本的IE应该也 ...
- Asp.Net Core 轻松学-利用 Swagger 自动生成接口文档
前言 目前市场上主流的开发模式,几乎清一色的前后端分离方式,作为服务端开发人员,我们有义务提供给各个客户端良好的开发文档,以方便对接,减少沟通时间,提高开发效率:对于开发人员来说,编写接口文档 ...
- 学习笔记CB010:递归神经网络、LSTM、自动抓取字幕
递归神经网络可存储记忆神经网络,LSTM是其中一种,在NLP领域应用效果不错. 递归神经网络(RNN),时间递归神经网络(recurrent neural network),结构递归神经网络(recu ...
- winform下利用webBrowser执行javascript
目前很多网站为了防止恶意提交表单信息,大多都采用了加密的方式对提交信息进行处理,加密处理后通过POST提交给服务器验证,这种操作一般都是用Javascipt进行加密,若是我们想要正确提交表单到网站,就 ...
- PYTHON 爬虫笔记八:利用Requests+正则表达式爬取猫眼电影top100(实战项目一)
利用Requests+正则表达式爬取猫眼电影top100 目标站点分析 流程框架 爬虫实战 使用requests库获取top100首页: import requests def get_one_pag ...
随机推荐
- 关于PCA的一些学习汇总
主成分分析PCA算法:为什么去均值以后的高维矩阵乘以其协方差矩阵的特征向量矩阵就是“投影”? https://www.zhihu.com/question/30094611 还有一些疑问:1.这个散步 ...
- jfinal form表单提交文件
前台代码 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8&q ...
- oracle 查看表空间以及剩余量
--1.查看表空间的名称及大小 SELECT t.tablespace_name, round(SUM(bytes / (1024 * 1024)), 0) ts_size FROM dba_tabl ...
- 用 S5PV210 学习 Linux (三) SD卡下载
学习地址:http://edu.51cto.com/lesson/id-63015.html http://blog.csdn.net/karven_/article/details/52015325 ...
- windows 建立任务执行计划 自动执行脚本
对于windows服务器网站如果要定时执行脚本,则需要在windows控制面板里找到 管理工具,点击任务计划程序,创建任务填写任务名称 触发器里新建触发条件,设置间隔时间 在操作项,新建触发时需要做的 ...
- linux查看网卡地址和硬盘序列号
linux查看网卡地址命令:ifconfig linux查看硬盘序列号命令:hdparm -i /dev/sda
- jquery选择器基础
简单选择器 类 id 元素/标签 * 复合(sel1,sel2)逗号隔开 层次选择器 s1 s2:后代选择器,空格隔开 p>c:子代选择器:不包括孙代及以下 p+next :相邻选择器 p~su ...
- 微信小程序 - bindtap等事件传参
什么是事件事件是视图层到逻辑层的通讯方式. 事件可以将用户的行为反馈到逻辑层进行处理. 事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数. 事件对象可以携带额外信息,如 id, ...
- 大数据时代的结构化存储--HBase
迄今,相信大家肯定听说过 HBase,但是对于 HBase 的了解可能仅仅是它是 Hadoop 生态圈重要的一员,是一个大数据相关的数据库技术. 今天我带你们一起领略一下 HBase 体系架构,看看它 ...
- 搭建最小linux系统
Busybox简介 • 制作文件系统我们需要使用到Busybox 工具 – 版本为busybox-1.21.1.tar.bz2 – 开源网址是http://www.busybox.net/ – Bus ...