年初自学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.htmlpattern0 = 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.htmltempStr = 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 + '_' + versionappdir = 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)returnintroduction = 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 = 1for 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 += 1apk = 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’。

Python爬取当贝市场APK应用信息并下载相关推荐

  1. python爬房源信息_用python爬取链家网的二手房信息

    题外话:这几天用python做题,算是有头有尾地完成了.这两天会抽空把我的思路和方法,还有代码贴出来,供python的初学者参考.我python的实战经历不多,所以代码也是简单易懂的那种.当然过程中还 ...

  2. Python爬取豆瓣电影top250的电影信息

    Python爬取豆瓣电影top250的电影信息 前言 一.简介 二.实例源码展示 小结 前言 相信很多小伙伴在学习网络爬虫时,老师们会举一些实例案例讲解爬虫知识,本文介绍的就是经典爬虫实际案例–爬取豆 ...

  3. python爬取并分析淘宝商品信息

    python爬取并分析淘宝商品信息 背景介绍 一.模拟登陆 二.爬取商品信息 1. 定义相关参数 2. 分析并定义正则 3. 数据爬取 三.简单数据分析 1.导入库 2.中文显示 3.读取数据 4.分 ...

  4. python爬取boss直聘招聘信息_年底啦,利用Python爬取Boss直聘的招聘信息,为明年跳槽做准备...

    原标题:年底啦,利用Python爬取Boss直聘的招聘信息,为明年跳槽做准备 前言 为什么都说程序员的薪资高,但是刚开始入职的你,薪资并不是自己想象中的那样,首先是你的工作经验不足,其次就是需要不断的 ...

  5. python 爬取链家数据_用python爬取链家网的二手房信息

    题外话:这几天用python做题,算是有头有尾地完成了.这两天会抽空把我的思路和方法,还有代码贴出来,供python的初学者参考.我python的实战经历不多,所以代码也是简单易懂的那种.当然过程中还 ...

  6. python 开发安卓应用商店_用Python爬取各Android市场应用下载量(3分钟学会)

    就是这么简单! 文章目录 前言 设计一个函数 构造要爬取的网址 确定要爬取的内容的位置 构建输入和调用部分 程序完整代码 0 前言 有时候,总有一些重复又琐碎的工作,却不得不做-- 一个个统计,也不是 ...

  7. steam夏日促销用Python爬取排行榜上的游戏打折信息

    不知不觉,一年一度如火如荼的 steam 夏日促销悄然开始了.每年通过大大小小的促销,我的游戏库里已经堆积满还未下载过的游戏.但所谓"买到就是赚到,G胖一定大亏"的想法日渐流行,指 ...

  8. steam夏日促销悄然开始,用Python爬取排行榜上的游戏打折信息

    前言 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例的人,却不知道如何去学习更加高深的知识. 那么针对这三类人,我给大 ...

  9. Python爬取王者荣耀英雄的皮肤数据并下载皮肤图片项目

    Python爬取王者荣耀英雄的皮肤数据,并下载皮肤图片!高清的图片用来做桌面也不错哟~ 网址:https://pvp.qq.com/web201605/herolist.shtml 1.获得英雄信息, ...

最新文章

  1. Spring-Boot-Bean的使用,@Repository,@Service,@Controller,@Component
  2. python wsdl connection refused 111
  3. VS 动态库 导出C++类
  4. 燕京理工学院java期末_英华学堂燕京理工学院的答案
  5. 还在搜百度图片?太LOW了!
  6. Cloud Connector的普通版本和Portable版本的区别
  7. python调用linux命令输出结果,Python-运行shell命令并捕获输出
  8. 那个学Python 的同龄人,也许已经超越你了!
  9. vue导入静态js_如何在vue js中加载静态图像
  10. cocos2d-x-lua基础系列教程四(lua多继承)
  11. 风控人需知:信贷风险流程中的决策矩阵与实操
  12. 一些算法竞赛参考书及豆瓣评分
  13. MCP2515收发程序 CAN总线 CAN程序 CAN通信 5K-1M波特率 STM32+MCP2515
  14. Vue3——Suspense组件
  15. 2kids学汉字 android,新2Kids学汉字
  16. GIC spec之ITS和LPI中断1
  17. IDEA与GitHub的仓库相关联,幼儿园教学(狗头保命)
  18. H3C新版本模拟器HCL_Setup_V3.0.1安装流程
  19. 如何防止你的代码被窃取?Python代码加密方案汇总(带实例验证)
  20. 一直以来使用div menu下拉时flash总是覆盖div menu菜单,当时就很老火了。

热门文章

  1. 哪款蓝牙耳机音质比较好?盘点四款降噪效果好的蓝牙耳机
  2. 霍夫(圆)变换(hough Transform/hough cirlce Transform)原理和实现
  3. 老八秘制二叉树生成器
  4. Linux入门——如何制作一个刷取网页访问量的脚本并打包成rpm软件包(CentOS)
  5. ubuntu实现中文输入法_在Ubuntu 18.04中设置中文输入法
  6. 解读《SDWAN生态技术报告》~ 企业侧
  7. 如何提高Python的运行速度?(干货)
  8. (B站云e办)SpringBoot开发项目实战记录(七)(员工管理(分页知识))
  9. 腾讯太极广告一站式机器学习平台的产品化之路
  10. 知识回顾(一):Java八大基础类型、四大引用类型