Linux 抓取网页实例(shell+awk)

               

上一篇博客讲了Linux抓取网页的方式,有curl和wget两种方式,这篇将重点讲Linux抓取网页的实例——抓取google play全球12国的游戏TOP排名

要抓取google play游戏排名网页,首先需要分析网页的特点和规律:

1、google play游戏排名网页,是一个就“总-分”形式,即一页网址显示若干排名(如24个),有若干个这样的网页组成全部游戏的总排名

2、每页网址中,点击每个单独的游戏连接,可以查看本游戏的属性信息(如评价星级、发布日期、版本号、SDK版本号、游戏类别、下载量等)


需要解决的问题:

1、如何抓取全部游戏总排名?

2、抓取到总排名后,如何拼接URL来抓取每个单独的游戏网页?

3、抓取到每个单独游戏网页后,如何提取网页中游戏的属性信息(即评价星级、发布日期。。。)?

4、提取到了每个单独游戏属性信息后,如何保存(mysql)、生成每日报表(html)、发送每日报表(email)?

5、根据抓取的游戏属性信息资源,如何查询自己公司的游戏排名(JSP)、如何清晰的展现游戏排名(JFreeChart图表)?

6、更难的是,google play游戏排名,并没有全球统一的排名,google采用本地化策略,几十个国家都有自己的一套排名算法和规则,如何实现12国游戏排名?


设计方案和技术选择

分析完上述的这些问题需求后,如何逐一解决,各个击破,便是需要我们思考、设计和解决的问题(模块流程和技术实现)?

基于上面分析提出的问题,下面将逐一进行模块设计、技术方案选择:




1、为了抓取12国的游戏排名,需要分别在12国租用代理服务器,才能抓取各国的游戏排名(12国游戏排名算法、语言都不同,有中文、英文、日语、俄语、西班牙语...)

2、抓取网页,使用curl+proxy代理的方式;提取下载的网页信息,使用awk文本分析工具(需要对html语法tag、id等元素非常了解,才能准确利用awk提取游戏属性信息)

3、由于IP代理筛选系统、抓取网页程序、提取游戏属性信息等模块全部都是利用脚本完成,为了保持程序语言的一致性,数据库的创建、记录插入也都是用shell脚本实现

4、抓取的每个游戏属性信息,采用html+table以网页的形式展现出来,清晰、直观。其中使用到了shell脚本来拼接html字符串(table + tr + td + info)

5、生成的html网页,每日以邮件形式定时发给产品总监、PM,以及RD和QA,了解公司发布的游戏排名情况,以及全球排名上升最快、最热门的游戏趋势

6、开发一个JSP网页查询系统,根据输入的游戏名称或游戏包名两种方式查询一个游戏的排名及趋势,且在趋势图下面显示该游戏的详细的全部属性信息


模块技术实现

1、IP代理筛选

费用考虑,每个国家租用一台代理服务器(VPN),按市场最低价1000元/月计,一年12000元,12国家总费用为12x12000=144000,即大约需要14万/年的VPN租借费用

基于成本开销的考虑,后来我通过深入调研代理服务器和免费ip,提出了自己设计开发一套免费ip代理服务器筛选系统,来分别抓取12国游戏排名

免费代理IP主要来源于上一篇博客中介绍的两个网站:freeproxylists.net 和 xroxy.com,强烈推荐使用米扑代理:proxy.mimvp.com

米扑代理,每天提供20个免费代理使用,支持http、https、socks4、socks5等四种协议,覆盖120多个国家,中国34个省市

米扑代理官网:http://proxy.mimvp.com

IP代理筛选系统,由于文本预处理和筛选逻辑实现都较为复杂,将在下一篇博客中单独介绍


2、抓取排名网页

仔细分析google play游戏排名网页,可以发现是有规律可循:

第一页Top24网址:https://play.google.com/store/apps/category/GAME/collection/topselling_free

第二页Top48网址:https://play.google.com/store/apps/category/GAME/collection/topselling_free?start=24&num=24

第三页Top72网址:https://play.google.com/store/apps/category/GAME/collection/topselling_free?start=48&num=24

。。。

至此,观察每页网址最后的一段字符串 ?start=24&num=24 ,已经发现规律了吧 ^_^  其实第一页的网页从start=0开始,也可以写成:

第一页Top24网址:https://play.google.com/store/apps/category/GAME/collection/topselling_free?start=0&num=24

根据上面的规律,就可以通过循环拼接字符串,用curl+proxy来抓取排名网页了(start = 'expr $start + 24')


3、提取游戏链接

排名网页,每页包含24个游戏网址超链接,如何提取到这24个游戏网址超链接?

当时考虑过使用xml解析,因为html都是层级组织起来的类xml格式,但有些网页也不全是标准的html格式(如左括号后没有右括号闭包),这会导致xml无法正确解析

后来结合自己学过的html和js知识,分析抓取排名网页的内容结构,发现每个游戏链接前面都还有一个唯一的 class="title" 具体格式如下(Basketball Shoot 为例):

<a class="title" title="Basketball Shoot" data-a="1" data-c="1" href="/store/apps/details?id=com.game.basketballshoot&feature=apps_topselling_free">Basketball Shoot</a>

这样,可以顺利通过awk来提取 class="title

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值