从网页的“小广告”中提取出最热门的业务!
原创
o君言o
2022年03月24日 13:41
问题
也许我们每天在浏览网页时都会看到各种各样的小广告,它们可能是这样的:
又或者是这样的:
也可以是这样的:
虽然每天见到,但是我们并不会过多留意,它们就像一块该有的区域,在那里自然而然的摆放着。
在互联网营销领域,我们习惯性的从用户“口中”挖掘需求或商机,比如关键词、比如评论、比如提问,但却很少去留意广告中带来的需求或商机。
相较于百度、头条等大型广告平台,PC站点的广告投放几乎没有太多要求限制,一般不明确违法就行,也因此,在这里能看到的广告,都是比较“直接”的。
这些广告散落在很多网站,如何收集回来,会遇到什么问题,又要如何解决?
今天这篇文章将讲解如何从1400+个网站当中提取可能存在的站外广告,并对收集回来的数据做基本的提取和分析,在文章最后找到广告当中的top业务。
其中包含:数据收集思路、数据处理过程、数据分析方向,希望通过完整的流程和步骤来帮助大家发散思维,包括过程中涉及的技术问题如何转换思路,对以后的信息挖掘工作有实际指导意义。
PS:文章主要演示思路流程和数据结果,不涉及实操步骤,这篇文章的重点在于解决问题的过程。
数据收集思路
1:目标站点收集
作为一名互联网营销人员,我们可能会浏览很多与工作相关的网站,比如:行业工具站点、网赚博客或论坛等等。
相对于这些站点,我们是用户,那么什么样的业务会投向我们这些用户呢(这是一个逆推逻辑)?或者说什么样的业务的目标群体是我们?
有基于此,我们本次的数据源站点选择了与我们领域相关的网站作为演示,如:网赚论坛/博客、第三方工具平台、PC端小工具站点、源码平台、线报/兼职/任务平台等。
如何收集这些目标站点?
作为公众号老粉丝,相关的步骤方式应该都看过了,这一段跳过也无妨,简单的方式是:
利用爱站这类平台的工具,直接收集领域里的代表性(有一定流量)站点。
相对复杂但是较为全面的方式是:
利用5118等关键词工具批量收集与目标站点可能相关的长尾词,如目标是网赚博客,与之相关的词汇就有:赚钱、项目、创业、兼职、副业等。
使用5118的批量挖掘长尾词功能,就能收集到这些词汇的主要长尾词:
将这些长尾词批量拿到百度搜索,搜索结果第一页里经常出现的站点就是我们的目标站点,其他类型站点同理。
这里有相关的演示步骤:
本次演示总共收集了目标站点1500+,去除一些官网、大站等没有研究价值的站点后,剩下1400+左右。
有了大量的目标站点,接下去要收集每一个站点的代表性页面。
2:站点页面收集
我们的目标--广告,它会出现在网站的相关页面里,网站有大有小,不可能整站页面都收集,并且网站都是模板化的产物,主要页面存在的广告,其他页面都会一样存在,所以只需要提取有代表性的页面即可。
一个web网站,一般有如下结构:首页、栏目页(列表页)、子页面(文章页),而广告则有可能穿插在其中某类页面,甚至全站显示。
一个网站的首页链接(主域名)我们很容易得到,在上一个步骤中就可以统计到每一个站点的主域名。
子页面,一般子页面的链接里都包含日期格式或数据库ID的数值,以.html/.shtml/.htm等常见后缀结尾。
同时,在确定了首页和栏目页后,不难在里面提取出子页面,现在的问题在于:
当我们把一个网站主页的所有链接提取出来后,如何把这个网站的栏目链接识别并提取出来?或者说 程序可以区分开来。
如上,对于一个网站而言,栏目链接并没有任何数量上的规定,也没有位置、尺寸、颜色的严格限制,更没有相关的固定字眼可以辅助判断。
对于栏目的url格式,它有可能是常见栏目的链接形式:
“https://www.xxx.com/xxx/xxx/”
也可能是类似文章页面的形式:
“https://www.xxx.com/xxx/xxx/1.html”
不一定是静态,或许是动态:
“https://www.xxx.com/xxx/xxx/1.asp?a=b”
因此,基于以上思路,我们都没有办法可以让程序自动把一个站点的栏目链接提取出来。
此时,我们需要转换一下思路:
作为seo出身的我,对搜索引擎的工作原理有些了解,事实上识别网站栏目链接也是搜索引擎需要做的工作.
栏目链接可以直观体现网页页面的层级关系和相应的重要程度。
搜索引擎识别栏目链接的技术方案也不是唯一的,比如通过url规律来做猜测:
“https://www.xxx.com/xxx/xxx/1.html”“https://www.xxx.com/xxx/xxx/2.html”“https://www.xxx.com/xxx/xxx/3.html”
基于上面的url特征,程序可以认为:
“https://www.xxx.com/xxx/xxx/”
可能是一个栏目链接,进而推测:
“https://www.xxx.com/xxx/”
可能是上一级栏目链接。
事实上,搜索引擎的爬虫还会猜测站点可能存在的未发现的url,同样是基于上面的url特征,程序可以认为还存在:
“https://www.xxx.com/xxx/xxx/4.html”
只需要尝试访问看看,就可以直接得到一个新发现的页面,不需要再从网站经过各种页面的抓取才发现,间接提升了收录效率,所以规律简洁的url设计,对收录也有帮助。
当然,这种策略需要基于大量数据,不可能通过简单几条数据下结论,因此在这里,我们使用另一种简单、直观、效果立竿见影的策略:
假设下面是一个目标站点的主域名:
https://www.xxx.com/
对它访问后,我们可以从中提取到这个页面的所有a标签里的url(只提取域名相同的站内url)。
记录这份url数据,这是我们第一次见到它们,它们是在首页被发现的,其中一定有一部分链接是栏目链接。
随机从这些url里挑选10-20条,比如15条,挨个访问这15个页面,同样提取每个页面里存在的url。
最终统计在首页得到的url数据里,哪条url可以同时出现在访问的15个页面里,这样的url 99.9%是栏目链接。
原理很简单:网站都是模板化的产物,绝大部分网站的栏目版块都会同时出现在这个网站的所有页面,反之 能够同时出现在所有页面的url极有可能是栏目链接。
从这点来看,技术还是有点意思吧,本质上技术就是发现规律并利用规律。
当然,这个策略对于类似“登录页面”、“注册页面”之类的可能会存在误判。
但是一来:这个比例很小,二来:我们可以通过url里的一些关键词汇屏蔽,比如:login,并且对于我们抓取广告,这种页面也只是造成无效抓取而已,并不影响结果。
事实上这个策略类似思路是有相应专利的,有兴趣可以到网上查查。
本次演示总共从1400+的目标站点里提取了相关栏目页面及其子页面合计2.2W+。
有了目标网站代表性的页面,接下来就可以从2W+的页面里挨个提取可能存在的广告。
3:广告链接收集
对于一个存在于某个页面的广告,它可能会有一些特征,比如:
集中在某块区域,旁边有“广告”字眼,文本内容经常包含:优惠、特价、联系、以及各种醒目符号等等:
又或者是一条细长的横幅图片,gif格式、有闪动效果,旁边同样有广告字眼:
我们甚至还可以识别出广告链接这个元素在网页前端看到时的实际坐标加以判断。
以上这些规律都是重要特征,但是这些特征的问题在于:广告有这些特征,可有这些特征不代表是广告。
诚然,由于网页样式的独特性和随机性,我们没有任何方法可以完全识别所有目标广告,但至少上面的方式可能会带来大量无效数据。
在这里,我们仍然还是切换一下思路,同样用另一种简单的策略:
尽管截止今天,seo的重要性在不断降低,但是seo的很多概念却是根深蒂固的,比如:外链权重。
无论是考虑到链接权重的传递问题还是商业竞争问题,在过往的这些年,几乎很少有站长会把别人的链接放到自己的页面上,纯文本链接不会,超链接更不可能,除了广告!
也就是说,作为页面里的第三方广告,它们都有一个特质:广告链接都是站外的。
那么基于这个策略,提取就很简单了,一个网页里的所有站外链接(url主域名不一样)都可以被认为是广告,如果再加上上述细节特征加以辅助判断,基本准确无误。
事实上,仅仅以站外链接作为判断标准,在我这里的测试中,大部分网站基本不存在太多错误判断。
说到底:不给钱,凭啥给你上链接!
这样一来,广告链接的识别提取问题也解决了。
PS:很多第三方广告在页面里都被嵌套在iframe框架里,要穿透框架一起提取。
4:过滤友情链接
尴尬的是,在我们上述的策略中,有一个版块刚好会有冲突,就是友情链接版块:
友链一般位于网站底部,集中在一个区块,这个版块的链接全是站外链接,这个时候我们需要一些策略来把属于友链的链接过滤掉,不要被识别为广告链接。
仍然是基于技术利用规律的本质:
虽然友链都集中在底部,友链旁边都有一个“友情链接”的文本,但是一个页面上可能在多个位置存在“友情链接”这个字眼。
同时html的半结构规则,我们也不好判断一批链接是不是一片区域。
但是我们发现:
首先一般只有首页会有友链版块,少数大站点会在栏目页面也有友情链接版块。
有友链版块的页面都会出现“友情链接”这段文本,极少数会用“友链”、“合作伙伴”等代替。
其次,友情链接都是锚文本(纯文本),3-5个字左右,为了增加目标关键词的相关性,基本不可能是图片形式的链接。
并且除非品牌特定名称,否则这些文本都是纯汉字,也不可能包含任何标点符号。
下面两个对比很直观:
因此,我们的策略是:
当我们尝试从一个网站的首页提取站外广告链接,那么提取出来的链接都需要判断是否是友链。
当我们尝试从一个网站的栏目页提取站外广告链接,那么判断页面是否存在“友情链接”等字眼,如果有,则提取出来的链接都需要判断是否是友链。
至于子页面(文章页),提取出来的站外广告链接不需要判断。
当一个页面的每条站外广告链接需要判断是否为友链时,还可以事先做一层过滤:
图片形式的链接不用判断、文本字数超过N(比如6个字)的链接不需要判断、文本包含标点符号、特殊字符的不用判断。
如此一来可以过滤掉很多链接,节省判断成本。
剩下的链接就需要判断是否为友链了,那么如何判断呢?基于友情链接互相导向的规律:
假设a页面中提取到一条链接b,我们访问b,如果在b页面中可以看到页面a的链接,则判断为友情链接,反之为广告链接。
基于以上策略,我们可以在花费较低技术成本的情况下,把友链过滤掉,仅保留广告链接。
本次演示总共在2W+的页面里提取到了6W+的广告链接。
数据处理过程
1:数据存储格式
在顺利收集到数据并存储到数据库中时,数据表的存储格式可以参考如下:
广告链接:https://www.aaa.com/1.html存储点击广告之后打开的链接地址,方便后续进一步研究广告页面。
广告主:aaa存储这条广告链接对应的域名,一般同一个团队用的是同一个域名,方便后续统计一个广告主有多少广告,或者在多少个网站投放。
有些广告的链接地址是qq,比如:wpa.qq.com,就是我们点击这条广告后马上就可以跟卖方在QQ聊天了(要不说这里的广告都很“直接”)。
所以不能直接存储qq,qq的wpa链接可以直接唤起对应qq号码的聊天窗口,所以在链接地址都有QQ号码或者QQ号码对应的转义编码,具有唯一性,存储这个即可。
业务描述:seo服务存储这条广告对应的业务所属,比如该广告是提供seo排名提升的业务,就打上“seo服务”的标签。
广告文本:广告语如果该条广告链接是锚文本链接,直接存储相应文本,否则为空!
广告图片:img_url1|(0,0)|(100,100), img_url2|(0,0)|(100,100)存储这条链接里所能见到的图片以及相应的坐标和尺寸(有可能多张)。
图片文本:广告语后续从图片中提取到的文本信息存储到这里。
所在页面:https://www.bbb.com/xxx/存储该条广告链接来源于哪个页面,方便后续统计页面存在的广告数量或广告存在多少个页面。
页面域名:bbb存储页面对应的域名核心,方便后续根据域名统计。
域名所属类别:blog表示这个目标站点是一个网赚博客,方便后续根据类别统计。
网站类别可以在第一步收集站点时,在收集到域名之后集中打上标签即可。
2:数据清洗
尽管我们事先采用了各种策略以期望达到目标的预期,但是要知道web内容本身就是半规则的代码形成的,它会存在各种我们无法预期的情况。
因此当数据存储到本地之后,我们还需要有一步数据清洗的工作,对于不符合我们预期的内容需要根据它们的特征进行过滤删除。
数据清洗并不是一个标准化的工作,需要结合实际情况,当然了,本质上大部分是文本处理,包括:
广告语为空、图片无实际内容、少数识别错误的非广告链接等等,可以根据文本特征、url,甚至是域名级的过滤。
有小部分网站在页面里存在大量站外且非广告的链接,这种情况是存在的,这就是以前seo里的一个概念:枢纽页面,因为业务或网站定位等各种原因,不考虑权重或外链问题。
这种类型的网站,经常是有大量站外链接、锚文本很短、整片出现等特征,识别出来过滤掉。
另外,在友情链接过滤环节,由于可能存在掉链现象,即a有b,但b没有a,因为b把a去掉了,可实际上b在a里是一条友链(其实也可能这就是一条花钱买的友链)。
在这里,我把广告形式属于锚文本、纯汉字、4个字以下、来源于首页、实际位置位于页面较为底部的广告链接去除,毕竟一个正常的第三方广告,它的广告语不会只有三两个字。
在执行了数据清洗的步骤后,总数据还剩下4W+左右。
3:ocr图片文本识别
在我们抓取回来的广告中,有一部分广告链接是以图片形式展示的,因此需要把广告图片中的广告文本信息提取出来。
在过往的文章里,我曾经推荐过space这个免费的api接口用于图片文本识别,事实上它的识别准确率很高。
只不过不知道是服务器速度太慢还是识别效率太慢,一张图片的识别返回往往要10秒以上,而在本次的演示数据里,图片数量多达上万多张,使用这个接口的时间成本实在不能接受。
在这里,推荐一个python的模块:easyocr,安装之后即可在本地进行图片文本识别的工作。
使用起来非常简洁:
import easyocrreader = easyocr.Reader(['ch_sim','en'])result = reader.readtext('test.jpg',detail=0,paragraph=True)print(result)
如下这样一张广告图片:
下面是它识别后得到的文本信息,程序会自动拼接成句子:
easyocr可以设置多种语言的识别,可以接收本地图片、网络图片(最好还是先下载到本地)等,还可以自定义返回格式。
识别效率一般3秒内返回,整体的识别准确率相对space而言我认为有那么一点差距,当然我没有做太多测试。
广告图片里的文本特征一般是:大,这有利于识别提取,但是反过来,广告图片里的色彩信息太过丰富,这会阻碍识别。
如果是相对纯色的图片,这个模块的识别完全没有压力,总体来说还是不错的。
感兴趣的可以到github了解更多。
我们的图片是以url或base64的形式存储的,同时我们还保留了图片相应的坐标和尺寸:img_url1|(0,0)|(100,100), img_url2|(0,0)|(100,100)
url形式的图片地址,我们可以下载存储再提交给easyoc识别,base64形式的图片可以把数据直接转换成图片并存储。
但是在识别之前,我们还可以做一层判断,由于html的复杂性和各种不可预计的原因,提取出来的图片广告链接,可能包含多余的无效图片,或者小部分并非广告而是一些图标图片。
正常一张足够表达广告信息的图片,它的像素(宽高乘积)至少都要几千上万,随便一张横幅广告的像素就要10万以上。
因此对于像素低于某个阈值的图片,可以跳过,不做识别,毕竟一张10 X 10的图片怎么也不可能是一张广告图片。
本次演示的数据中总共有1.2W张左右的图片参与文本识别:
也有不少是网盟的配图,没有实际内容。
数据分析方向
1:数据统计
在本次演示的数据中,从1400+的目标站点延伸出了栏目链接及其子页面共有2W+,从2W+的页面中提取出了4W+的广告数据。
这其中,除了第三方广告主投放的广告之外,还存在联盟广告,比如:百度、360、谷歌这些网盟广告,淘宝、天猫、京东这些电商联盟广告:
这些联盟都有独特的域名,比如百度的union.baidu.com下面的cpro.baidu.com,其他也是一样。
网盟广告更多是基于用户行为来展现广告的,所以它不存在内容分析价值,只能做其他一些占比统计。
去掉联盟后的第三方广告数量为1.3W+。
记录在数据库里的广告链接是可能重复的,因为同样的广告链接可能出现在不同页面甚至是不同站点。
如果以广告链接作为唯一,去除重复之后,总共可以得到4200+独立广告,广告主有1100+。
1400+的网站得到1100+的广告主数量,属实不多,一个网站还分不到一个。
在一个页面里,像下面这样一个区块,就有几十个广告主:
对数据规模有了大致了解之后,我们可以思考这样一份数据有什么研究价值。
下面我们简单来看几个分析方向,以此作为启发,实际上这样一份数据可以统计的信息有很多。
2:数据分析
有广告的网站数量
为什么1400+的网站,只找到1100+的广告主,因为实际上只有355个网站里存在广告,其他1000个左右的网站根本没有广告,没有外部链接,也就是网盟都没有,大部分的原因只能是流量不大。
所以,行情不怎么好……
top业务
在这么多的广告里,哪个业务出现的次数最多?或者说哪个业务的投放较火?
按照常规的思路是:要知道什么业务最火,需要先知道有哪些业务,然后再比对。
而在这里,我们运用另一种思路,把最火的业务自动提取出来,然后再看看是什么业务。
具体的逻辑是这样的:
首先在上面去除网盟广告后我们的第三方广告还剩下1.3万条记录。
我们先使用新词发现技术来识别这里面的各种行业词汇:
把识别出来的词汇提交给jieba分词系统,这样它会认识更多行业词汇。
接下来就使用我的python课程里的一个实例应用章节:《基于词频排序挖掘需求大类》来处理这个问题。
它的具体思路简单来说是这样的:
目标是一份多条数据的数据集(比如一批长尾词),先统计数据里的所有词频:
# 数据集data = ['seo优化','seo排名','seo提升排名']# 词频count = {'seo':3,'排名':2,'优化':1,'提升':1}
然后再单独对每一条数据分词,统计这条数据里词频最高(词频来源于上一步的统计)的topN词汇,比如词频最高的前2个词汇:
row = 'seo提升排名'top_word = ['seo','排名']
将这2个词汇按照词频降序组合成一段文本,这段文本就是这条记录的特征标识,其他记录也是同样的处理方式:
'seo提升排名' -> 'seo,排名'
最终,在同一规则下,类似的数据就会得到一样的特征标识,将特征标识一样的归为一类,这就得到了聚类的效果。
这种方式的优点在于速度极快,可以快速的提取出某一份数据里,高频出现的内容是什么,在长尾词里这些就是高频需求,在当前要分析的广告语里,就是热门业务。
有些时候我们并不需要把每一个长尾词精细化的分类,这种快速聚集出大类的方式会相对合适。
将我们的广告文本数据使用这种方式处理后就可以得到这样一份数据(按照类别数量降序显示):
左边是原始数据,右边是特征标识,1.3W条的数据有1000条左右的数据被显示出来,得到了260多个特征标识。
这些都是单个类别>=2以上的数据,除此之外就是没能跟别人聚类在一起的数据,就没必要显示了。
现在,我们就可以人工把这260个特征标识看一遍,结合左边的广告文本,很容易知道这是个什么业务,然后把对应的业务描述写上去:
最终这份数据里出现最多的业务描述,就是最热门的业务了,为什么可以这样肯定呢?
因为在这一步里,不能出现的广告文本说明没有其他和它相似的广告文本,如果它是个热门的、经常出现的业务,一定会有很多不同但相似的广告文本,反之 它就是很单一的,没什么广告主投放的。
最后:在本次收集的数据里,最热门的业务就是:云服务器!!!
大型的服务商如bat的云产品更多应该是分销性质,其他还包括很多中小型服务商,以免备案、站群专用等特色居多。
我们将这些被聚集出来的、业务描述属于云服务器的广告文本做下关键词抽取(tfidf),可以得到这个业务的广告里的一些重要词汇:
右边是权重值
然后将数据库里所有的广告文本挨个与这些词汇求交集,看看每个广告文本能够命中几个词汇,对应得到多少权重总分。
权重总分高于一定阈值的广告文本,就是属于服务器这个业务的广告(原理与推荐算法给内容打标签有点类似,属于比较粗糙的版本):
经过统计,最终得到在1.3W的广告文本中找到了5k+的属于“云服务器”这个业务的广告:
占比30%以上,在这样的一份数据里,可以确定是当之无愧的No.1,不可能还有比它更多但是广告文本却没办法聚类出来的其他业务。
业务常见文案
我们找到了最热门的业务是云服务器,那么像云服务器这样一个业务,大家在做广告的时候通常都写些什么文案?或者说卖点都有哪些?
其实在上面做关键词抽取的时候,已经得到了,在去除品牌词和无效词的情况下,常见的卖点有这些:
根据权值排序
如果我们想推广云服务器业务,那这就是我们可以直接拿来用的文案创意,同时每一个卖点是如何撰写的,可以把包含卖点的广告文案集中提取出来看一遍。
其他业务
除了云服务器外,数据里还有很多其他业务,同样也是按照类似的逻辑批量处理,以下根据业务的大致占比关系展示:
其实,还有一些挺灰的,就不放出来了,包括最近315提到的关键词霸屏之类的,我认为有些站长接广告可能要谨慎一点,有些业务说灰都是好听的。
延伸拓展
上述几个统计案例,只是简单演示分析思路,事实上数据还有很多价值,比如:
1:每天都在找项目找商机,而事实上这些广告都是一个个的项目。
2:这些项目有赚头吗?不好说,那是不是可以跟踪一段时间,比如下周还在不在,下个月还在不在。
3:广告一直都在,可能说明项目有钱赚,但是反过来也说明渠道(网站)的流量精准,值得投放。
4:每一条链接都是一个落地页(营销页面),某个业务,他们的落地页都是怎么描述的,可以把同业务的所有页面提取出来挨个查看记录,学习别人的营销方式。
5:我们前面还有针对目标站点分类,那么什么类型的站点广告较多、什么类型的站点网盟较多,哪些广告都出现在什么类型的站点等等,都是值得研究的信息。
数据都在本地,想怎么分析和利用随时都可以,全看自己的角度了。
当然,由于篇幅问题,更多的分析案例就不演示了,这篇文章的重点是这个解决问题的过程。
另外,在这里我选择的目标站点并不是固定的,你还觉得有什么站点可能是值得挖掘的?
比如大家有兴趣可以去统计一下门户网站,那里有很多二类电商,大家都在卖什么产品或者提供什么服务?
大概率最后你会发现,屡禁不止的“荐股”广告的数量会超乎想象,只不过是换一种形式罢了。
结语
现在,回顾最开始:我们希望收集存在于各种网站的第三方广告,于是采取种子词的策略,挖掘目标站点。
接着碰到了栏目链接的识别问题,我们利用了“栏目存在于站点的每一个页面”的规律来判断,拿到我们需要的代表性页面。
再继续就涉及到广告链接的提取,基于“链接权重不导出”的原则,选择了站外链接的方案,并根据辅助信息加以判断,从而尽可能的准确提取出广告链接。
又考虑到友情链接的影响,灵活的根据友链存在的特征,在尽可能低的技术成本下过滤掉了友链。
然后就到了数据挖掘过程中必不可少的存储及清洗,再借助现成的第三方模块顺带解决图片识别问题。
最终,得到我们需要的所有数据,并根据我们的具体分析需求,选择合适的统计方式得到我们需要的分析结果。
在个人或小团队运营一个业务的时候,信息挖掘、数据处理、分析统计,这都是经常会出现的场景。
可以看到,这一连串的步骤,其实是一个不断发现问题和不断解决问题的过程。
但是我觉得从事互联网营销就是这样,我们并不是每天都在找项目发广告,任何一个业务在运营过程中总会碰到很多新问题,这些问题都需要自己动脑去思考、动手去测试。
无论在业务运营中的哪个环节,作为业务的操盘者,就是一个负责不断发现问题并不断解决问题的人,信心也源于此!
正文结束!
去年底开设了python课程,我自己后续时不时看下,对于第一次录制一个课程,整体内容质量我还挺满意,差不多做到了我原先设想的8-9分。
有些读者或者学员说:这个面向“运营推广营销”的角度切入得准,其实这也是个需求分析的事儿,如何在一个较大的一个需求类目里细分出来一个更加垂直的切入点,得空我也会来聊聊相关内容。
这门课程会作为公众号的一个附带产品,有需要了解的朋友可以点击左下方↙️的“阅读原文”查看,目前开了几天拼团,时不时会开一下!

评论