这篇文章主要实现的是批量下载安卓 APP。显然用手点是不科学的。于是尝试用 Python 写了一个半自动化的脚本。所谓半自动化,就是把下载链接批量抓取下来,然后一起贴到迅雷里进行下载,这样可以快速批量下载。有需要的朋友们可以一起看看吧。
Python 是一种面向对象、解释型计算机程序设计语言,由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年。Python 语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是 C/C++)很轻松地联结在一起。
首先是准备工作
Python 2.7.11:{aa2aa}
Pycharm:{aa1aa}
其中 python2 和 python3 目前同步发行,我这里使用的是 python2 作为环境。Pycharm 是一款比较高效的 Python IDE,但是需要付费。
实现的基本思路
首先我们的目标网站:{aa0aa}
点击【应用】,进入我们的关键页面:
跳转到应用界面后我们需要关注三个地方,下图红色方框标出:
首先关注地址栏的 URL,再关注免费下载按钮,然后关注底端的翻页选项。点击 "免费下载" 按钮就会立即下载相应的 APP,所以我们的思路就是拿到这个点击下载的连接,就可以直接下载 APP 了。
编写爬虫
第一个需要解决的点:我们怎么拿到上面说的下载链接?这里不得不介绍下浏览器展示网页的基本原理。说简单点,浏览器是一个类似解析器的工具,它得到 html 等代码的时候会按照相应的规则解析渲染,从而我们能够看到页面。
这里我使用的是谷歌浏览器,对着页面右键,点击 "检查",可以看到网页原本的 HTML 代码:
看到眼花缭乱的 HTML 代码不用着急,谷歌浏览器的审查元素有一个好用的小功能,可以帮我们定位页面控件对应的 HTML 代码
位置:
如上图所示,点击上方矩形框中的小箭头,点击页面对应的位置,在右边的 HTML 代码中就会自动定位并高亮。
接下来我们定位到下载按钮对应的 HTML 代码:
可以看到按钮对应的代码中,存在相应的下载链接:【/appdown/com.tecent.mm】,加上前缀,完整的下载链接就是 http://apk.hiapk.com/appdown/com.tecent.mm
首先使用 python 拿到整个页面的 HTML,很简单,使用 "
" ,url 填入相应网址即可。
- requests.get(url)
接着,在抓取页面关键信息的时候,采取 "先抓大、再抓小" 的思路。可以看到一个页面有 10 个 APP,在 HTML 代码中对应 10 个 item:
而每个 li 标签中,又包含各自 APP 的各个属性(名称、下载链接等)。所以第一步,我们将这 10 个 li 标签提取出来:
- def geteveryapp(self,source):
- everyapp = re.findall('(<li class="list_item".*?</li>)',source,re.S)
- #everyapp2 = re.findall('(<div class="button_bg button_1 right_mt">.*?</div>)',everyapp,re.S)
- return everyapp
这里用到了简单的正则表达式知识
- def getinfo(self,eachclass):
- info = {}
- str1 = str(re.search('<a href="(.*?)">', eachclass).group(0))
- app_url = re.search('"(.*?)"', str1).group(1)
- appdown_url = app_url.replace('appinfo', 'appdown')
- info['app_url'] = appdown_url
- print appdown_url
- return info
接下来需要说的难点是翻页,点击下方的翻页按钮后我们可以看到地址栏发生了如下变化:
豁然开朗,我们可以在每次的请求中替换 URL 中对应的 id 值实现翻页。
- def changepage(self,url,total_page):
- now_page = int(re.search('pi=(\d)', url).group(1))
- page_group = []
- for i in range(now_page,total_page+1):
- link = re.sub('pi=\d','pi=%s'%i,url,re.S)
- page_group.append(link)
- return page_group
爬虫效果
关键位置说完了,我们先看下最后爬虫的效果:
在 TXT 文件中保存结果如下:
直接复制进迅雷就可以批量高速下载了。
附上全部代码
- #-*_coding:utf8-*-
- import requests
- import re
- import sys
- reload(sys)
- sys.setdefaultencoding("utf-8")
- class spider(object):
- def __init__(self):
- print u'开始爬取内容'
- def getsource(self,url):
- html = requests.get(url)
- return html.text
- def changepage(self,url,total_page):
- now_page = int(re.search('pi=(\d)', url).group(1))
- page_group = []
- for i in range(now_page,total_page+1):
- link = re.sub('pi=\d','pi=%s'%i,url,re.S)
- page_group.append(link)
- return page_group
- def geteveryapp(self,source):
- everyapp = re.findall('(<li class="list_item".*?</li>)',source,re.S)
- return everyapp
- def getinfo(self,eachclass):
- info = {}
- str1 = str(re.search('<a href="(.*?)">', eachclass).group(0))
- app_url = re.search('"(.*?)"', str1).group(1)
- appdown_url = app_url.replace('appinfo', 'appdown')
- info['app_url'] = appdown_url
- print appdown_url
- return info
- def saveinfo(self,classinfo):
- f = open('info.txt','a')
- str2 = "http://apk.hiapk.com"
- for each in classinfo:
- f.write(str2)
- f.writelines(each['app_url'] + '\n')
- f.close()
- if __name__ == '__main__':
- appinfo = []
- url = 'http://apk.hiapk.com/apps/MediaAndVideo?sort=5&pi=1'
- appurl = spider()
- all_links = appurl.changepage(url, 5)
- for link in all_links:
- print u'正在处理页面' + link
- html = appurl.getsource(link)
- every_app = appurl.geteveryapp(html)
- for each in every_app:
- info = appurl.getinfo(each)
- appinfo.append(info)
- appurl.saveinfo(appinfo)
总结
来源: http://www.phperz.com/article/17/0313/301484.html