概述

有时候我们需要去查询某些地点的坐标,那么我们可以用百度提供的坐标拾取系统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. 学习T-io框架,从写一个Redis客户端开始

    前言   了解T-io框架有些日子了,并且还将它应用于实战,例如 tio-websocket-server,tio-http-server等.但是由于上述两个server已经封装好,直接应用就可以.所 ...

  2. leetcode 121. Best Time to Buy and Sell Stock 、122.Best Time to Buy and Sell Stock II 、309. Best Time to Buy and Sell Stock with Cooldown

    121. Best Time to Buy and Sell Stock 题目的要求是只买卖一次,买的价格越低,卖的价格越高,肯定收益就越大 遍历整个数组,维护一个当前位置之前最低的买入价格,然后每次 ...

  3. iOS 地图相关

    参考博文:https://blog.csdn.net/zhengang007/article/details/52858198?utm_source=blogxgwz7 1.坐标系 目前常见的坐标系有 ...

  4. [iOS]CIFilter滤镜

    - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...

  5. Java并发编程(六)原子性与易变性

    原子性 原子是最小单元.不可再分的意思.原子性是指某个操作在获取CPU时间时,要么就给它足够时间,让这个操作执行完,要么就不执行这个操作,执行时不能出现上下文切换(把CPU时间从一个线程分配到另一个线 ...

  6. 实现一个div的拖拽效果

    实现思路: 鼠标按下开始拖拽 记录摁下鼠标时的鼠标位置以及元素位置 拖动鼠标记下当前鼠标的位置 鼠标当前位置-摁下时鼠标位置= 鼠标移动距离 元素位置= 鼠标移动距离+鼠标摁下时元素的位置 class ...

  7. react-router里使用history

    import React, { Component } from 'react';import {Router, Route, Switch} from 'react-router-dom';impo ...

  8. Windows10系统在VMware中安装CentOS7操作系统并实现图形化用户界面Gnome

    由于操作系统课程需要,我尝试在windows10环境下安装linux虚拟机,最终采用centOS7和Gnome图形用户界面,在安装和使用过程中出现一些问题,在这里将其记录下来,以便后续查阅. 第一部分 ...

  9. ionic2添加支付宝插件出现问题

    安装本地路径插件正常  编译正常  在打开支付页面时候 就报这个错 在手机app点击无效 错误信息: ERROR Error: Uncaught (in promise): Error: No pro ...

  10. Rabbitmq(三)

    1.在服务器安装好rabbitmq后,自己配置自己用的vhost,exchange和queue的绑定 2.项目添加RabbitMqClient.dll(nuget获取)引用 3.添加helper就可以 ...