Python爬取APP下載連結的實現方法_python

來源:互聯網
上載者:User

首先是準備工作

Python 2.7.11:下載python

Pycharm:下載Pycharm

其中python2和python3目前同步發行,我這裡使用的是python2作為環境。Pycharm是一款比較高效的Python IDE,但是需要付費。

實現的基本思路

首先我們的目標網站:安卓市場

點擊【應用】,進入我們的關鍵頁面:

跳轉到應用介面後我們需要關注三個地方,下圖紅色方框標出:

首先關注地址欄的URL,再關注免費下載按鈕,然後關注底端的翻頁選項。點擊“免費下載”按鈕就會立即下載相應的APP,所以我們的思路就是拿到這個點擊下載的串連,就可以直接下載APP了。

編寫爬蟲

第一個需要解決的點:我們怎麼拿到上面說的下載連結?這裡不得不介紹下瀏覽器展示網頁的基本原理。說簡單點,瀏覽器是一個類似解析器的工具,它得到HTML等代碼的時候會按照相應的規則解析渲染,從而我們能夠看到頁面。

這裡我使用的是Google瀏覽器,對著頁面右鍵,點擊“檢查”,可以看到網頁原本的HTML代碼:

看到眼花繚亂的HTML代碼不用著急,Google瀏覽器的審查元素有一個好用的小功能,可以幫我們定位頁面控制項對應的HTML代碼

位置:

如上圖所示,點擊上方矩形框中的小箭頭,點擊頁面對應的位置,在右邊的HTML代碼中就會自動定位並高亮。

接下來我們定位到下載按鈕對應的HTML代碼:

可以看到按鈕對應的代碼中,存在相應的下載連結:【/appdown/com.tecent.mm】,加上首碼,完整的下載連結就是 http://apk.hiapk.com/appdown/com.tecent.mm

首先使用python拿到整個頁面的HTML,很簡單,使用“requests.get(url) ” ,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

這裡用到了簡單的Regex知識

提取 li 標籤中的下載連結:

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 requestsimport reimport sysreload(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)

總結

選取的目標網頁相對結構清晰簡單,這是一個比較基本的爬蟲。代碼寫的比較亂請見諒,以上就是這篇文章的全部內容了,希望能對大家的學習或者工作帶來一定的協助,如果有問題大家可以留言交流。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.