前言
最近有個(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è)面:
- 跳轉(zhuǎn)到應(yīng)用界面后我們需要關(guān)注三個(gè)地方蝌矛,下圖紅色方框標(biāo)出:
首先關(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代碼不用著急,谷歌瀏覽器的審查元素有一個(gè)好用的小功能技扼,可以幫我們定位頁(yè)面控件對(duì)應(yīng)的HTML代碼位置:
如上圖所示伍玖,點(diǎn)擊上方矩形框中的小箭頭,點(diǎn)擊頁(yè)面對(duì)應(yīng)的位置剿吻,在右邊的HTML代碼中就會(huì)自動(dòng)定位并高亮窍箍。
- 接下來(lái)我們定位到下載按鈕對(duì)應(yīng)的HTML代碼:
可以看到按鈕對(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)址即可祷蝌。
- 接著,在抓取頁(yè)面關(guān)鍵信息的時(shí)候帆卓,采取“先抓大巨朦、再抓小”的思路〗A睿可以看到一個(gè)頁(yè)面有10個(gè)APP糊啡,在HTML代碼中對(duì)應(yīng)10個(gè)item:
而每個(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ā)生了如下變化:
豁然開(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)的效果:
在TXT文件中保存結(jié)果如下:
直接復(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)諒勃教。