抓取php网页源码(抓取googleplay全球12国的游戏TOP排名要怎么做)
优采云 发布时间: 2021-09-16 13:15抓取php网页源码(抓取googleplay全球12国的游戏TOP排名要怎么做)
上一篇博客讨论了Linux获取网页的方式,包括curl和WGet。这篇博客将关注Linux抓取网页的例子——在谷歌游戏的12个国家中抢占游戏排行榜的第一名
要捕获Google play games的排名页面,首先分析页面的特点和规律:
1、google游戏排名页面采用“总分”的形式,即一个网站页面显示多个排名(如24),多个这样的页面构成所有游戏的总排名
2、点击网站每页上的每个游戏连接,查看游戏的属性信息(如星级、发布日期、版本号、SDK版本号、游戏类别、下载量等)
需要解决的问题:
1、如何获取所有游戏的总排名
2、在捕获总排名后,如何拼接URL以捕获每个单独的游戏网页
3、捕获每个游戏网页后,如何提取网页中游戏的属性信息(即评估星、发布日期…)
4、how to save(MySQL)、生成日报(HTML)和在提取每个游戏的属性信息后发送日报(电子邮件)
5、根据捕获的游戏属性信息资源,如何查询您公司的游戏排名(JSP)以及如何清晰显示游戏排名(JfreeChart)
6、更困难的是谷歌游戏排名中没有全球统一的排名。谷歌采用本地化策略。几十个国家都有自己的排名算法和规则。如何实现12国比赛排名
设计方案及技术选择
在分析了上述问题和需求后,如何逐一解决并逐一突破,是我们需要思考、设计和解决的问题(模块流程和技术实现)
基于以上问题,将逐一进行以下模块设计和技术方案选择:
1、为了获取12个国家的游戏排名,我们需要在12个国家租用代理服务器来获取各个国家的游戏排名(12个国家的游戏排名算法和语言不同,包括中文、英文、日文、俄文、*敏*感*词*文……)
2、抓取网页并使用curl+代理;提取下载的网页信息并使用awk文本分析工具(您需要充分了解HTML语法、标记、ID和其他元素,才能使用awk准确提取游戏属性信息)
3、由于IP代理屏蔽系统、网页程序捕获、游戏属性信息提取等模块都是通过脚本完成的,为了保持程序语言的一致性,数据库的创建和记录插入也是通过shell脚本实现的
4、捕获的每个游戏属性信息都以网页的形式以HTML+表格的形式显示,清晰直观。Shell脚本用于拼接HTML字符串(Table+tr+TD+info)
5、生成的HTML网页每天定期以电子邮件的形式发送给产品总监、PM、RD和QA,以了解公司发布的游戏排名以及世界上增长最快、最热门的游戏趋势
6、开发一个JSP网页查询系统,根据输入的游戏名称或游戏包名称查询游戏的排名和趋势,并在趋势图下显示游戏的所有详细属性信息
模块技术实现
1、IP代理过滤
考虑到成本,每个国家租用一台代理服务器(VPN)。按最低市场价格1000元/月计算,每年为12000元。12个国家的总成本为12x12000=144000,即需要约140000元/年的VPN租赁成本
基于成本的考虑,后来,通过对代理服务器和免费IP的深入调查,提出设计开发一套免费IP代理服务器筛选系统,分别捕获12个国家的游戏排名
免费代理IP主要来自两个网站:和
由于文本预处理和过滤逻辑实现的复杂性,IP代理过滤系统将在下一篇博客中单独介绍
2、grab排名页面
仔细分析Google play game排名页面后,我们可以发现有一些规则需要遵循:
第1页Top24网站:
第2页top48网站:
第3页top72网站:
到目前为止,查看每个页面上URL的最后一个字符串?开始=24&;Num=24,你找到规律了吗?事实上,第一页上的页面以start=0开头,也可以写成:
第1页Top24网站:
根据以上规则,您可以使用curl+proxy通过循环和拼接字符串(start='expr$start+24')来获取排名网页
3、extract游戏链接
排名页面,每个页面收录24个游戏URL超链接,如何提取这24个游戏URL超链接
当时考虑了XML解析,因为html是一种分层组织的类似XML的格式,但有些网页并非都是标准的html格式(例如,左括号后没有右括号闭合),这将导致XML解析失败
后来,结合我的HTML和JS知识,我分析了排名页面的内容结构,发现每个游戏链接前面都有一个独特的class=“title”。具体格式如下(以篮球投篮为例):
Basketball Shoot
这样,class=“title”附近的文本内容可以通过awk成功提取。具体实施情况如下:
<p># split url_24
page_key='class="title"'
page_output='output_page.log'
page_output_url_start='https://play.google.com/store/apps/'
page_output_url='output_top800_url.log'
function page_split(){
grep $page_key $(ls $url_output* | sort -t "_" -k6 -n) > tmp_page_grepURL.log # use $url_output
awk -F'[]' '{for(i=1;i