基于视觉的网页结构相似性计算

2024-04-15 05:08

本文主要是介绍基于视觉的网页结构相似性计算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      由于工作学习的安排,一直参与项目课题的工作,期间在计算两个页面之间相似度的时候,寻求到了一个新的思路,于是努力实现了一下,这里简单说一下自己在接到这个问题的时候的思路吧:网页的相似度,分类,聚类之类的工作很多大牛都做了很多的研究,基于文本、内容、图像各个方面的都有,效果也还是可以的,这次出发点是网页的视觉信息但是在真的动手去做的时候却发现视觉信息包含的计算量太过于庞大了,而且需要很多的预处理,没有一定的先验知识是无法做好的,之前有学长做过这方面的东西,我呢这次也是“站在巨人的肩膀上”出发的哈,网页的源码html通过浏览器提供的渲染接口展现给我们的是DOM树,也就是文档对象模型,之所以很多页面会出现视觉上相似的那是检测算法却判定结果相似性较低甚至不相似的原因是,html中包含一定的js,之中的内容是不被显示的,而且基于大量的数据分析发现html中存在很多的伪装方式,他们通过篡改页面的内容设置属性隐藏、iframe内嵌等等的伪装方式来逃避一系列针对这个伪装的检测方法,应对这些伪装最好的办法就是渲染html得到页面真实的DOM树结构,将那些被伪装或者被隐藏的信息都显示出来,直接操作html效果不好,现在换成是操作DOM树,这样一来,得到的分析和处理结果更接近于真实,这里就是这样的思路。

    首先通过对html的渲染得到了页面的DOM树形式,然后利用得到的DOM的视觉块信息来进行下一阶段的处理,对页面中出现的每一个视觉块均从三个方面进行切割划分考虑,这里使用的是差分切割,对与不同级的信息赋予不同的表示序列最终使用得到的表示序列作为页面的身份信息来用作后续步骤中的检索查询与匹配计算。这里不再累赘,下面是详细的处理程序。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import division

import os
import math
import time
from whoosh.index import create_in
from whoosh.fields import *
import whoosh.index as index
from whoosh.qparser import QueryParser


def CutSquence(file_block_list, web_height, web_width):
    '''
    读取页面信息,从位置中心、面积、高宽比三个方面对其进行分割最终得到一个26位长度的结构特征序列
    '''
    #print 'web_height is :' , web_height
    #print 'web_width is :' , web_width
    #print  'file_block_list is ',file_block_list
    structure = []
    structure_dict = {}
    for i in range(len(file_block_list)):
        center_x = int(file_block_list[i][3]) * 0.5
        center_y = int(file_block_list[i][2]) * 0.5
        s_x = center_x + int(file_block_list[i][1])
        s_y = center_y + int(file_block_list[i][0])
        angle1 = math.atan(s_x/s_y)
        angle2 = math.atan(s_y/(int(web_width)-s_x))
        angle3 = math.atan((int(web_width)-s_x)/(int(web_height)-s_y))
        angle4 = math.atan((int(web_height)-s_y)/s_x)
        string = locate_binary((angle1,angle2,angle3,angle4))
        area1 = int(file_block_list[i][2]) * int(file_block_list[i][3])
        area = area_binary(area1)
        hw_rate1 = int(file_block_list[i][2])/int(file_block_list[i][3])
        hw_rate = hw_rate_binary(hw_rate1)
        long = str(string + area + hw_rate)
        #print  'string is ', string
        #print 'area is ', area
        #print 'hr_rate is' , hw_rate
        structure.append(long)
    return structure
    #print 'structure_squence is :', structure


def locate_binary(angle):
    '''
    对角度进行分割,输入时一个四元组,如(0.132,0.23,0.45,0.671)
    '''
    locate = ''
    locate_dict = {1:'0000',2:'0001',3:'0010',4:'0011',5:'0100',6:'0101',7:'0110',8:'0111',9:'1000',10:'1001',11:'1010',12:'1011',
                    13:'1100',14:'1101',15:'1110',16:'1111'}
    for item in angle:
        result = item/0.0982
        value = int(math.ceil(result))
        if value in locate_dict:
            locate = locate + locate_dict[value]
        elif value >= 16:
            locate = locate + '1111'
    return locate


def area_binary(area):
    '''
    对面积进行差分切割,输入时一个面积值,如670000
    '''
    result = ''
    area_binary_dict = ((5000,'00000'),(10000,'00001'),(30000,'00010'),(50000,'00011'),(70000,'00100'),(90000,'00101'),(110000,'00110'),
                        (130000,'00111'),(150000,'01000'),(170000,'01001'),(190000,'01010'),(210000,'01011'),(230000,'01100'),(250000,'01101'),
                        (270000,'01110'),(290000,'01111'),(310000,'10000'),(330000,'10001'),(350000,'10010'),
                        (370000,'10011'),(390000,'10100'),(410000,'10101'),(430000,'10110'),(450000,'10111'),
                        (470000,'11000'),(490000,'11001'),(500000,'11010'),(750000,'11011'),
                        (1000000,'11100'),(2000000,'11101'),(3000000,'11110'),(4000000,'11111'))
    if area > 4000000:
        result = result + '11111'
    else:
        for i in range(len(area_binary_dict)):
            if area <= area_binary_dict[i][0]:
                result = result + area_binary_dict[i][1]
                break
    return result


def hw_rate_binary(hw_rate):
    '''
    对高宽比进行差分切割,输入时一个四高宽比率,如0.12
    '''
    result = ''
    hw_rate_binary_dict = ((0.05,'00000'),(0.1,'00001'),(0.15,'00010'),(0.2,'00011'),(0.25,'00100'),(0.3,'00101'),
                            (0.325,'00110'), (0.35,'00111'),(0.375,'01000'), (0.4,'01001'),(0.45,'01010'),
                            (0.5,'01011'),(0.55,'01100'),(0.6,'01101'),(0.65,'01110'),(0.7,'01111'),
                            (0.725,'10000'),(0.75,'10001'),(0.775,'10010'),(0.8,'10011'),(0.825,'10100'),
                            (0.85,'10101'),(0.875,'10110'),(0.9,'10111'),(0.925,'11000'),(0.95,'11001'),
                            (1,'11010'),(1.25,'11011'),(1.5,'11100'),(1.75,'11101'),
                             (3,'11110'),(4,'11111'))
    if hw_rate >= 4:
        result = result + '11111'
    else:
        for i in range(len(hw_rate_binary_dict)):
            if hw_rate <= hw_rate_binary_dict[i][0]:
                result = result + hw_rate_binary_dict[i][1]
                break
    return result          


if __name__ == '__main__':
    CutSquence(file_path = "1.txt")

这篇关于基于视觉的网页结构相似性计算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/904902

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

XTU 1237 计算几何

题面: Magic Triangle Problem Description: Huangriq is a respectful acmer in ACM team of XTU because he brought the best place in regional contest in history of XTU. Huangriq works in a big compa

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

EasyPlayer.js网页H5 Web js播放器能力合集

最近遇到一个需求,要求做一款播放器,发现能力上跟EasyPlayer.js基本一致,满足要求: 需求 功性能 分类 需求描述 功能 预览 分屏模式 单分屏(单屏/全屏) 多分屏(2*2) 多分屏(3*3) 多分屏(4*4) 播放控制 播放(单个或全部) 暂停(暂停时展示最后一帧画面) 停止(单个或全部) 声音控制(开关/音量调节) 主辅码流切换 辅助功能 屏

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

禁止复制的网页怎么复制

禁止复制的网页怎么复制 文章目录 禁止复制的网页怎么复制前言准备工作操作步骤一、在浏览器菜单中找到“开发者工具”二、点击“检查元素(inspect element)”按钮三、在网页中选取需要的片段,锁定对应的元素四、复制被选中的元素五、粘贴到记事本,以`.html`为后缀命名六、打开`xxx.html`,优雅地复制 前言 在浏览网页的时候,有的网页内容无法复制。比如「360