Python爬虫之抓取APP下载链接

前言

最近有个需求是批量下载安卓APP。显然,刀耕火种用手点是不科学的。于是尝试用Python写了一个半自动化的脚本。所谓半自动化,就是把下载链接批量抓取下来,然后一起贴到迅雷里进行下载,这样可以快速批量下载。

准备工作

  • Python 2.7.11:下载python
  • Pycharm:下载Pycharm
    其中python2和python3目前同步发行,我这里使用的是python2作为环境。Pycharm是一款比较高效的Python IDE,但是需要付费。

基本思路

  • 首先我们的目标网站:安卓市场
    点击【应用】,进入我们的关键页面:
安卓市场.png
  • 跳转到应用界面后我们需要关注三个地方,下图红色方框标出:
应用页面.png

首先关注地址栏的URL,再关注免费下载按钮,然后关注底端的翻页选项。点击“免费下载”按钮就会立即下载相应的APP,所以我们的思路就是拿到这个点击下载的连接,就可以直接下载APP了。

编写爬虫

  • 第一个需要解决的点:我们怎么拿到上面说的下载链接?这里不得不介绍下浏览器展示网页的基本原理。说简单点,浏览器是一个类似解析器的工具,它得到HTML等代码的时候会按照相应的规则解析渲染,从而我们能够看到页面。
  • 这里我使用的是谷歌浏览器,对着页面右键,点击“检查”,可以看到网页原本的HTML代码:
HTML代码.png
  • 看到眼花缭乱的HTML代码不用着急,谷歌浏览器的审查元素有一个好用的小功能,可以帮我们定位页面控件对应的HTML代码位置:
定位HTML代码.png

如上图所示,点击上方矩形框中的小箭头,点击页面对应的位置,在右边的HTML代码中就会自动定位并高亮。

  • 接下来我们定位到下载按钮对应的HTML代码:

下载按钮对应HTML.png

可以看到按钮对应的代码中,存在相应的下载链接:【/appdown/com.tecent.mm】,加上前缀,完整的下载链接就是 http://apk.hiapk.com/appdown/com.tecent.mm

  • 首先使用python拿到整个页面的HTML,很简单,使用“requests.get(url)”,url填入相应网址即可。
requestHTML.png
  • 接着,在抓取页面关键信息的时候,采取“先抓大、再抓小”的思路。可以看到一个页面有10个APP,在HTML代码中对应10个item:
list_item.png

而每个 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```
这里用到了简单的正则表达式知识,这里提供一个链接:[正则表达式入门](http://www.oschina.net/question/12_9507)
* 提取 li 标签中的下载链接:
```code
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.png
带ID的URL.png

豁然开朗,我们可以在每次的请求中替换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

爬虫效果

  • 关键位置说完了,我们先看下最后爬虫的效果:
爬取结果.png

在TXT文件中保存结果如下:

最终结果.png

直接复制进迅雷就可以批量高速下载了。

附上全部代码

#-*_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)

总结

选取的目标网页相对结构清晰简单,这是一个比较基本的爬虫。代码写的比较乱,见谅。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,376评论 25 707
  • 声明:本文讲解的实战内容,均仅用于学习交流,请勿用于任何商业用途! 一、前言 强烈建议:请在电脑的陪同下,阅读本文...
    Bruce_Szh阅读 12,672评论 6 28
  • 1 前言 作为一名合格的数据分析师,其完整的技术知识体系必须贯穿数据获取、数据存储、数据提取、数据分析、数据挖掘、...
    whenif阅读 18,051评论 45 523
  • 清澈泛绿的水面上,飘逸着一层丝绸般顺滑的薄雾,由水气升华复凝而成,轻盈的遮掩着柔软的溪面,婀娜灵动,如刚出浴的豆蔻...
    水煮莲花阅读 720评论 6 8
  • 早上收到妈妈的一条微信,是一篇文章链接。 上了年纪的人总爱关注些养生知识,不管那些营销号说的是对是错,也不知道那些...
    河畔青柠阅读 419评论 0 2