当前市面上有大量的应用市场,这些应用市场作为各个安卓开发者的分发渠道,占据着重要的位置。如果我们需要批量下载apk用于研究,那么就需要用到爬虫技术,这里仅仅介绍一个简单的例子,即爬取应用宝上的apk。爬取apk首先需要找到该apk的展示页面,比如应用宝上的QQ下载页面,http://sj.qq.com/myapp/detail.htm?apkName=com.tencent.mobileqq,可以看出,参数是apkName,那么你只要往里面传apk包名即可拼接出整个链接。page_url = "http://android.myapp.com/myapp/detail.htm?apkName=" + pn
headers = {'User-Agent': "AndroidDownloadManager/4.1.1 (Linux; U; Android 4.1.1; Nexus S Build/JRO03E)"}
resp = requests.get(page_url, headers=headers, timeout=30)
接下来,最关键的就是要解析resp了。python生态圈有很多lib能够解析HTTP请求的相应,这里我使用lxml,该组件的用法,大家可以自行百度。root = etree.HTML(resp.text)
elem = root.xpath("//a[@class='det-down-btn']")
download_url = None if None is elem or len(elem) == 0 else elem[0].attrib["data-apkurl"]
这样,就获得了下载url,类似的我们可以请求该链接,即可获得apk文件。大家使用浏览器手动下载,会发现下载的apk名字里面包含了包名和版本号以及其他信息。我这里也采用类似的策略来命名下载的apk。import urlparse
import os
o = urlparse.urlparse(download_url)
filename = urlparse.parse_qs(o.query, True)['fsname'][0]
if not os.path.exists(filename):
print 'download...', filename
resp = requests.get(download_url, headers=headers, timeout=30)
with open(filename, 'wb') as fp:
fp.write(resp.content)
这样我们就能把apk保存到本地了。
以上就是最简单的apk下载爬虫了。