PythonPython3自学 爬虫实战程序员

Python爬虫之抓取APP下载链接

2016-09-26  本文已影响3472人  CaptainXero

前言

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

准备工作

基本思路

安卓市场.png 应用页面.png

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

编写爬虫

HTML代码.png 定位HTML代码.png

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

下载按钮对应HTML.png
可以看到按钮对应的代码中,存在相应的下载链接:【/appdown/com.tecent.mm】,加上前缀,完整的下载链接就是 http://apk.hiapk.com/appdown/com.tecent.mm requestHTML.png 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
带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)

总结

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

上一篇 下一篇

猜你喜欢

热点阅读