一种自动收集数据方法及系统
文献发布时间:2023-06-19 09:27:35
技术领域
本发明涉及计算机技术领域,更具体地说,涉及到一种自动收集数据方法及系统。
背景技术
页面应用中的GeeTest滑动滑块的验证,在表单提交之前可以看到一张完整的图片字节流信息,当点击滑块的时候完整的图片字节流切换成一张有缺口的图片字节流信息,在拖动滑块时图片字节流上方出现一张小图,随着鼠标的左右拖动,小图也会跟随着鼠标的左右移动,将小图拖动到图片缺口并填满整个缺口时松开鼠标左键,这时候验证通过表单正常提交。
需要设计一款自动识别图片字节流的程序,如下是几个需要解决的问题:
1.针对零散的图片字节流如何按序拼接起来,一张是完整的图片字节流,一张是带有缺口的图片字节流;
2.得到拼接之后两种图片字节流需要通过程序算法得出缺口所在的位置,这一步至关重要,技术上突破才能完成表单的提交
需要设计一款自动模拟鼠标移动的程序
1.通过程序让电脑的鼠标听指挥,例如可以做到按住鼠标左键不动,拖动鼠标并在屏幕上显示光标的位置,到达指定位置后,松开鼠标左。
本发明内容
为了克服现有技术的不足,本发明提供一种自动收集数据方法用来解决收集数据效率比较低下的问题。
本发明解决其技术问题所采用的技术方案是:提供一种自动收集数据方法,包括以下步骤:
步骤一:使用Selenium模拟鼠标滑动;
步骤二:从html获取完整的图片和有缺口的图片;
步骤三:根据完整的图片与有缺口的图片相同位置的像素进行对比;
步骤四:使用moveByOffset进行模拟滑动。
优选地,使用Selenium模拟鼠标滑动之后,所述步骤还包括:
使用Selenium中的WebDriver工具类获取html整个DOW节点;
逐层解析从html获取的整个DOW节点,获取图片所在的节点。
优选地,获取图片所在的节点之后,从html获取完整的图片和有缺口的图片之前,所述步骤还包括:
根据获取的图片所在节点,获取图片的url地址;
根据图片的url地址,对图片进行下载。
优选地,从html获取完整的图片和有缺口的图片之后,所述步骤还包括:
计算整个完整图片的宽度和高度。
优选地,计算整个完整图片的宽度和高度之后,所述步骤还包括:
创建一个BufferedImage,将完整图片对应的52张图片通过Graphics进行绘制。
具体地,创建一个BufferedImage,将完整图片对应的52张图片通过Graphics进行绘制,所述步骤包括:
将第一组图片中x*.jpg构造出第一数组,将第一组图片中y*.jpg构造出第二数组;
将第一数组对应的图片与第一数组对应的图片循环依次摆放至空白图片上,得到完整的图片;
将第二组图片中x*.jpg构造出第三数组,将第一组图片中y*.jpg构造出第四数组;
将第三数组对应的图片与第四数组对应的图片循环依次摆放至空白图片上,得到有缺口的图片。
具体地,根据完整的图片与有缺口的图片相同位置的像素进行对比,所述步骤包括:
当完整的图片与有缺口的图片相同位置的像素相差大于等于固定阈值时,则返回宽度值。
优选地,当完整的图片与有缺口的图片相同位置的像素相差大于等于固定阈值时,则返回宽度值之后,所述步骤还包括:
计算完整的图片与有缺口的图片相同位置的像素相差的数学表达式:lim(x→width;y→height)f(x,y);
(x,y)为图片的循环宽、高,并动态地得到完整图片中一个点(x,y)。
优选地,使用moveByOffset进行模拟滑动之后,所述步骤还包括:
抓取html内容;
将抓取的html内容保存至分布式文件系统FastDFS中;
采用jsoup插件对html文档进行解析。
一种自动收集数据系统,其特征在于,所述系统包括:
第一滑动单元,用于使用Selenium模拟鼠标滑动;
获取单元,用于从html获取完整的图片和有缺口的图片;
对比单元,用于根据完整的图片与有缺口的图片相同位置的像素进行对比;
第二滑动单元,用于使用moveByOffset进行模拟滑动。
本发明的有益效果是:通过使用Selenium模拟鼠标滑动,从html获取完整的图片和有缺口的图片,根据完整的图片与有缺口的图片相同位置的像素进行对比,使用moveByOffset进行模拟滑动,从而提高数据抓取的效率,进而提升用户的体验。
附图说明
图1是一种自动收集数据方法的示意图。
图2是一种自动收集数据方法系统的功能模块图。
图3是一种自动收集数据系统的另一功能模块图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
以下结合具体实施例对本发明的具体实现进行详细描述:
实施例一:
图1示出了本发明实施例一提供的一种自动收集数据方法的实现流程,为了便于说明,仅示出了与本发明实施例相关的部分,详述如下:
在步骤S101中,使用Selenium模拟鼠标滑动;
优选地,使用Selenium模拟鼠标滑动之后,所述步骤还包括:
使用Selenium中的WebDriver工具类获取html整个DOW节点;
逐层解析从html获取的整个DOW节点,获取图片所在的节点。
优选地,获取图片所在的节点之后,从html获取完整的图片和有缺口的图片之前,所述步骤还包括:
根据获取的图片所在节点,获取图片的url地址;
根据图片的url地址,对图片进行下载。
在步骤S102中,从html获取完整的图片和有缺口的图片;
优选地,从html获取完整的图片和有缺口的图片之后,所述步骤还包括:
计算整个完整图片的宽度和高度。
优选地,计算整个完整图片的宽度和高度之后,所述步骤还包括:
创建一个BufferedImage,将完整图片对应的52张图片通过Graphics进行绘制。
具体地,创建一个BufferedImage,将完整图片对应的52张图片通过Graphics进行绘制,所述步骤包括:
将第一组图片中x*.jpg构造出第一数组,将第一组图片中y*.jpg构造出第二数组;
将第一数组对应的图片与第一数组对应的图片循环依次摆放至空白图片上,得到完整的图片;
将第二组图片中x*.jpg构造出第三数组,将第一组图片中y*.jpg构造出第四数组;
将第三数组对应的图片与第四数组对应的图片循环依次摆放至空白图片上,得到有缺口的图片。
在步骤S103中,根据完整的图片与有缺口的图片相同位置的像素进行对比;
具体地,根据完整的图片与有缺口的图片相同位置的像素进行对比,所述步骤包括:
当完整的图片与有缺口的图片相同位置的像素相差大于等于固定阈值时,则返回宽度值。
优选地,当完整的图片与有缺口的图片相同位置的像素相差大于等于固定阈值时,则返回宽度值之后,所述步骤还包括:
计算完整的图片与有缺口的图片相同位置的像素相差的数学表达式:lim(x→width;y→height)f(x,y);
(x,y)为图片的循环宽、高,并动态地得到完整图片中一个点(x,y)。
在步骤S104中,使用moveByOffset进行模拟滑动。
抓取html内容;
将抓取的html内容保存至分布式文件系统FastDFS中;
采用jsoup插件对html文档进行解析。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,所述的程序可以存储于一计算机可读取存储介质中,所述的存储介质,如ROM/RAM、磁盘、光盘等。
实施例二:
图2示出了本发明实施例二提供的一种自动收集数据系统的结构,为了便于说明,仅示出了与本发明实施例相关的部分,详述如下:
第一滑动单元201,用于使用Selenium模拟鼠标滑动;
获取单元202,用于从html获取完整的图片和有缺口的图片;
对比单元203,用于根据完整的图片与有缺口的图片相同位置的像素进行对比;
第二滑动单元204,用于使用moveByOffset进行模拟滑动。
本发明实施例中,通过使用Selenium模拟鼠标滑动,从html获取完整的图片和有缺口的图片,根据完整的图片与有缺口的图片相同位置的像素进行对比,使用moveByOffset进行模拟滑动,从而提高数据抓取的效率,进而提升用户的体验。各单元的具体实施方式可参考实施例一的描述,在此不再赘述。
实施例三:
图3示出了本发明实施例三提供的一种自动收集数据系统的另一功能模块图,为了便于说明,仅示出了与本发明实施例相关的部分,详述如下:
1、模拟人工
解决鼠标滑动的动作,程序模拟人工操作;使用Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中。支持的浏览器包括IE(7,8,9,10,11),Mozilla Firefox,Safari,Google Chrome,Opera等
2、零散的图片还原
图片还原需要先获得浏览器上的图片
2.1、获得图片的第一步,首先使用Selenium中的WebDriver工具类获取html的整个DOM然后逐层解析节点,获取图片字节流所在的DOM节点,获得图片字节流的url地址,图片的地址是完整图片的52个小图url;缺口图片的52个小图url。
2.2、获得图片的第二步,通过java的HttpURLConnection的工具类将图片的url地址分别将图片下载到本地,下载的图片有2组,第1组是完整图片的52张小图;第1组是有缺口图片的52张小图。每张小图的尺寸均为10px(宽),58px(高),到此图片已经获得
2.3、还原图片的思路:每组52张小图片,计算出完整图片的宽度和高度,然后创建一个BufferedImage(画布),将52张图片通过Graphics(画笔)一个个的画上去。详细步骤如下
第一组图片一共52张,将图片中x*.jpg构造出一个长度为26的数组,y*.jpg构造出另一个长度为26的数组。因为52张小图的尺寸均为10px(宽)*58px(高),上面是26张,下面也是26张,可以计算出需要还原图片的尺寸为26*10px(宽),2*58px(高)最终宽高260px*116px,用程序创建一张空白图片尺寸为260px*116px。
....创建一张空图片代码片段...
BufferedImage tag=new BufferedImage(260,116,BufferedImage.TYPE_INT_RGB);
...代码片段...
简单的说,两个数组分别是上下各26张
上面26张的绘制方法:循环1...26第一个数组动态得到x坐标,每个间隔10px,y坐标固定为0,逐个绘制图片的宽度和高度分别是10px*58px的字节流(图片),这样依次使用Graphics(画笔)绘制26次完成
下面26张的绘制方法:循环1...26第一个数组动态得到x坐标,每个间隔10px,y坐标固定为58,逐个绘制图片的宽度和高度分别是10px*58px的字节流(图片),这样依次使用Graphics(画笔)绘制26次完成。
完成上下两个数组的绘制就还原完成,第2张图片的还原方法与第1张图片的还原方法相同。
....代码片段:循环文件数组还原图片的代码片段...
for(...){
g.drawImage(javax.imageio.ImageIO.read(_file1[i]),i*10,0,10,58,null);
}
....代码片段...
到此第1组图片还原的关键步骤已完成,还原第2组图片的方式相同
得到一张是完整的图片(260px*116px)另一张是有缺口的图片(260px*116px)
3、计算缺口
计算缺口在图片的哪个位置的思路是:
根据得到的这2张图片对比像素,发现图片的相同位置2个像素相差一个阀值(100)时返回,详细步骤如下:
2张图片的尺寸是一模一样的,从0开始循环宽度为260,从0开始循环高度为116,数学表达公式:lim(x→width;y→height)f(x,y)。循环宽和高分别作为图片中的x(横坐标),y(纵坐标),并动态得到图片中的一个点(x,y)。将x(横坐标),y(纵坐标)的值传入到BufferedImage的getRGB方法取到一个像素值,获得到像素点(RGB),再通过RBG分别计算得到R,G,B;另外一张图片因为宽高一样可以使用同样的方法取到这个像素,得到2个像素后计算得到R,G,B。
像素的点计算R的过程:根据像素值与(&)0xff0000让后向右移动16位,
像素的点计算G的过程:根据像素值与(&)0xff00让后向右移动8位,
像素的点计算B的过程:根据像素值与(&)0xff00让后向右移动8位。
...代码片段:计算R,G,B的方法...
int img1R=(img1&0xff0000)>>16;
int img1G=(img1&0xff00)>>8;
int img1B=(img1&0xff00)>>8;
......
两张图片的R,G,B采用同样的方法获得,并且这个x(横坐标),y(纵坐标)在两张图片相同的位置取像素值,最终我们得到两张图片的R,G,B的变量值分别为R1,G1,B1;R2,G2,B2,我们可以通过R1,R2相减取绝对值、G1,G2相减取绝对值、B1,B2相减取绝对值,这时我们可以设置一个阀值,这个值取决于在调试中,本案采用的是100,当像素相差大于等于100后我们返回宽度值。
...代码片段:计算缺口关键代码...
int temp=Math.abs(img1R-img2R);
if(temp>=100)
return i;
temp=Math.abs(img1G-img2G);
if(temp>=100)
return i;
temp=Math.abs(img1B-img2B);
if(temp>=100)
return i;
......
当2个像素相减的绝对值大于等于100时该程序返回当前的x坐标值,此时我们找到缺口位置。
4、模拟滑动
使用moveByOffset模拟手的抖动,程序拖动时需要一个x值,y值;x值是我们告诉程序拖动到哪个位置,y值是模拟在拖动是一个抖动效果,perform()是拖动动作,release()释放鼠标左键,random.nextInt(10);是生成一个10以内的随机数用来模拟鼠标抖动
...代码片段:模拟滑动,模拟手抖动
try{
action.clickAndHold(sss).perform();
}catch(Exception e){
break;
}
java.util.Random random=new java.util.Random();//定义随机类
int y=random.nextInt(10);//返回[0,10)集合中的整数,注意不包括10
action.moveByOffset(x,y).perform();
action.release(sss).perform();
Thread.sleep(3000);
failCnt++;
...
5、页面数据抓取:当第4步在模拟按鼠标左键,滑动鼠标,松开鼠标左键之后页面会跳转,跳转因为网页需要加载时间,程序休眠3秒中。3秒之后开始找到需要抓取的html内容,通过WebDriver的getPageSource()方法得到Html内容。
6、数据存储:将第5步的HTML内容保存至分布式文件系统FastDFS中,并标记任务完成
7、数据解析:处理这些被标记完成的任务,采用分布式elasticjob任务分片,采用elasticjob的目的是让任务执行效率成倍增加,可以根据实际横向部署多个任务,支持动态扩容加大数据处理吞吐量,采用jsoup插件对HTML文档进行解析。
在本发明实施例中,自动收集收据系统可由相应的硬件或软件单元实现,各单元可以为独立的软、硬件单元,也可以集成为一个软、硬件单元,在此不用以限制本发明。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各实施例的单元及算法步骤,能够以电子硬件或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。
专业技术人员可以对每个特定的应用来使用不同的方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉技术领域的人员在本发明揭露的技术范围内,可轻易想到变化或者替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。