Mac环境Python配置

  1. 安转最新版 Python 3.6.4:Mac OS X 64-bit/32-bit installer

  2. 安装最新Mac版 PyCharm 2017.3.3

  3. 打开PyCharm,新建Project,新建Python File

  4. 点击File/ Default Settings/ Project Interpreter/ 选择你当前的项目,然后选择”+”号(Install)

  5. 搜索并安装用于网页解析库BeautifulSoup的bs4和beautifulsoup4、HTTP库requests、网页解析库lxml以及用于正则表达式的re,关于正则表达式入门可以参考唯心不易博主的『Python 正则表达式入门(初级篇)』

应用搜索

  1. 使用Chrome浏览器打开安卓应用市场页面,这里用百度手机助手举例,搜索栏中输入目标应用关键词,如『123』。

  2. 跳转后观察地址栏:
    http://shouji.baidu.com/s?wd=123&data_type=app&f=header_software%40input,其实我们只需要http://shouji.baidu.com/s?wd=123,而末尾的『123』就是刚才搜索的关键词。

  3. 若只更改『123』为『CSDN』,页面就会跳转到『CSDN』的搜索结果:http://shouji.baidu.com/s?wd=CSDN,所以通过修改 = 号后面的变量(部分网站是 search/ 或 app/ ),我们可以快速获取相关搜索页面,这个变量我们取名为AppName

  4. 最终,我们的搜索网址searchUrl为固定值http://shouji.baidu.com/s?wd= + AppName。部分网站链接稍微复杂,多搜索几次,找到不变的部分,修改剩余部分即可。

  5. 有了网址和关键词,我们可以初步编写脚本实现搜索功能:

#引入相关库
from bs4 import BeautifulSoup
import requests
import re# 手动爬虫方法
def ManualCrawl():# 交互式输入应用名作为参数appName = input("please print app's name:")# 输入完成后执行方法CaculateDownloadTimes(appName)# 传入搜索应用名
def CaculateDownloadTimes(AppName):# 完整的搜索链接searchUrl = 'http://shouji.baidu.com/s?wd=' + AppName# 获取网页html码htmlData = requests.get(searchUrl)# 解析网页soup = BeautifulSoup(htmlData.text, 'lxml')

信息提取

  1. 搜索结果有了,怎么对结果进行分析呢?右击页面,点击『检查』,网页会出现一片区域(即上文注释中的html代码),像这样:

  2. 鼠标在红框区域内上下移动,可以发现左边会根据鼠标悬浮位置不同,高亮不同区域。我们找到第一个应用『CSDN』的名字所对应的html代码块:

  3. 右击代码块 -> Copy -> Copy selector,可以得到应用名在html中的路径:”#doc > div.yui3-g > div > div > ul > li:nth-child(1) > div > div.info > div.top > a”,通过select方法我们可以得到第一个搜索结果的应用名firstRecordName :

firstRecordName = soup.select('body > div:nth-of-type(2) > div:nth-of-type(2) > div > div > ul > li:nth-of-type(1) > div > div:nth-of-type(2) > div:nth-of-type(1)')[0].get_text().encode('latin1').decode('utf-8').strip()
print('firstRecordName: ' + firstRecordName)

有以下几点需要注意:
- nth-child 要替换成 nth-of-type
- 可以发现路径不尽相同,因为完全用 Copy selector 的路径可能会发生莫名的错误,这时候就需要手写路径:一般从 body 开始,然后若< a b >内的前半段a唯一,则直接写a即可;若不唯一,要写出其序列n,从1开始: a:nth-of-type(n)
- get_text方法是将selectsoup[0]转换成str格式,有些网站需要先用 latin1 编码,再用 utf-8 解码才能正常显示。

示例代码

from bs4 import BeautifulSoup
import requests
import re# 网上说可以绕过反爬虫,但是加了没啥效果,应用宝依旧显示无相关搜索内容
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko)'}
# 传入安卓市场名、搜索应用名
def DownloadTimes(MarketName, AppName):# 木蚂蚁if MarketName == 'mumayi' or MarketName == '木蚂蚁' or MarketName == 'ant':searchUrl = 'http://s.mumayi.com/index.php?q=' + AppName# 获取网页源码htmlData = requests.get(searchUrl, headers=headers)# print('content:' + htmlData.text)# 解析网页soup = BeautifulSoup(htmlData.text, 'lxml')# 获取应用名字try:firstRecordName = soup.select('#allbody > div.main960.pos_rel > div.w670.fl > div:nth-of-type(2) > ul.applist > li:nth-of-type(1) > h3 > a:nth-of-type(1)')[0].get_text().strip().split()[0]# print('firstRecordName: ' + firstRecordName)# 获取下载量try:times = soup.select('#allbody > div.main960.pos_rel > div.w670.fl > div:nth-of-type(2) > ul.applist > li:nth-of-type(1) > a.agray > ul > li.num')[0].get_text()[5:-1]     #[x:-y]表示: 切除掉从左往右x个字符,同时切除掉从右往左y个字符print("'" + firstRecordName + "'" + "在'木蚂蚁'的下载量: " + times)except:print(MarketName + ' search error')except:print("在'木蚂蚁'中未找到与'" + AppName + "'相关的内容")# *****************需要在获取下载量之前判断搜索结果*****************# 乐商店elif MarketName == 'lenovomm' or MarketName == '乐商店' or MarketName == 'le':searchUrl = 'http://www.lenovomm.com/search/index.html?q=' + AppName# 获取网页源码htmlData = requests.get(searchUrl, headers=headers, verify=False)# print('content:' + htmlData.text)# 解析网页soup = BeautifulSoup(htmlData.text, 'lxml')try:# 获取第一个搜索内容的名字tip = soup.select('body > div.w1000.bcenter > p')[0].get_text()# print(tip)if tip == '抱歉,没有找到相关应用。':print("'乐商店'没有找到相关应用")# 终止程序quit()firstRecordName = soup.select('body > div.w1000.bcenter > div.border1.h-100.boxShadow.fl.searchAppsBox > ul > li:nth-of-type(1) > div.appDetails > p.f16.ff-wryh.appName > a')[0].get_text().strip()# print(firstRecordName)# 获取下载量try:times = soup.select('body > div.w1000.bcenter > div.border1.h-100.boxShadow.fl.searchAppsBox > ul > li:nth-of-type(1) > div.appInfo.tcenter.pr > p:nth-of-type(1) > span')[0].get_text()[:-3]print("'" + firstRecordName + "'" + "在'乐商店'的下载量: " + times)except:print(MarketName + ' search error')except:print("在'乐商店'中未找到与'" + AppName + "'相关的内容")# *******************需要latin1、utf-8解码*******************# 智汇云elif MarketName == 'zhihuiyun' or MarketName == '智汇云' or MarketName == 'huawei':searchUrl = 'http://app.hicloud.com/search/' + AppName# 获取网页源码htmlData = requests.get(searchUrl, headers=headers)# 解析网页soup = BeautifulSoup(htmlData.text, 'lxml')# 获取第一个搜索内容的名字try:firstRecordName = soup.select('body > div.lay-body > div.lay-main > div.lay-left.corner > div > div > div:nth-of-type(2) > div.game-info.whole > h4 > a')[0].get_text().encode('latin1').decode('utf-8').strip()# print(firstRecordName)try:times = soup.select('body > div.lay-body > div.lay-main > div.lay-left.corner > div > div > div:nth-of-type(2) > div.game-info.whole > div.app-btn > span')[0].get_text().encode('latin1').decode('utf-8')times = times.split('次')[0].split(':')[1]print("'" + firstRecordName + "'" + "在'智汇云'的下载量: " + times)except:print(MarketName + ' search error')except:print("在'智汇云'中未找到与'" + AppName + "'相关的内容")# ********************需要跳转2级页面获取下载量********************# 当贝elif MarketName == 'dangbei' or MarketName == '当贝':searchUrl = 'http://www.dangbei.com/app/plus/search.php?kwtype=0&q=' + AppName# 获取网页源码htmlData = requests.get(searchUrl, headers=headers)# print('content:' + htmlData.text)# 解析网页soup = BeautifulSoup(htmlData.text, 'lxml')try:# 获取第一个搜索内容的名字firstRecordName = soup.select('#softList > li:nth-of-type(1) > div > div.softInfo > p.title > a')[0].get_text().strip()# 正则表达式找出抬头与红色关键词之间的跳转链接文本# 正则表达式的运用可以参考这篇博客: https://www.cnblogs.com/chuxiuhong/p/5885073.htmlpattern0 = re.compile(r'<a href=".+' + "<font color='red'>")linkUrls = pattern0.findall(htmlData.text)# print(linkUrls[0])# 获取二级页面链接linkUrl = 'http://www.dangbei.com' + linkUrls[0].split()[1].split('"')[1]# print(linkUrl)# 进入二级页面,以获取下载量htmlData = requests.get(linkUrl, headers=headers)soup = BeautifulSoup(htmlData.text, 'lxml')# 获取下载量try:times = soup.select('#softAbs > div.info > p:nth-of-type(4) > span.lInfo')[0].get_text().encode('latin1').decode('utf-8').strip()times = times.split(':')[1]print("'" + firstRecordName + "'" + "在'当贝'的下载量:" + times)except:print(MarketName + ' search error')except:print("在'当贝'中未找到与'" + AppName + "'相关的内容")# 输入有误,重新输入市场名else:print("input market's name error")ManualCrawl()# 手动输入
def ManualCrawl():marketName = input("please print market's name:")appName = input("please print app's name:")# 输入完成后执行方法DownloadTimes(marketName, appName)# 各类数组
marketsArr = ['木蚂蚁', '乐商店', '智汇云', '当贝']
appsArr = ['A', '天', '3', '心']
exampleAppName = ['QQ', '微信', '王者荣耀', '抖音', '爱奇艺', '优酷']# 自动检测, 以市场区分
def AutoCrawlUponMarkets():# 设置计数器count = 0for marketName in marketsArr:for appName in appsArr:count = count + 1DownloadTimes(marketName, appName)if count >= len(appsArr):print('------------------------------------------------------------')count = 0# 自动检测, 以应用名区分
def AutoCrawlUponApps():# 设置计数器count = 0for appName in exampleAppName:for marketName in marketsArr:count = count + 1DownloadTimes(marketName, appName)if count >= len(marketsArr):print('------------------------------------------------------------')count = 0# 更换方法名后Run
AutoCrawlUponApps()

Git下载

包括”百度”、”360”等18个Android手机、TV应用市场。
DTHunter

存在的问题

乐视、应用宝、91、Google Play皆显示搜索失败。
若有建议或意见,欢迎大家与我交流!

【Python】Mac环境下爬取国内Android应用市场指定应用下载量相关推荐

  1. Python爬虫-爬取手机应用市场中APP下载量

    一.首先是爬取360手机助手应用市场信息,用来爬取360应用市场,App软件信息,现阶段代码只能爬取下载量,如需爬取别的信息,请自行添加代码. 使用方法: 1.在D盘根目录新建.tet文件,命名为Ap ...

  2. Python(re+urllib)在eclipse环境下爬取网络小说(多级爬取)

    python在eclipse环境下的爬虫 用到的包: import re import urllib.request 运用正则需要这个jieba库哦 不足之处,希望各位帮忙指出 谢谢啦! 思路 首先明 ...

  3. JavaScript【爬虫】在Node环境下爬取电影资源

    爬取结果 完整代码 主要代码: 在node环境下直接运行此代码 const request = require('request') const fs = require('fs') const {f ...

  4. Python-读取文件例子:一个获取指定目录下一定格式的文件名称和文件修改时间并保存为文件的python脚本 ....

    转载自:http://blog.csdn.net/forandever/article/details/5711319 功能: 获取指定目录下面符合一定规则的文件名称和文件修改时间,并保存到指定的文件 ...

  5. python scrapy框架爬取豆瓣top250电影篇一Windows下建立Scrapy项目,pycharm编辑

    1.打开cmd,进入到项目准备所放在的文件夹,执行命令: scrapy startproject douban 然后就可以使用pycharm打开项目了 2.建立spider文件 cmd命令行进入到项目 ...

  6. Android之获取指定目录下的所有特殊文件名字

    1.获取指定目录下的所有特殊文件名字 比如我们在sdcard目录下的chenyu这个文件夹里面获取以so文件结尾的所有文件名 2.代码 public ArrayList<String> g ...

  7. 2018最全如何利用Python网络爬虫抓取微信朋友圈的动态

    今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...

  8. python抓取朋友圈动态_如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)...

    原标题:如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下) 前天给大家分享了如何利用Python网络爬虫爬取微信朋友圈数据的上篇(理论篇),今天给大家分享一下代码实现(实战篇),接着上篇往 ...

  9. 请问如何查询一个APP的Android和iOS下载量?

    作者:Jasmine Jiang 链接:http://www.zhihu.com/question/28533067/answer/87871598 来源:知乎 著作权归作者所有,转载请联系作者获得授 ...

最新文章

  1. URI, URL, URN
  2. PostgreSQL 10.1 手册_部分 III. 服务器管理_第 32 章 回归测试_32.5. 测试覆盖检查
  3. 用dwz+springmvc出现这个问题Http status: 200 OK ajaxOptions: parsererror thrownError
  4. 简单的解释,让你秒懂“最优化” 问题
  5. python常用连接字符串
  6. error: ‘SA_INTERRUPT’ undeclared (first use in this function)
  7. 雷达的L、S、C、X波段是什么
  8. mysql常见练习题45题
  9. nginx php 后缀名,nginx如何隐藏后缀名php
  10. shopee虾皮注册很难吗?shopee虾皮注册有哪些注意事项?
  11. mysql查询财两个人信息_MYSQL学习与数据库综合实验—数据查询实验
  12. 密码学七:MD5算法
  13. 打印钻石图形python_Python pandas高效数据处理之绘图
  14. 雷电网络更新:迈向 Ithaca
  15. Linux查看主机信息及修改主机名hostname
  16. [转]MATLAB 主要函数指令表(按功能分类)
  17. 12306.cn火车票自动订票软件
  18. 【Dart 教程系列第 28 篇】Dart中的 Map 和实体类的相互转换
  19. 追觅、戴森、石头扫地机器人对比测评,哪个性价比更高
  20. 我们终究遇上更优秀的自己,挥手向2022年告别吧|2022年度总结

热门文章

  1. (6)三棱柱3D实现、多棱柱3D实现
  2. XP下卸载WINDOWS7
  3. 第六届“温度记录器”—数据类型(u8、u16、u32)+EEPROM存储16位、32位数据方法+EEPROM_Write()的延时
  4. jmeter之jtl文件解析
  5. 专升本C语言试题分析(一)
  6. 成为更好程序员的7个方法
  7. Spreading the Wealth
  8. 用好Ubuntu自带截屏screenshot
  9. Android/java 仿微信聊天列表时间显示规则
  10. 对数几率回归-逻辑回归