最近公司有个项目,需要爬取一些数据,如果是简单的数据都很好处理,但是目标源有些数据需要拖动地图来获取,因此第一反应的解决方法是模拟鼠标及键盘来操作地图,这里的难点是如何实现类人行为方式:按下鼠标左键、拖动鼠标,滚动地图?!
尝试了很多方式都不成功,鼠标是定位到了需要定位的地方,但是地图并没有跟着移动,搞了两天接近奔溃,终于解决了!现将DEMO中部分核心CODE贴出来,希望能帮助到有这方面需要的朋友:
// 定位到某个空白区域
Task.Delay(2000).Wait();
_xpos = _pos.MovePos.x; _ypos = _pos.MovePos.y;
MyWinApi.SetCursorPos(_xpos, _ypos);
// 关键CODE:让鼠标联接--能通过移动鼠标实现地图移动
Task.Delay(1000).Wait();
MyWinApi.mouse_event((int)MyWinApi.MouseFlag.MouseLeftDown, 0, 0, 0, 0);
Cursor.Position = new System.Drawing.Point(_xpos, _ypos);
MyWinApi.mouse_event((int)MyWinApi.MouseFlag.MouseLeftDown, 0, 0, 0, 0);
// 关键CODE:连带鼠标
Task.Delay(1000).Wait();
MyWinApi.mouse_event((int)MyWinApi.MouseFlag.MouseLeftDown | (int)MyWinApi.MouseFlag.MouseMove, 50, 50, 0, 0);
// 关键CODE:定位到需要鼠标拖动到的位置
_xpos = _pos.DragPos.x; _ypos = _pos.DragPos.y;
Task.Delay(3000).Wait();
MyWinApi.SetCursorPos(_xpos, _ypos);
// 释放链接
Task.Delay(1000).Wait();
MyWinApi.mouse_event((int)MyWinApi.MouseFlag.MouseLeftDown | (int)MyWinApi.MouseFlag.MouseLeftUp, 0, 0, 0, 0);
以上只是测验的DEMO Code,提供个思路吧!