Python爬蟲(chóng)之抓取APP下載鏈接

前言

最近有個(gè)需求是批量下載安卓APP谬俄。顯然,刀耕火種用手點(diǎn)是不科學(xué)的物邑。于是嘗試用Python寫(xiě)了一個(gè)半自動(dòng)化的腳本溜哮。所謂半自動(dòng)化,就是把下載鏈接批量抓取下來(lái),然后一起貼到迅雷里進(jìn)行下載,這樣可以快速批量下載隔缀。

準(zhǔn)備工作

  • Python 2.7.11:下載python
  • Pycharm:下載Pycharm
    其中python2和python3目前同步發(fā)行扳埂,我這里使用的是python2作為環(huán)境。Pycharm是一款比較高效的Python IDE盏求,但是需要付費(fèi)。

基本思路

  • 首先我們的目標(biāo)網(wǎng)站:安卓市場(chǎng)
    點(diǎn)擊【應(yīng)用】,進(jìn)入我們的關(guān)鍵頁(yè)面:
安卓市場(chǎng).png
  • 跳轉(zhuǎn)到應(yīng)用界面后我們需要關(guān)注三個(gè)地方蝌矛,下圖紅色方框標(biāo)出:
應(yīng)用頁(yè)面.png

首先關(guān)注地址欄的URL,再關(guān)注免費(fèi)下載按鈕错英,然后關(guān)注底端的翻頁(yè)選項(xiàng)入撒。點(diǎn)擊“免費(fèi)下載”按鈕就會(huì)立即下載相應(yīng)的APP,所以我們的思路就是拿到這個(gè)點(diǎn)擊下載的連接椭岩,就可以直接下載APP了茅逮。

編寫(xiě)爬蟲(chóng)

  • 第一個(gè)需要解決的點(diǎn):我們?cè)趺茨玫缴厦嬲f(shuō)的下載鏈接?這里不得不介紹下瀏覽器展示網(wǎng)頁(yè)的基本原理判哥。說(shuō)簡(jiǎn)單點(diǎn)献雅,瀏覽器是一個(gè)類(lèi)似解析器的工具,它得到HTML等代碼的時(shí)候會(huì)按照相應(yīng)的規(guī)則解析渲染塌计,從而我們能夠看到頁(yè)面挺身。
  • 這里我使用的是谷歌瀏覽器,對(duì)著頁(yè)面右鍵夺荒,點(diǎn)擊“檢查”瞒渠,可以看到網(wǎng)頁(yè)原本的HTML代碼:
HTML代碼.png
  • 看到眼花繚亂的HTML代碼不用著急,谷歌瀏覽器的審查元素有一個(gè)好用的小功能技扼,可以幫我們定位頁(yè)面控件對(duì)應(yīng)的HTML代碼位置:
定位HTML代碼.png

如上圖所示伍玖,點(diǎn)擊上方矩形框中的小箭頭,點(diǎn)擊頁(yè)面對(duì)應(yīng)的位置剿吻,在右邊的HTML代碼中就會(huì)自動(dòng)定位并高亮窍箍。

  • 接下來(lái)我們定位到下載按鈕對(duì)應(yīng)的HTML代碼:

下載按鈕對(duì)應(yīng)HTML.png

可以看到按鈕對(duì)應(yīng)的代碼中,存在相應(yīng)的下載鏈接:【/appdown/com.tecent.mm】,加上前綴椰棘,完整的下載鏈接就是 http://apk.hiapk.com/appdown/com.tecent.mm

  • 首先使用python拿到整個(gè)頁(yè)面的HTML纺棺,很簡(jiǎn)單,使用“requests.get(url)”邪狞,url填入相應(yīng)網(wǎng)址即可祷蝌。
requestHTML.png
  • 接著,在抓取頁(yè)面關(guān)鍵信息的時(shí)候帆卓,采取“先抓大巨朦、再抓小”的思路〗A睿可以看到一個(gè)頁(yè)面有10個(gè)APP糊啡,在HTML代碼中對(duì)應(yīng)10個(gè)item:
list_item.png

而每個(gè) li 標(biāo)簽中,又包含各自APP的各個(gè)屬性(名稱(chēng)吁津、下載鏈接等)棚蓄。所以第一步,我們將這10個(gè) li 標(biāo)簽提取出來(lái):

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```
這里用到了簡(jiǎn)單的正則表達(dá)式知識(shí)碍脏,這里提供一個(gè)鏈接:[正則表達(dá)式入門(mén)](http://www.oschina.net/question/12_9507)
* 提取 li 標(biāo)簽中的下載鏈接:
```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
  • 接下來(lái)需要說(shuō)的難點(diǎn)是翻頁(yè)梭依,點(diǎn)擊下方的翻頁(yè)按鈕后我們可以看到地址欄發(fā)生了如下變化:


    原始URL.png
帶ID的URL.png

豁然開(kāi)朗,我們可以在每次的請(qǐng)求中替換URL中對(duì)應(yīng)的id值實(shí)現(xiàn)翻頁(yè)潮酒。

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

爬蟲(chóng)效果

  • 關(guān)鍵位置說(shuō)完了睛挚,我們先看下最后爬蟲(chóng)的效果:
爬取結(jié)果.png

在TXT文件中保存結(jié)果如下:

最終結(jié)果.png

直接復(fù)制進(jìn)迅雷就可以批量高速下載了。

附上全部代碼

#-*_coding:utf8-*-
import requests
import re
import sys
reload(sys)
sys.setdefaultencoding("utf-8")

class spider(object):
    def __init__(self):
        print u'開(kāi)始爬取內(nèi)容'
    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'正在處理頁(yè)面' + 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)

總結(jié)

選取的目標(biāo)網(wǎng)頁(yè)相對(duì)結(jié)構(gòu)清晰簡(jiǎn)單急黎,這是一個(gè)比較基本的爬蟲(chóng)扎狱。代碼寫(xiě)的比較亂,見(jiàn)諒勃教。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末淤击,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子故源,更是在濱河造成了極大的恐慌污抬,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绳军,死亡現(xiàn)場(chǎng)離奇詭異印机,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)门驾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)射赛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人奶是,你說(shuō)我怎么就攤上這事楣责】⒐啵” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵秆麸,是天一觀的道長(zhǎng)初嘹。 經(jīng)常有香客問(wèn)我,道長(zhǎng)沮趣,這世上最難降的妖魔是什么屯烦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮房铭,結(jié)果婚禮上漫贞,老公的妹妹穿的比我還像新娘。我一直安慰自己育叁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布芍殖。 她就那樣靜靜地躺著豪嗽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪豌骏。 梳的紋絲不亂的頭發(fā)上龟梦,一...
    開(kāi)封第一講書(shū)人閱讀 49,816評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音窃躲,去河邊找鬼计贰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蒂窒,可吹牛的內(nèi)容都是我干的躁倒。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼洒琢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼秧秉!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起衰抑,我...
    開(kāi)封第一講書(shū)人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤象迎,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后呛踊,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體砾淌,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年谭网,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了汪厨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蜻底,死狀恐怖骄崩,靈堂內(nèi)的尸體忽然破棺而出聘鳞,到底是詐尸還是另有隱情,我是刑警寧澤要拂,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布抠璃,位于F島的核電站,受9級(jí)特大地震影響脱惰,放射性物質(zhì)發(fā)生泄漏搏嗡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一拉一、第九天 我趴在偏房一處隱蔽的房頂上張望采盒。 院中可真熱鬧,春花似錦蔚润、人聲如沸磅氨。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)烦租。三九已至,卻和暖如春除盏,著一層夾襖步出監(jiān)牢的瞬間叉橱,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工者蠕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留窃祝,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓踱侣,卻偏偏與公主長(zhǎng)得像粪小,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抡句,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,777評(píng)論 25 707
  • 聲明:本文講解的實(shí)戰(zhàn)內(nèi)容糕再,均僅用于學(xué)習(xí)交流,請(qǐng)勿用于任何商業(yè)用途玉转! 一突想、前言 強(qiáng)烈建議:請(qǐng)?jiān)陔娔X的陪同下,閱讀本文...
    Bruce_Szh閱讀 12,682評(píng)論 6 28
  • 1 前言 作為一名合格的數(shù)據(jù)分析師究抓,其完整的技術(shù)知識(shí)體系必須貫穿數(shù)據(jù)獲取猾担、數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)提取刺下、數(shù)據(jù)分析绑嘹、數(shù)據(jù)挖掘、...
    whenif閱讀 18,064評(píng)論 45 523
  • 清澈泛綠的水面上姨丈,飄逸著一層絲綢般順滑的薄霧,由水氣升華復(fù)凝而成擅腰,輕盈的遮掩著柔軟的溪面蟋恬,婀娜靈動(dòng),如剛出浴的豆蔻...
    水煮蓮花閱讀 726評(píng)論 6 8
  • 早上收到媽媽的一條微信趁冈,是一篇文章鏈接歼争。 上了年紀(jì)的人總愛(ài)關(guān)注些養(yǎng)生知識(shí),不管那些營(yíng)銷(xiāo)號(hào)說(shuō)的是對(duì)是錯(cuò)渗勘,也不知道那些...
    河畔青檸閱讀 422評(píng)論 0 2