本发明属于信息采集领域,特别是涉及一种基于代理的侵入式社交数据采集方法。
背景技术:
随着互联网的飞速发展,网络已经成为人们获取信息的最主要手段,而伴随着数据量的不断增加,如何有效的获取并利用这些数据成为很关键的一步。信息采集技术可以更加准确的获取用户想要的特定数据,而大量的信息数据的采集,也为反爬虫技术的兴起提供了舞台,导致数据采集变得越来越难。微信作为主流的社交软件,微信公众号文章也成为重要的信息采集来源。现有的微信公众号文章采集入口有三个:(1)搜狗微信,(2)微信公众平台素材管理提供的接口,(3)微信客户端(手机端或者pc端)。而由于反爬技术和数据完整性的要求,微信客户端是一个较好的选择。虽然网络上也有对于微信公众号文章采集的描述,但大多都不完整,或只是简单的概述,而对于相关专利,有的实现较为复杂,或者是通过浏览器与互联网的交互获取数据。
如今现有的微信公众号文章采集技术,有通过搜狗微信作为入口,这种方法缺点有:(1)反爬虫限制,需要ip代理和打码平台的辅助(2)采集到的文章链接不是永久性的,过段时间会失效(3)不能采集文章的点赞数、阅读数以及评论(4)采集到文章数幅有限只能是最近10篇;有通过微信公众平台素材管理提供的接口采集数据的,这种方式缺点有:(1)登录比较麻烦需要用户登录,且需要扫码确认;(2)反爬虫限制,操作频繁,直接封号;(3)获得的文章链接仍无法获得点赞数、阅读数以及评论。
技术实现要素:
本发明的目的在于提供一种基于代理的侵入式社交数据采集方法,通过抓包工具获取服务端返回给客户端的数据包,注入js并返还给客户端,在客户端加载页面时自动执行js代码,使浏览器与程序建立连接,之后通过程序向浏览器发送指令控制整个采集流程,解决了现有的公众号采集需要ip代理和打码平台的辅助、文章链接容易失效的问题。
为解决上述技术问题,本发明是通过以下技术方案实现的:
本发明为一种基于代理的侵入式社交数据采集方法,包括如下步骤:
步骤s1:启动调度程序定时任务,从数据库中取出公众号放入redis中,并进行去重处理;
步骤s2:定时从redis中取出地址放入rabbitmq队列中;
步骤s3:用户登录微信客户端,打开公众号文章,向微信服务器发送请求;
步骤s4:经过代理服务器处理,代理截取微信服务器的响应数据,注入js响应到客户端;
步骤s5:根据注入的js连接爬虫服务,爬虫服务端通过注入的js操作客户端;
步骤s6:从队列中取出公众号地址放到客户端执行请求,通过下拉操作获得公众号历史文章;
步骤s7:客户端返回文章连接资源到程序中,保存到详情队列中;
步骤s8:判断队列中是否存在下一个公众号地址;
若是,则通过客户端发送请求并返回步骤s4继续执行;
若否,则执行步骤s9;
步骤s9:从详情队列中取链接放到客户端发起请求,经过代理服务器注入js,连接程序服务端;
步骤s10:程序控制客户端获得文章信息。
优选地,所述步骤s4中,http请求经过代理服务器时,具体的处理步骤为:
步骤s41:收集request请求的所有请求参数;
步骤s42:使用代理服务器对客户端的请求进行处理,返回新的请求参数或返回响应内容;
步骤s43:若返回响应内容,则立即把此响应返回到客户端,流程结束;
步骤s44:若返回请求参数,则根据请求参数,向服务端发出请求,接受服务端响应;
步骤s45:调用规则模块,对微信服务端的响应进行处理,把响应信息返回给客户端。
优选地,所述步骤s45中,调用规则模块中的方法根据返回内容判断是否会明文解析请求,当https请求被明文解析后,处理流程同http一致,未被明文解析的请求则不会进入规则模块进行处理。
优选地,所述步骤s1中,微信浏览器与socket服务器成功建立连接时,服务器会初始化当前采集的页面基本数据,客户端在连接成功后发送信号至服务端,将页面的url传给服务端,直至所有数据初始化完成后,服务端给客户端发送取数据指令,开始进行数据采集。
优选地,数据采集我完成时,服务端会从相应的队列中取出下一个采集页面的url,并发送至客户端让其自行跳转;若当前采集队列消费为空,则消费另一个队列,若两个队列消费都为空,则服务端会一直监听两个队列,直至获取下一个url。
本发明具有以下有益效果:
(1)本发明通过抓包工具获取服务端返回给客户端的数据包,注入js并返还给客户端,在客户端加载页面时自动执行js代码,使浏览器与程序建立连接,之后通过程序向浏览器发送指令控制整个采集流程,公众号文章采集数据全面,操作简单,提高了数据采集效率。
(2)本发明通过通过加载预先设置好的公众号地址,在客户端打开该公众号,并抓取文章链接,放入队列,再通过下拉操作加载更多数据,抓取完文章链接,接着执行详情链接获取文章内容、点赞数,阅读数和评论等,从而实现微信公众号文章的采集,避免出现重复采集的情况,提高数据采集效率。
当然,实施本发明的任一产品并不一定需要同时达到以上所述的所有优点。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明的一种基于代理的侵入式社交数据采集方法的流程图;
图2为本发明的一种基于代理的侵入式社交数据采集方法的时序图;
图3为本发明的客户端与程序服务器通信过程图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
请参阅图1-2所示,本发明为一种基于代理的侵入式社交数据采集方法,包括如下步骤:
步骤s1:启动调度程序定时任务,从数据库中取出公众号放入redis中,并进行去重处理;
步骤s2:定时从redis中取出地址放入rabbitmq队列中,并启动微信爬虫程序;
步骤s3:用户登录微信客户端,打开公众号文章,向微信服务器发送请求;
步骤s4:经过代理服务器处理,代理截取微信服务器的响应数据,注入js响应到客户端,代理服务器处理的如果是图片文件资源,则通过本地资源进行响应;
步骤s5:根据注入的js连接爬虫服务,爬虫服务端通过注入的js操作客户端;
步骤s6:从队列中取出公众号地址放到客户端执行请求,通过下拉操作获得公众号历史文章;
步骤s7:客户端返回文章连接资源到程序中,保存到详情队列中;
步骤s8:判断队列中是否存在下一个公众号地址;
若是,则通过客户端发送请求并返回步骤s4继续执行;
若否,则执行步骤s9;
步骤s9:从详情队列中取链接放到客户端发起请求,经过代理服务器注入js,连接程序服务端;
步骤s10:程序控制客户端获得文章信息,文章信息包括文章内容、点赞数、阅读量、评论等等。
其中,步骤s4中,http请求经过代理服务器时,具体的处理步骤为:
步骤s41:收集request请求的所有请求参数,请求参数包括请求类型,请求头、请求体等等;
步骤s42:使用代理服务器对客户端的请求进行处理,返回新的请求参数或返回响应内容;
步骤s43:若返回响应内容,则立即把此响应返回到客户端,流程结束;
步骤s44:若返回请求参数,则根据请求参数,向服务端发出请求,接受服务端响应;
步骤s45:调用规则模块,对微信服务端的响应进行处理,把响应信息返回给客户端。
其中,步骤s45中,调用规则模块中的方法根据返回内容判断是否会明文解析请求,当https请求被明文解析后,处理流程同http一致,未被明文解析的请求则不会进入规则模块进行处理。
请参阅图3所示,步骤s1中,微信浏览器与socket服务器成功建立连接时,服务器会初始化当前采集的页面基本数据,如采集状态或者已采集的文章列表等等,客户端在连接成功后发送信号至服务端,将页面的url传给服务端,主要用于后续的容错性处理以及心跳数据,直至所有数据初始化完成后,服务端给客户端发送取数据指令,开始进行数据采集。
由于公众号页面内容的不同,所以具体的采集策略和规则也不一样,如:
对于公众号历史消息主页数据采集处理时,若客户端正常显示主页信息,则将当前的已加载的公众号文章链接发送给服务器,服务器对文章链接进行去重处理之后,将其发送到队列中。当采集量没有达到设定值,则服务器向客户端发送下拉指令,客户端执行滚动条下拉操作,加载更多公众号文章,然后将新增的文章发送给服务器处理,如此循环往复,直至采集量饱和。若在服务端去重处理文章链接时,遇到已采集的文章链接,则表示后面的文章都已经采集过了,所以数据采集也会终止;
对于公众号文章详情页面处理时,跟处理历史消息页面不同,由于文章详情页需要采集的数据比较多,如文章的标题、摘要、内容、点赞数、阅读数等等,所以为了减轻客户端运算压力,避免微信浏览器崩溃,所以这里做了一个简单处理,客户端会直接将当前页面的html代码发送给服务器,并由服务端对html进行解析处理。
其中,数据采集我完成时,服务端会从相应的队列中取出下一个采集页面的url,并发送至客户端让其自行跳转;若当前采集队列消费为空,则消费另一个队列,即采集完公众号主页之后,就会采集文章详情或者采集完文章详情后采集公众号主页;若两个队列消费都为空,则服务端会一直监听两个队列,直至获取下一个url。
在系统进行采集过程中,为了保证系统可持续稳定的采集,针对采集流程中的异常问题,系统需要进行异常处理:
当采集页面异常时,主要是针对于公众号文章详情页的数据处理,由于微信对于存在造谣,诈骗,违规等不法信息的公众号文章页面进行过处理,所以导致原先的采集规则失效,需要特别处理。这里处理的方案也比较简单直接,就是根据异常页面的特征,提取关键元素的class,进行判断;
由于微信对于每个微信号每日可访问的公众号数量以及访问频率有限制,所以为了避免微信号频繁被封,一方面,设置采集跳转延迟,平均每10s采集一个历史消息主页,每4s采集一个文章详情页;另一方面,对每天的公众号历史消息主页访问量进行监控,当微信号一天的公众号主页访问次数达到预警值,则停止采集公众号主页,转而采集文章详情,一段时间过后,解除告警状态,可继续采集公众号历史消息主页。
本实施例的一个具体应用为:
用户使用代理抓包工具截获微信服务端返回给微信客户端的数据包,在微信公众号返回页面时注入相应的js并返还给微信客户端;当微信浏览器加载新的页面时,会自动执行之前注入的js代码,使得微信浏览器和外部已搭建好的程序服务器建立起连接,接着在程序端以操作js的方式操作客户端的请求,以此控制整个采集流程。
再通过加载预先设置好的公众号地址,在客户端打开该公众号,并抓取文章链接,放入队列;通过下拉操作加载更多数据;抓取完文章链接,接着执行详情链接获取文章内容、点赞数,阅读数和评论等,从而实现微信公众号文章的采集。
值得注意的是,上述系统实施例中,所包括的各个单元只是按照功能逻辑进行划分的,但并不局限于上述的划分,只要能够实现相应的功能即可;另外,各功能单元的具体名称也只是为了便于相互区分,并不用于限制本发明的保护范围。
另外,本领域普通技术人员可以理解实现上述各实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,相应的程序可以存储于一计算机可读取存储介质中。
以上公开的本发明优选实施例只是用于帮助阐述本发明。优选实施例并没有详尽叙述所有的细节,也不限制该发明仅为所述的具体实施方式。显然,根据本说明书的内容,可作很多的修改和变化。本说明书选取并具体描述这些实施例,是为了更好地解释本发明的原理和实际应用,从而使所属技术领域技术人员能很好地理解和利用本发明。本发明仅受权利要求书及其全部范围和等效物的限制。