2024年分析了 6000 款 App,原来还有这么多多多多多多多神器!_610a


这里,利用 response.urljoin() 方法将提取出的相对 URL 拼接为完整的 URL,然后利用 scrapy.Request() 方法构造每个 App 详情页的请求,这里我们传递两个参数:url 和 callback,url 为详情页 URL,callback 是回调函数,它将主页 URL 请求返回的响应 response 传给专门用来解析字段内容的 parse\_url() 方法,如下所示:



1def parse_url(self,response):
2    item = KuanItem()
3    item[‘name’] = response.css(‘.detail_app_title::text’).extract_first()
4    results = self.get_comment(response)
5    item[‘volume’] = results[0]
6    item[‘download’] = results[1]
7    item[‘follow’] = results[2]
8    item[‘comment’] = results[3]
9    item[‘tags’] = self.get_tags(response)
10    item[‘score’] = response.css(‘.rank_num::text’).extract_first()
11    num_score = response.css(‘.apk_rank_p1::text’).extract_first()
12    item[‘num_score’] = re.search(‘共(.?)个评分’,num_score).group(1)
13    yield item
14
15def get_comment(self,response):
16    messages = response.css(‘.apk_topba_message::text’).extract_first()
17    result = re.findall(r’\s+(.
?)\s+/\s+(.?)下载\s+/\s+(.?)人关注\s+/\s+(.?)个评论.?’,messages)  # \s+ 表示匹配任意空白字符一次以上
18    if result: # 不为空
19        results = list(result[0]) # 提取出list 中第一个元素
20        return results
21
22def get_tags(self,response):
23    data = response.css(‘.apk_left_span2’)
24    tags = [item.css(‘::text’).extract_first() for item in data]
25    return tags


这里,单独定义了 get\_comment() 和 get\_tags() 两个方法.


get\_comment() 方法通过正则匹配提取 volume、download、follow、comment 四个字段信息,正则匹配结果如下:



1result = re.findall(r’\s+(.?)\s+/\s+(.?)下载\s+/\s+(.?)人关注\s+/\s+(.?)个评论.*?',messages)
2print(result) # 输出第一页的结果信息
3# 结果如下:
4[(‘21.74M’, ‘5218万’, ‘2.4万’, ‘5.4万’)]
5[(‘75.53M’, ‘2768万’, ‘2.3万’, ‘3.0万’)]
6[(‘46.21M’, ‘1686万’, ‘2.3万’, ‘3.4万’)]
7[(‘54.77M’, ‘1603万’, ‘3.8万’, ‘4.9万’)]
8[(‘3.32M’, ‘1530万’, ‘1.5万’, ‘3343’)]
9[(‘75.07M’, ‘1127万’, ‘1.6万’, ‘2.2万’)]
10[(‘92.70M’, ‘1108万’, ‘9167’, ‘1.3万’)]
11[(‘68.94M’, ‘1072万’, ‘5718’, ‘9869’)]
12[(‘61.45M’, ‘935万’, ‘1.1万’, ‘1.6万’)]
13[(‘23.96M’, ‘925万’, ‘4157’, ‘1956’)]


然后利用 result[0]、result[1] 等分别提取出四项信息,以 volume 为例,输出第一页的提取结果:



1item[‘volume’] = results[0]
2print(item[‘volume’])
321.74M
475.53M
546.21M
654.77M
73.32M
875.07M
992.70M
1068.94M
1161.45M
1223.96M


这样一来,第一页 10 款 App 的所有字段信息都被成功提取出来,然后返回到 yied item 生成器中,我们输出一下它的内容:



1[
2{‘name’: ‘酷安’, ‘volume’: ‘21.74M’, ‘download’: ‘5218万’, ‘follow’: ‘2.4万’, ‘comment’: ‘5.4万’, ‘tags’: “[‘酷市场’, ‘酷安’, ‘市场’, ‘coolapk’, ‘装机必备’]”, ‘score’: ‘4.4’, ‘num_score’: ‘1.4万’}, 
3{‘name’: ‘微信’, ‘volume’: ‘75.53M’, ‘download’: ‘2768万’, ‘follow’: ‘2.3万’, ‘comment’: ‘3.0万’, ‘tags’: “[‘微信’, ‘qq’, ‘腾讯’, ‘tencent’, ‘即时聊天’, ‘装机必备’]”,‘score’: ‘2.3’, ‘num_score’: ‘1.1万’},
4…
5]


2.3.4. 分页爬取


以上,我们爬取了第一页内容,接下去需要遍历爬取全部 610 页的内容,这里有两种思路:


* 第一种是提取翻页的节点信息,然后构造出下一页的请求,然后重复调用 parse 方法进行解析,如此循环往复,直到解析完最后一页。
* 第二种是先直接构造出 610 页的 URL 地址,然后批量调用 parse 方法进行解析。


这里,我们分别写出两种方法的解析代码,第一种方法很简单,直接接着 parse 方法继续添加以下几行代码即可:



1def parse(self, response):
2    contents = response.css(‘.app_left_list>a’)
3    for content in contents:
4        …
5
6    next_page = response.css(‘.pagination li:nth-child(8) a::attr(href)’).extract_first()
7    url = response.urljoin(next_page)
8    yield scrapy.Request(url,callback=self.parse )


第二种方法,我们在最开头的 parse() 方法前,定义一个 start\_requests() 方法,用来批量生成 610 页的 URL,然后通过 scrapy.Request() 方法中的 callback 参数,传递给下面的 parse() 方法进行解析。



1def start_requests(self):
2        pages = []
3        for page in range(1,610):  # 一共有610页
4            url = ‘https://www.coolapk.com/apk/?page=%s’%page
5            page =  scrapy.Request(url,callback=self.parse)
6            pages.append(page)
7        return pages


以上就是全部页面的爬取思路,爬取成功后,我们需要存储下来。这里,我面选择存储到 MongoDB 中,不得不说,相比 MySQL,MongoDB 要方便省事很多。


2.3.5. 存储结果


我们在 pipelines.py 程序中,定义数据存储方法,MongoDB 的一些参数,比如地址和数据库名称,需单独存放在 settings.py 设置文件中去,然后在 pipelines 程序中进行调用即可。



1import pymongo
2class MongoPipeline(object):
3    def init(self,mongo_url,mongo_db):
4        self.mongo_url = mongo_url
5        self.mongo_db = mongo_db
6    @classmethod
7    def from_crawler(cls,crawler):
8        return cls(
9            mongo_url = crawler.settings.get(‘MONGO_URL’),
10            mongo_db = crawler.settings.get(‘MONGO_DB’)
11        )
12    def open_spider(self,spider):
13        self.client = pymongo.MongoClient(self.mongo_url)
14        self.db = self.client[self.mongo_db]
15    def process_item(self,item,spider):
16        name = item.class.name
17        self.db[name].insert(dict(item))
18        return item
19    def close_spider(self,spider):
20        self.client.close()


首先,我们定义一个 MongoPipeline()存储类,里面定义了几个方法,简单进行一下说明:


from crawler() 是一个类方法,用 @class method 标识,这个方法的作用主要是用来获取我们在 settings.py 中设置的这几项参数:



1MONGO_URL = ‘localhost’
2MONGO_DB = ‘KuAn’
3ITEM_PIPELINES = {
4   ‘kuan.pipelines.MongoPipeline’: 300,
5}


open\_spider() 方法主要进行一些初始化操作 ,在 Spider 开启时,这个方法就会被调用 。


process\_item() 方法是最重要的方法,实现插入数据到 MongoDB 中。


![](https://img-blog.csdnimg.cn/20181227215522497.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3podXNvbmd6aXll,size_16,color_FFFFFF,t_70)


完成上述代码以后,输入下面一行命令就可以开始整个爬虫的抓取和存储过程了,单机跑的话,6000 个网页需要不少时间才能完成,保持耐心。



1scrapy crawl kuan


这里,还有两点补充:


第一,**为了减轻网站压力,我们最好在每个请求之间设置几秒延时**,可以在 KuanSpider() 方法开头出,加入以下几行代码:



1custom_settings = {
2        “DOWNLOAD_DELAY”: 3, # 延迟3s,默认是0,即不延迟
3        “CONCURRENT_REQUESTS_PER_DOMAIN”: 8 # 每秒默认并发8次,可适当降低
4    }


第二,为了更好监控爬虫程序运行,有必要 **设置输出日志文件**,可以通过 Python 自带的 logging 包实现:



1import logging
2
3logging.basicConfig(filename=‘kuan.log’,filemode=‘w’,level=logging.WARNING,format=‘%(asctime)s %(message)s’,datefmt=‘%Y/%m/%d %I:%M:%S %p’)
4logging.warning(“warn message”)
5logging.error(“error message”)


这里的 level 参数表示警告级别,严重程度从低到高分别是:DEBUG < INFO < WARNING < ERROR < CRITICAL,如果想日志文件不要记录太多内容,可以设置高一点的级别,这里设置为 WARNING,意味着只有 WARNING 级别以上的信息才会输出到日志中去。


**添加 datefmt 参数是为了在每条日志前面加具体的时间,这点很有用处。**


![](https://img-blog.csdnimg.cn/20181227215548349.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3podXNvbmd6aXll,size_16,color_FFFFFF,t_70)


以上,我们就完成了整个数据的抓取,有了数据我们就可以着手进行分析,不过这之前还需简单地对数据做一下清洗和处理。


### 3. 数据清洗处理


首先,我们从 MongoDB 中读取数据并转化为 DataFrame,然后查看一下数据的基本情况。



1def parse_kuan():
2    client = pymongo.MongoClient(host=‘localhost’, port=27017)
3    db = client[‘KuAn’]
4    collection = db[‘KuAnItem’]
5    # 将数据库数据转为DataFrame
6    data = pd.DataFrame(list(collection.find()))
7    print(data.head())
8    print(df.shape)
9    print(df.info())
10    print(df.describe())


 


![](https://img-blog.csdnimg.cn/20181227215033996.gif)


从 data.head() 输出的前 5 行数据中可以看到,除了 score 列是 float 格式以外,其他列都是 object 文本类型。


comment、download、follow、num\_score 这 5 列数据中部分行带有「万」字后缀,需要将字符去掉再转换为数值型;volume 体积列,则分别带有「M」和「K」后缀,为了统一大小,则需将「K」除以 1024,转换为 「M」体积。


整个数据一共有 6086 行 x 8 列,每列均没有缺失值。


df.describe() 方法对 score 列做了基本统计,可以看到,所有 App 的平均得分是 3.9 分(5 分制),最低得分 1.6 分,最高得分 4.8 分。


下面,我们将以上几列文本型数据转换为数值型数据,代码实现如下:



1def data_processing(df):
2#处理’comment’,‘download’,‘follow’,‘num_score’,‘volume’ 5列数据,将单位万转换为单位1,再转换为数值型
3    str = ‘_ori’
4    cols = [‘comment’,‘download’,‘follow’,‘num_score’,‘volume’]
5    for col in cols:
6        colori = col+str
7        df[colori] = df[col] # 复制保留原始列
8        if not (col == ‘volume’):
9            df[col] = clean_symbol(df,col)# 处理原始列生成新列
10        else:
11            df[col] = clean_symbol2(df,col)# 处理原始列生成新列
12
13    # 将download单独转换为万单位
14    df[‘download’] = df[‘download’].apply(lambda x:x/10000)
15    # 批量转为数值型
16    df = df.apply(pd.to_numeric,errors=‘ignore’)
17
18def clean_symbol(df,col):
19    # 将字符“万”替换为空
20    con = df[col].str.contains(‘万KaTeX parse error: Expected 'EOF', got '#' at position 185: …df,col): 26    #̲ 字符M替换为空 27    …’,‘’)
28    # 体积为K的除以 1024 转换为M
29    con = df[col].str.contains(‘K ′ ) 30      d f . l o c [ c o n , c o l ]   =   p d . t o n u m e r i c ( d f . l o c [ c o n , c o l ] . s t r . r e p l a c e ( ′ K ') 30    df.loc[con,col] = pd.to_numeric(df.loc[con,col].str.replace('K )30    df.loc[con,col] = pd.tonumeric(df.loc[con,col].str.replace(K’,‘’))/1024
31    df[col] = pd.to_numeric(df[col])
32    return df[col]


以上,就完成了几列文本型数据的转换,我们再来查看一下基本情况:


![](https://img-blog.csdnimg.cn/20181227215604122.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3podXNvbmd6aXll,size_16,color_FFFFFF,t_70)


download 列为 App 下载数量,**下载量最多的 App 有 5190 万次**,最少的为 0 (很少很少),平均下载次数为 14 万次;从中可以看出以下几点信息:


* volume 列为 App 体积,体积最大的 App 达到近 300M,体积最小的几乎为 0,平均体积在 18M 左右。
* comment 列为 App 评分,评分数最多的达到了 5 万多条,平均有 200 多条。


以上,就完成了基本的数据清洗处理过程,下面将对数据进行探索性分析。


### 4. 数据分析


我们主要从总体和分类两个维度对 App 下载量、评分、体积等指标进行分析。


#### 4.1. 总体情况


4.1.1. 下载量排名


首先来看一下 App 的下载量情况,很多时候我们下载一个 App ,下载量是一个非常重要的参考指标,由于绝大多数 App 的下载量都相对较少,直方图无法看出趋势,所以我们择将数据进行分段,离散化为柱状图,绘图工具采用的是 Pyecharts。


![](https://img-blog.csdnimg.cn/201812272150347.gif)


可以看到多达 5517 款(占总数 84%)App 的下载量不到 10 万, 而下载量超过 500 万的仅有 20 款,开发一个要想盈利的 App ,用户下载量尤为重要,从这一点来看,**大部分 App 的处境都比较尴尬,至少是在酷安平台上。**


代码实现如下:



1from pyecharts import Bar
2# 下载量分布
3bins = [0,10,100,500,10000]
4group_names = [‘<=10万’,‘10-100万’,‘100-500万’,‘>500万’]
5cats = pd.cut(df[‘download’],bins,labels=group_names) #  用 pd.cut() 方法进行分段
6cats = pd.value_counts(cats)
7bar = Bar(‘App 下载数量区间分布’,‘绝大部分 App 下载量低于 10 万’)
8# bar.use_theme(‘macarons’)
9bar.add(
10    ‘App 数量 (个)’,
11    list(cats.index),
12    list(cats.values),
13    is_label_show = True,
14    is_splitline_show = False,
15)
16bar.render(path=‘download_interval.png’,pixel_ration=1)


接下来,我们看看 **下载量最多的 20 款 App** 是哪些:


![](https://img-blog.csdnimg.cn/20181227215627588.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3podXNvbmd6aXll,size_16,color_FFFFFF,t_70)


可以看到,这里「酷安」App 以 5000 万+ 次的下载量遥遥领先,是第二名微信 2700 万下载量的近两倍,这么巨大的优势也很容易理解,毕竟是自家的 App,如果你手机上没有「酷安」,说明你还不算是一个真正的「搞机爱好者」,从图中我们还可以看出以下几点信息:


* TOP 20 款 App 中,很多都是装机必备,算是比较大众型的 App。
* 右侧 App 评分图中可以看到仅有  5 款 App 评分超过了 4 分(5 分制),绝大多数的评分都不到 3 分,甚至到不到 2 分,**到底是因为这些 App 开发者做不出好 App 还是根本不想做出来?**
* 相较于其他 App,**RE 管理器**、**绿色守护** 这几款非常突出,其中 RE 管理器在如此高的下载量下,仍然能够得到 4.8 分(最高分)并且体积只有几 M,实属难得,**什么是「良心 App」,这类就是**。


作为对比,我们再来看看下载量最少的 20 款 App。


![](https://img-blog.csdnimg.cn/20181227215707692.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3podXNvbmd6aXll,size_16,color_FFFFFF,t_70)


可以看到,与上面的那些下载量多的 App 相比,这些就相形见绌了,下载量最少的 「广州限行通」更是只有 **63 次下载**。


这也不奇怪,可能是 App 没有宣传、也可能是刚开发出来,这么少的下载量评分还不错,也还能继续更新,为这些开发者点赞。


其实,这类 App 不算囧,真正囧的应该是那些 **下载量很多、评分却低到不能再低** 的 App,给人的感觉是:「**我就这么烂爱咋咋地,有本事别用**」。


4.1.2. 评分排名


接下来,我们看看 App 的总体得分情况。这里,将得分分为了以下 4 个区间段,并且为不同分数定义了相应的等级。


![](https://img-blog.csdnimg.cn/20181227215852552.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3podXNvbmd6aXll,size_16,color_FFFFFF,t_70)


 


可以发现这么几点有意思的现象:


* **3 分以下的软件非常少,只占不到 10%**,而之前下载量最多的 20 款 APP 中,微信、QQ、淘宝、支付宝等大多数软件的得分都不到 3 分,**这就有点尴尬了。**
* 中品也就是中等得分的 App 数量最多。
* 4 分以上的 **高分 APP 数量占了近一半**(46%),可能是这些 App 的确还不错,也可能是由于评分数量过少,为了优中选优,后续有必要设置一定筛选门槛。


接下来,我们看看评分最高的 20 款 App 有哪些,很多时候我们下载 App 都是跟着「**哪个评分高,下载哪个**」这种感觉走。


![](https://img-blog.csdnimg.cn/20181227215912887.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3podXNvbmd6aXll,size_16,color_FFFFFF,t_70)


可以看到,评分最高的 20 个 App,它们都得到了 4.8 分 ,包括:RE 管理器(再次出现)、Pure 轻雨图标包等,还有一些不太常见,可能这些都是不错的 App,不过我们还需要结合看一下下载量,它们的下载量都在 1 万以上,有了一定的下载量,评分才算比较可靠,我们就能放心的下载下来体验一下了。


经过上面的总体分析,我们大致发现了一些不错的 App ,但还不够,所以接下来将进行细分并设置一定筛选条件。


#### 4.2. 分类情况


按照 App 功能和日常使用场景,将 App 分为以下 9 大类别,然后 **从每个类别中筛选出 20 款最棒的 App**。


![](https://img-blog.csdnimg.cn/20181227215938505.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3podXNvbmd6aXll,size_16,color_FFFFFF,t_70)


为了尽可能找出最好的 App,这里不妨设置 3 个条件:


* 评分不低于 4 分
* 下载量不低于 1 万
* 设置一个总分评价指标(总分 = 下载量 \* 评分),再标准化为满分 1000 分,作为 App 的排名参照指标。


经过评选之后,我们依次得到了各个类别下分数最高的 20 款 App,**这些 App 大部分的确是良心软件**。


4.2.1. 系统工具


系统工具包括了:输入法、文件管理 、系统清理、桌面、插件、锁屏等。


![](https://img-blog.csdnimg.cn/20181227215953310.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3podXNvbmd6aXll,size_16,color_FFFFFF,t_70)


可以看到,第一名是大名鼎鼎的老牌文件管理器「**RE 管理器**」,仅有 5 M 大小的它除了具备普通文件管理器的各项功能以外,最大的特点是能够卸载手机自带的 App,不过需要 Root。


「**ES 文件浏览器**」的文件分析器功能非常强大,能够有效清理臃肿的手机空间。


「**一个木函**」这款 App 就比较牛逼了,正如它的软件介绍「拥有很多,不如有我」所说,打开它你能发现它提供了好几十项实用功能,比如:翻译、以图搜图、快递查询、制作表情包等等。


再往下的「**Super SU**」、「**存储空间清理**」、「**镧**」、「**MT 管理器**」、「**My Android Tools**」都力荐,总之,这份榜单上的 App 可以说都值得进入你的手机 App 使用名单。


4.2.2. 社交聊天


![](https://img-blog.csdnimg.cn/20181227220018306.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3podXNvbmd6aXll,size_16,color_FFFFFF,t_70)


社交聊天类中, 「**Share 微博客户端**」位居第一,作为一款第三方客户端 App,它自然有比官方版本好的地方,比如相比正版 70M 的体积,它只有其十分之一大小,也几乎没有广告,还有额外强大的诸多功能,如果你爱刷微博,那么不妨尝试下这款「Share」。


「即刻」这款 App 也相当不错,再往下还能看到前阵子很火的「子弹短信」,宣称将要取代微信,看来短期内应该是做不到了。


你可能会发现,这份社交榜单上没有出现「知乎」、「豆瓣」、「简书」这类常见的 App,是因为它们的评分都比较低,分别只有 2.9分、3.5分和 2.9 分,自然进入不了这份名单,如果你一定想用它们,推荐去使用它们的第三方客户端或者历史版本。


4.2.3. 资讯阅读


![](https://img-blog.csdnimg.cn/2018122722004666.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3podXNvbmd6aXll,size_16,color_FFFFFF,t_70)


可以看到,在资讯阅读类中,「**静读天下**」牢牢占据了第一名,我之前专门写过一篇文章介绍它:[安卓最强阅读器](https://bbs.csdn.net/topics/618317507)。


同类别中的「多看阅读」、「追书神器」、「微信读书」也都进入了榜单。


另外,如果你经常为不知道去哪里下载电子书而头疼,那不妨试一下「**搜书大师**」、「**老子搜书**」。


4.2.4. 影音娱乐


![](https://img-blog.csdnimg.cn/20181227220107227.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3podXNvbmd6aXll,size_16,color_FFFFFF,t_70)


接下来是影音娱乐版块,网易家的「**网易云音乐**」毫无压力地占据头名,难得的大厂精品。




做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的Python干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。



别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。

我先来介绍一下这些东西怎么用,文末抱走。

* * *



**(1)Python所有方向的学习路线(新版)**

这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。



最近我才对这些路线做了一下新的更新,知识体系更全面了。



![在这里插入图片描述](https://img-blog.csdnimg.cn/8fc093dcfa1f476694c574db1242c05b.png)



**(2)Python学习视频**



包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。



![在这里插入图片描述](https://img-blog.csdnimg.cn/d66e3ad5592f4cdcb197de0dc0438ec5.png#pic_center)



**(3)100多个练手项目**

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。



![在这里插入图片描述](https://img-blog.csdnimg.cn/f5aeb4050ab547cf90b1a028d1aacb1d.png#pic_center)



**(4)200多本电子书**  

  

这些年我也收藏了很多电子书,大概200多本,有时候带实体书不方便的话,我就会去打开电子书看看,书籍可不一定比视频教程差,尤其是权威的技术书籍。



基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。



**(5)Python知识点汇总**

知识点汇总有点像学习路线,但与学习路线不同的点就在于,知识点汇总更为细致,里面包含了对具体知识点的简单说明,而我们的学习路线则更为抽象和简单,只是为了方便大家只是某个领域你应该学习哪些技术栈。



![在这里插入图片描述](https://img-blog.csdnimg.cn/c741a91b05a542ba9dc8abf2f2f4b1af.png)



**(6)其他资料**



还有其他的一些东西,比如说我自己出的Python入门图文类教程,没有电脑的时候用手机也可以学习知识,学会了理论之后再去敲代码实践验证,还有Python中文版的库资料、MySQL和HTML标签大全等等,这些都是可以送给粉丝们的东西。



![在这里插入图片描述](https://img-blog.csdnimg.cn/9fa77af248b84885a6ec779b2ead064d.png)

**这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。**




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里无偿获取](https://bbs.csdn.net/topics/618317507)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
  • 21
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
import re import subprocess import requests import json from pprint import pprint url = "https://www.bilibili.com/video/BV1fi4y1K7Na/?spm_id_from=333.1007.top_right_bar_window_default_collection.content.click&vd_source=4545a0e83c576b93b1abd0ca4e16ab4d" headers = { "referer": "https://www.bilibili.com/", "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36", "cookie":"i-wanna-go-back=-1; _uuid=C106610D104-6D27-6584-66E1-FCDE2859156A75277infoc; FEED_LIVE_VERSION=V8; home_feed_column=5; buvid3=D2AE610A6-6EE7-B48E-10C51-9E8269B10C88776898infoc; header_theme_version=CLOSE; DedeUserID=1852701166; DedeUserID__ckMd5=ac9474243bdd3627; nostalgia_conf=-1; CURRENT_PID=e16a0380-e1cd-11ed-a872-2f97008834b2; rpdid=|(k|k~u|)RY)0J'uY)kkl|m)m; b_ut=5; browser_resolution=1482-792; CURRENT_BLACKGAP=0; buvid_fp_plain=undefined; CURRENT_FNVAL=4048; b_nut=1683881044; hit-new-style-dyn=1; hit-dyn-v2=1; SESSDATA=3e3851ea%2C1704423625%2C1959b%2A72SteLEoaNhz8Q6ifKiYFGRpSBjpMp2TG-QWAao2iv2yR5ci81QOokmXevCx102rLpwUc9qgAAQgA; bili_jct=2ea1af9f8ae6f19867c8cd3dc1bfd047; fingerprint=dd5c1878758a4b317420b66dad49b677; b_lsid=97F1E5C5_1894440C9F1; buvid4=9D5A25A5-A648-0805-4C59-8178C4E4362B31067-023042319-0THAXXn9jKfRyf3rDh/fQA%3D%3D; buvid_fp=dd5c1878758a4b317420b66dad49b677; sid=7i4lnopc; bp_video_offset_1852701166=817021346575810700; PVID=1" } response = requests.get(url, headers=headers) name = re.findall('"title":"(.*?)"',response.text)[0].replace(' ','') html_data = re.findall('<script>window.__playinfo__=(.*?)</script>',response.text)[0] json_data = json.loads(html_data) #print(name) # print(html_data) # print(json_data) # pprint(json_data) audio_url = json_data['data']['dash']['audio'][0]['baseUrl'] video_url = json_data['data']['dash']['video'][0]['baseUrl'] # print(audio_url) # print(video_url) audio_content = requests.get(url=audio_url,headers=headers).content video_content = requests.get(url=video_url,headers=headers).content with open("D:\\study\\B站\\素材\\" + name + ".mp3", mode="wb") as audio: audio.write(audio_content) with open("D:\\study\\B站\\素材\\" + name + ".mp4", mode="wb") as video: video.write(video_content) cmd = f'ffmpeg -i D:\\study\\B站\\素材\\{name}.mp4 -i D:\\study\\B站\\素材\\{name}.mp3 -c:a aac -strict experimental D:\\study\\B站\\视频1080P\\{name}output.mp4' subprocess.run(cmd)
07-13

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值