利用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[0].Children)
                {

                    r.village = villageName;
                    r.twon = twonName;
                    r.county = countyName;
                    r.city = cityName;
                    r.provice = proviceName;
                    ishave = false; //判断页面中有没有查询到该村
                    HtmlElement ap = e.GetElementsByTagName("div")[0];
                    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 == 0)
            {
                this.Invoke(new Action(() =>
                {
                    this.timer1.Enabled = true;
                }));

                this.button1.Enabled = true;
                return;

            }
            int i = 0;
            foreach (data d in dt)
            {

                i++;
                //iscompel加载没有完成等待
                while (!isCompel)
                {
                    Thread.Sleep(200);
                }
                isCompel = false;
                Thread.Sleep(2000);
                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[0].Children)
                {

                    r.village = villageName;
                    r.twon = twonName;
                    r.county = countyName;
                    r.city = cityName;
                    r.provice = proviceName;
                    ishave = false; //判断页面中有没有查询到该村
                    HtmlElement ap = e.GetElementsByTagName("div")[0];
                    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();
            }

        }

    }
}

声明

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

时间: 2024-10-12 11:40:12

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

WebBrowser自动点击链接 广告自动点击 Ads Auto Click

点击付费广告, 是目前比较流行的一种网络营销模式, 但是,如果你单纯的靠手工一个一个去点, 总觉得不划算  , 能不能实现自动的去点击呢? 答案是肯定的 .NET 里面的 WebBrowser, 可以满足我们的要求 如果你利用本文的思路,去做赚Money的事情,后果自负 (不过,目前这种事情已经不好做了,各付费网站都采取了应对措施,呵呵,魔高一尺,道高一丈,实现还是可行的,具体就靠大家自己去发挥了) 下面给出一部分核心代码,全部代码,请下载本文附带的项目源码 private void webBr

七色花基本权限系统(5)- 实体配置的使用和利用T4自动生成实体配置

在前面的章节里,用户表的结构非常简单,没有控制如何映射到数据库.通常,需要对字段的长度.是否可为空甚至特定数据类型进行设置,因为EntityFramework的默认映射规则相对而言比较简单和通用.在这篇日志里,将演示如何对数据实体进行映射配置,并利用T4模板自动创建映射配置类文件. 配置方式 EntityFramework的实体映射配置有2种. 第一种是直接在实体类中以特性的方式进行控制,这些特性有部分是EF实现的,也有部分是非EF实现的.也就是说,在数据实体层不引用EF的情况下,只能使用不全的

winform下利用webBrowser执行javascript

目前很多网站为了防止恶意提交表单信息,大多都采用了加密的方式对提交信息进行处理,加密处理后通过POST提交给服务器验证,这种操作一般都是用Javascipt进行加密,若是我们想要正确提交表单到网站,就需要对javascipt的加密操作进行模拟.那么我们同样可以利用WebBrowser来执行JS脚本,达到加密的目的. 就以移动MM的登录获取验证码为例子,简单描述一下WebBrowser执行JS的过程. jQuery.ajax({                    url: "/portal/w

scrapy自动抓取蛋壳公寓最新房源信息并存入sql数据库

利用scrapy抓取蛋壳公寓上的房源信息,以北京市为例,目标url:https://www.dankegongyu.com/room/bj 思路分析 每次更新最新消息,都是在第一页上显示,因此考虑隔一段时间自动抓取第一页上的房源信息,实现抓取最新消息. 利用redis的set数据结构的特征,将每次抓取后的url存到redis中: 每次请求,将请求url与redis中的url对比,若redis中已存在该url,代表没有更新,忽略该次请求:若redis中不存在该url,代表该信息是新信息,抓取并将u

一种利用人参酒自动诊断失眠的仪器

技术领域 本实用新型涉及一种利用人参酒自动诊断失眠的仪器,尤其是一种诊断失眠的仪器. 背景技术 现有诊断失眠的仪器是职业医师用来检查患者失眠状态,并利用其对患者的病情进行分析的仪器.一种利用人参酒自动诊断失眠的仪器是一种可以替代医师来诊断失眠患者病情的仪器.它是按照加法器,乘法器的计算,并利用人参酒.黄酒.白酒.葡萄酒和啤酒对患者的病情进行治疗的电子仪器.它具有自动诊断失眠患者病情的能力,经长期临床检验,对失眠患者的治愈率高达20%. 实用新型内容 为了解决职业医师对失眠患者病情判断不准确的缺陷

Scrapy精华教程(六)——自动爬取网页之II(CrawlSpider)

一.目的. 在教程(二)(http://blog.csdn.net/u012150179/article/details/32911511)中使用基于Spider实现了自己的w3cschool_spider,并在items.py中定义了数据结构, 在pipelines.py中实现获得数据的过滤以及保存. 但是以上述方法只能爬取start_url列表中的网页,而网络爬虫如google等搜索引擎爬虫实现的就是对整个互联网的爬取,所以在本教程中研究使用scrapy自动实现多网页爬取功能. 在教程(五)

WebBrowser自动填充打开文件对话框

WebBrowser自动填充打开文件对话框 在使用WebBrowser编写自动表单填写软件的时候,不知道大家是否遇到国填写文件选择表单的情况.遇到这种情况的时候,无法直接队Html元素赋值,必须模拟手工选择的办法(是否有其它解决办法,不得而知),下面我们来说一下我的解决办法,如下: 1.先说一下正常表单的填写方式,在Delphi+WebBrowser的环境下,可采用如下代码: 1 WebBrowser.OleObject.document.all.item('XXX', 0).value :=x

利用EXCEL自动统计实验结果的准确率

我们在做的实验的时候,通常都需要计算实验结果的准确率.当时数据量较大时,依靠人工来计算是不现实的,不仅十分慢而极易出错.如果我们事先将实验结果文件进行合理的格式化,则可以利用EXCEL自动进行统计,不仅效率高,也不担心出错了.简单地,利用EXCEL中的自动筛选或分类汇总功能也可实现一些统计,但是当数据量特别大时,分类汇总很卡,易导致崩溃,而且功能单一,不能灵活组合:而自动筛选则需要不停地滚来滚去或不断地切换表,也十分不方便.所以我考虑自己写程序来实现统计,这样便于对统计数据进行任意操作,比如移动

经验总结:WebBrowser自动点击弹出提示框alert、弹出对话框confirm、屏蔽弹出框、屏蔽弹出脚本错误的解决办法

经验总结:WebBrowser自动点击弹出提示框alert.弹出对话框confirm.屏蔽弹出框.屏蔽弹出脚本错误的解决办法 网上有好多解决方法,可是不一定好使,本人经过多次试验,针对WebBrowser控件中自动点击弹出框及禁用脚本提示问题得到如下几种实际情况的解决办法,绝对管用. 1.屏蔽弹出错误脚本 将WebBrowser控件ScriptErrorsSuppressed设置为True即可. (参考本篇博客:http://www.cnblogs.com/qqflying/archive/20