Python爬取当贝市场APK应用信息并下载

本文介绍如何使用Python的requests、BeautifulSoup和lxml等模块,从当贝市场抓取应用信息,包括应用名称、版本、简介和图片,并下载到本地。通过实例演示了网页解析、正则表达式和文件操作等技巧。

年初自学python一段时间,项目中很少遇到需要实践python的地方,最近公司机顶盒的应用市场需要进行应用挂网,测试同事需要从当贝市场和奇珀市场下载特定的200多个应用,并提取信息挂到自己的服务器上,作为客户端开发的我,能用程序实现的绝对不会使用重复劳动力。

安装python 3.7,针对爬虫程序依赖的module,以管理员身份启动cmd
所需模块:beautifulsoup4 处理网页解析
requests 处理网页请求
re 处理正则表达式
lxml 是python的一个解析库,支持HTML和XML的解析
lxml需要自己下载:https://www.lfd.uci.edu/~gohlke/pythonlibs/
使用pip install <模块>即可。

如下图,需要抓取应用名称,版本,简介和图片并下载。
在这里插入图片描述
chrome F12后可以看到相应标签的class等属性,右键-copy-copy selector就可以复制css选择器标签元素。
关键代码如下:

def downloadApp(AppName):
    url = 'http://www.dangbei.com/app/plus/search.php?kwtype=0&q=' + AppName

    # 获取网页源码
    web_data = requests.get(url, headers=headers)
    # print('content:' + web_data.text)
    # 解析网页
    soup = BeautifulSoup(web_data.text, 'lxml')

    try:
        # 获取第一个搜索内容的名字
        firstRecordName = soup.select('#softList > li:nth-of-type(1) > div > div.softInfo > p.title > a')[
            0].get_text().strip()

        if AppName in firstRecordName:
            # 正则表达式找出抬头与红色关键词之间的跳转链接文本
            # 正则表达式的运用可以参考这篇博客: https://www.cnblogs.com/chuxiuhong/p/5885073.html
            pattern0 = re.compile(r'<a href=".+' + "<font color='red'>")
            linkUrls = pattern0.findall(web_data.text)
            # print(linkUrls[0])
            # 获取二级页面链接  http://www.dangbei.com/app/tv/2015/0723/2687.html变为https://m.dangbei.com/wap-view-2687.html
            tempStr = linkUrls[0].split()[1].split('"')[1]
            tempList = re.findall(r'\d+', tempStr)
            linkUrl = 'https://m.dangbei.com/wap-view-' + tempList[2] + ".html"
            print("'" + firstRecordName + "'" + "的应用页面:" + linkUrl)

            # 进入二级页面,以获取应用详情
            web_data = requests.get(linkUrl, headers=headers)
            soup = BeautifulSoup(web_data.text, 'lxml')
            try:
                version = soup.select('div.app-cat > span:nth-of-type(4)')[0].get_text().strip()
                version = version.split(':')[1]
                print("'" + firstRecordName + "'" + "的版本号:\n" + version)
                filename = AppName + '_' + version
                appdir = os.path.join(PATH, filename)
                isExists = os.path.exists(appdir)
                if not isExists:
                    # 创建文件夹
                    print('新建了一个', filename, '的文件夹!')
                    os.makedirs(appdir)
                    # 切换工作路径到AppName下
                    os.chdir(appdir)
                else:
                    print(filename, '文件夹已经存在了!')
                    # if shutil.rmtree(appdir, True):
                    # os.rmdir(appdir)  # 只能删除空目录,否则报错
                    os.chdir(appdir)
                    return
                introduction = soup.select('div.info-content > div > p')[0].get_text()
                print("'" + firstRecordName + "'" + "的详情介绍:\n" + introduction)
                # 'w'或者'wb'表示写文本文件或写二进制文件
                with open(filename + '.txt', 'w', encoding='utf-8') as f:
                    f.write(introduction)
                photourl = soup.select('div.scroll_box > ul > li')
                print("'" + firstRecordName + "'" + "的图片地址:")
                count = 1
                for temp in photourl:
                    temp_url = temp.find('img')['src']
                    temp_url = 'http://' + temp_url.split('//')[1]
                    large_url = temp_url.split('!')[0]
                    print(large_url)
                    urllib.request.urlretrieve(large_url,  'large_%s.jpg' % count)
                    urllib.request.urlretrieve(temp_url, 'small_%s.jpg' % count)
                    count += 1
                apk = soup.select('div.info_downxload > a.btn_download_app')[0]
                apkurl = apk.attrs['href']
                apktitle = apk.attrs['title']
                print("'" + firstRecordName + "'" + "的下载链接:\n" + apkurl)
                urllib.request.urlretrieve(apkurl, apktitle + '_' + version + '.apk')
            except:
                print('search error')
                os.chdir(PATH)
                with open('record.txt', 'a+', encoding='utf-8') as f:
                    f.write(AppName + '\n')
        else:
            print("未找到与'" + AppName + "'相关的内容")
            os.chdir(PATH)
            with open('record.txt', 'a+', encoding='utf-8') as f:
                f.write(AppName + '\n')

    except:
        print("未找到与'" + AppName + "'相关的内容")
        os.chdir(PATH)
        with open('record.txt', 'a+', encoding='utf-8') as f:
            f.write(AppName + '\n')

抓取结果如图:
在这里插入图片描述
在这里插入图片描述

大致使用:applist.txt输入需要抓取的应用名称,若有搜索结果便新建一个应用文件夹,里面存放图片和apk等信息,由于抓取的信息需要存放在对应目录,采用线程池并行下载会存在文件存放错乱的问题,所以采用串行下载。
期间遇到的问题:

  1. 复制的selector的若包含nth-child,得到的结果是空,使用nth-of-type即可。两者区别: nth-of-type(n) 匹配属于父元素的特定类型的第 N 个子元素的每个元素,nth-child(n)选取父元素的第 N 个子元素,与类型无关。
  2. os.rmdir只能删除空目录,否则报错;shutil.rmtree() 可递归删除文件夹下的所有子文件夹和子文件。
  3. 读写文件,记得统一编码,比如encoding=‘utf-8’。
<think>好的,用户的问题是关于如何使用Python爬取网站中的APK安装包。首先,我需要确认用户的需求是什么。他们可能想要自动化下载APK文件,可能是为了备份、分析或者分发。接下来,我需要考虑实现这个任务的步骤。 首先,用户需要找到目标网站上APK文件的URL。通常,APK文件的链接可能以.apk结尾,或者在网页的某个特定位置。可能需要解析网页内容,比如HTML,来提取这些链接。这时候需要用到requests库来获取网页内容,然后用BeautifulSoup或正则表达式来解析。 然后,用户需要处理可能的反爬虫机制,比如需要设置headers、处理cookies,或者应对验证码。如果网站有这些防护措施,可能需要更复杂的处理,比如使用Selenium模拟浏览器操作。 接下来是下载APK文件。一旦有了正确的URL,可以使用requests.get方法下载文件,以二进制模式保存到本地。需要注意的是大文件的下载可能需要分块处理,避免内存溢出。 另外,用户可能需要处理多个页面或者目录结构,这时候可能需要递归爬取或者遍历链接。同时,遵守网站的robots.txt规则和法律法规也很重要,不能随意爬取受版权保护的内容。 可能的错误点包括:URL解析不正确、网络请求被拒绝、文件保存路径问题等。需要添加异常处理,比如try-except块,来捕获和处理这些错误。 最后,示例代码需要简洁明了,展示基本流程。可能需要提醒用户根据实际情况调整选择器或正则表达式,注意合法性和道德问题。 相关问题方面,用户可能想知道如何处理反爬虫、如何解析动态加载的内容、如何批量下载、如何验证文件完整性,以及法律方面的注意事项。这些都是常见的后续问题,需要列出供用户进一步参考。</think>通过Python爬取网站中的APK安装包需要以下步骤: 1. **获取网页内容** ```python import requests from bs4 import BeautifulSoup url = "https://example.com/apk-list" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" } response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') ``` 2. **定位APK链接** ```python # 假设APK链接在<a>标签且包含.apk后缀 apk_links = [a['href'] for a in soup.find_all('a', href=True) if a['href'].endswith('.apk')] ``` 3. **下载APK文件** ```python for i, link in enumerate(apk_links): # 处理相对路径 if not link.startswith('http'): apk_url = urljoin(url, link) else: apk_url = link # 下载文件 apk_response = requests.get(apk_url, stream=True) with open(f"apk_{i}.apk", "wb") as f: for chunk in apk_response.iter_content(chunk_size=1024): if chunk: f.write(chunk) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值