【Python爬虫】Python爬取喜马拉雅,爬虫教程!

一、思路设计

  (1)分析网页

    

    在喜马拉雅主页找到自己想要的音频,得到目标URL:https://www.ximalaya.com/qinggan/321787/

    

  通过分析页面的网络抓包,最终的到一个比较有用的json数据包

  通过分析,得到了发送json数据包的一个有用的API接口:https://www.ximalaya.com/revision/play/album?albumId=321787&pageNum=2

  其中album为主播的ID在页面url中有显示,pageNum为json数据包的“页数”。每个json数据包有30个json数据

  (2)设计代码

    向服务器发送请求 ---->  得到json数据包 ----> 分析json数据包 ----> 提取json数据包中的有用数据 ----> 存储到本地MongoDB数据库

二、代码实例

   代码共分为两部分,执行脚本(ximalaya.py)和配置文件(config_ximalaya.py)

    ximalaya.py

 1 # -*- coding:utf-8; -*-2 # Author : Bingnan Huo3 # Create : 2018-12-064 import os5 import time6 import json7 import requests8 9 from threading import Thread
10 from datetime import datetime
11 from pymongo import MongoClient
12 from config_xiamalaya import *
13 
14 def getWorkTimeNow(): 
15     '''Acquire work time '''
16     t = datetime.now()
17     year = t.year
18     month = t.month
19     day = t.day
20     hour = t.hour
21     minute = t.minute
22     time_str = "[%s-%s-%s-%s:%s]"%(str(year),
23                        str(month),
24                        str(day),
25                        str(hour),
26                        str(minute)
27                        )
28     return time_str
29 
30 def getJsonData(userID,page):
31     '''Get target server json data'''
32     count = 0
33     pa = {"albumId":userID,"pageNum":page}
34     while(ERROR):
35         if count > 10:
36             return False
37         try:
38             ret = requests.get(url=INDEXURL,params=pa,headers=HEADERS,timeout=30,verify=True,proxies=None)
39             ret.raise_for_status()
40         except Exception as e:
41             count += 1
42             print(getWorkTimeNow(),end='')
43             print(" [INFO] Retry...")
44             continue
45         else:
46             ret.encoding = ret.apparent_encoding
47             return ret.text
48 
49 def analyseJsonData(jsonData):
50     '''Analyse json data and save into MongoDB'''
51     if jsonData:
52         client = MongoClient()
53         print(getWorkTimeNow() + " [INFO] Connected to MongoDB!")
54         db = client.ximalaya# Create DataBase
55         print(getWorkTimeNow() + " [INFO] Create new database!")
56         table = getattr(db,TABLENAME)# Create Table
57         print(getWorkTimeNow() + " [INFO] Create new table --> %s" %(TABLENAME))
58         dict_obj = json.loads(jsonData)
59         data = dict_obj["data"]# Json attr data
60         content = data["tracksAudioPlay"]# json content
61         for i in content:
62             tmp_dict = {'序号':None,'名称':None,'Url':None,'源':None,'状态':False,'时长':None,}
63             tmp_dict['序号'] = i['index']
64             tmp_dict['名称'] = i['trackName']
65             tmp_dict['Url'] = "https://www.ximalaya.com" + i['trackUrl']
66             tmp_dict['源'] = i['src']
67             if i['isPaid']:
68                 tmp_dict['状态'] = True
69             tmp_dict['时长'] = i['duration']
70             table.insert_one(tmp_dict)
71             print(getWorkTimeNow() + " [INFO] Insert one data!")
72         
73 
74 def DBStart(dbpath):
75     '''start MongoDB client'''
76     status = os.system("start mongod --dbpath " + dbpath)
77     if not status:
78         print(getWorkTimeNow() + " [INFO] DataBase start!")
79         return True
80     else:
81         print(getWorkTimeNow() + " [INFO] DataBase Failed...")
82         return False
83 def execute(user_id,page):
84     json_data = getJsonData(user_id, page)
85     analyseJsonData(json_data) 
86 
87 def main():
88     DBStart(DBPATH)
89     for page in PAGECONTIANER:
90         execute(USERID, str(page))
91         
92   
93     
94 
95 if __name__ == "__main__":
96     main()

    config_ximalaya.py

 1 # -*- coding:utf-8 -*-2 # ximalaya.py -- config3 import time4 5 def getUnixTime():6     t = time.time()7     return str(int(t))8 9 
10 
11 INDEXURL = " https://www.ximalaya.com/revision/play/album"
12 
13 ERROR = True
14 
15 HEADERS = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0",
16           
17            
18           }
19 """
20 Cookie:x_xmly_traffic=utm_source%253A%2526utm_medium%253A%2526utm_campaign%253A%2526utm_content%253A%2526utm_term%253A%2526utm_from%253A; 
21 device_id=xm_1544076474056_jpc79kg8f1h3u6; 
22 Hm_lvt_4a7d8ec50cfd6af753c4f8aee3425070=1544076479; 
23 Hm_lpvt_4a7d8ec50cfd6af753c4f8aee3425070=1544076479
24 API : https://www.ximalaya.com/revision/play/album?albumId=321787&pageNum=1
25 
26 """
27 COOKIE = {"x_xmly_traffic":"utm_source%253A%2526utm_medium%253A%2526utm_campaign%253A%2526utm_content%253A%2526utm_term%253A%2526utm_from%253A",
28           "device_id":"xm_1544076474056_jpc79kg8f1h3u6",
29           "Hm_lvt_4a7d8ec50cfd6af753c4f8aee3425070":getUnixTime(),
30           "Hm_lpvt_4a7d8ec50cfd6af753c4f8aee3425070":getUnixTime()
31           }
32 
33 DBPATH = "D:\\MongoDB\\data\\db"
34 
35 TABLENAME = "Test_321787_02"
36 
37 PAGECONTIANER = [i for i in range(1,10)]
38 
39 USERID = "321787"

三、执行结果

  最终的数据插入到了本地的MongoDB数据库

  

  由于MongoDB为NoSQL型数据库,该数据库采用BOSN数据类型(json加强版)进行存储

  在RoboMongo中也可以用MySQL数据库的表形式进行显示

  

最后:如果你对Python感兴趣,想要学习Python,希望可以帮到你,一起加油!以上是给大家分享的Python全套学习资料,都是我自己学习时整理的:

一、Python所有方向的学习路线

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

图片

图片

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,还有环境配置的教程,给大家节省了很多时间。

图片

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

图片

四、入门学习视频全套

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

图片

图片

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

图片

图片

 **学习资源已打包,需要的小伙伴可以戳这里:【学习资料】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/38005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker部署前端,配置域名和ssl

之前使用80端口部署前端项目后,可以使用IP端口号在公网访问到部署的项目。 进行ICP域名备案后,可以通过域名解析将IP套壳,访问域名直接访问到部署的项目~ 如果使用http协议可以很容易实现这个需求,对nginx.conf文件进行修改&#…

Spring Boot集成DeepLearning4j实现图片数字识别

1.什么是DeepLearning4j? DeepLearning4J(DL4J)是一套基于Java语言的神经网络工具包,可以构建、定型和部署神经网络。DL4J与Hadoop和Spark集成,支持分布式CPU和GPU,为商业环境(而非研究工具目的…

《昇思25天学习打卡营第28天 | 昇思MindSporeVision Transformer图像分类》

第28天 本节学习了Vision Transformer图像分类 ViT则是自然语言处理和计算机视觉两个领域的融合结晶。在不依赖卷积操作的情况下,依然可以在图像分类任务上达到很好的效果。ViT模型的主体结构是基于Transformer模型的Encoder部分(部分结构顺序有调整&a…

Mojo: AI开发的革命性编程语言

------------->更多内容&#xff0c;请移步“鲁班秘笈”&#xff01;&#xff01;<------------- 刚刚Mojo和HuggingFace一样发布新版本&#xff0c;此版本编号为24.4&#xff0c;包括几个核心语言和标准库增强功能。此版本最大的亮点之一是收到了来自18个社区贡献者的21…

Docker Desktop安装mysql

安装 Docker Desktop 1、访问 Docker Desktop 官方下载地址&#xff1a;https://www.docker.com/products/docker-desktop/ &#xff0c; 选择对应平台的 Docker Desktop 安装包点击下载&#xff1a; 2、下载成功后&#xff0c;双击开始安装&#xff1a; 3、安装之前的相关配…

产品经理-对产品经理的认识(1)

今天跟大家聊一下产品经理这个岗位的,产品经理是互联网岗位当中比较火的一个岗位,也是最接近CEO的岗位 产品经理岗位&#xff0c;技术门槛低&#xff0c;薪水和前景都很不错&#xff0c;又处于团队的核心位置 产品经理岗位没有完全相关的专业设置和清晰的学习路径&#xff0c;绝…

java框架的落地实践案例:大数据平台设计与实现

使用 java 框架设计和实现大数据平台可为企业提供数据处理和分析解决方案&#xff0c;使之能够做出数据驱动的决策。系统采用微服务架构&#xff0c;分解数据处理任务为松散耦合组件&#xff0c;构建于 spring boot 等 java 框架之上。数据采集通过kafka 进行&#xff0c;数据清…

Rust借助dotenv库读取环境变量

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

(亲测有效)2024代替电视家的app,电视家停了还有什么软件可以看电视?

嘿&#xff0c;大家好&#xff0c;我是阿星&#xff0c;今天又来跟大家聊聊那些让人眼前一亮的电视直播软件。咱们这回不聊那些老掉牙的&#xff0c;来点新鲜的&#xff0c;让咱们的电视屏幕也能跟上潮流&#xff0c;享受一下科技带来的便利和乐趣。 首先&#xff0c;得提一提…

如何评价CSS框架TailwindCSS?

端午三天&#xff0c;你们在放假&#xff0c;而我&#xff0c;一个人躲在家里&#xff0c;苦练 tailwindcss。 我在准备这样一个学习项目&#xff0c;它与传统的文章/视频类学习不同&#xff0c;我会在教程中内置大量的可交互案例&#xff0c;提供沉浸式的学习体验&#xff0c…

Zynq7000系列FPGA中DMA引擎编程指南

DMA引擎的编程指南通常涉及一系列步骤和API调用&#xff0c;以确保数据在内存之间的高效传输&#xff0c;而无需CPU的直接干预。 DMA引擎的编程指南包括以下部分&#xff1a; 一、编写微代码为AXI事务编写CCRx程序 通道微码用于设置dmac.CCRx寄存器以定义AXI事务的属性。这是…

TikTok直播限流与网络的关系及解决方法

TikTok作为一款热门的社交平台&#xff0c;其直播功能吸引了大量用户。然而&#xff0c;一些用户可能会遇到TikTok直播限流的问题&#xff0c;例如直播过程中出现播放量低、直播画面质量差等情况。那么&#xff0c;TikTok直播限流与所使用的网络线路是否有关系&#xff1f;是否…

学习springIOC

第二章 Spring IOC 章节内容 Spring IOC技术实现Spring IOC设值注入Spring IOC构造注入 章节目标 掌握Spring IOC技术实现掌握Spring IOC设置注入掌握Spring IOC构造注入 第一节 Spring简介 1. Spring 简介 Spring 是目前主流的 Java 开发框架&#xff0c;是 Java 世界最…

Android实现手写输入

android应用开发中有时会有手写输入需求&#xff0c;非通过系统键盘手写功能&#xff0c;比如自定义键盘&#xff0c;这时就需要自己来实现&#xff0c;一般有两种场景&#xff1a;一种是类似手写签名保存&#xff1b;另一种是真正的手写输入&#xff0c;需要将笔迹识别成正确的…

JTracker IDEA 中最好的 MyBatis 日志格式化插件

前言 如果你使用 MyBatis ORM 框架&#xff0c;那么你应该用过 MyBatis Log 格式化插件&#xff0c;它可以让我们的程序输出的日志更人性化。 但是有一个问题&#xff0c;通常我们只能看到格式化后的效果&#xff0c;没办法知道这个 SQL 是谁执行的以及调用的链路。 如下图所…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑复合指标优化模态分解和 Stacking 集成的综合能源系统多元负荷预测》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

【stm32】大一上学期笔记复制

砌墙单片机 外设是什么&#xff1f; ipage 8 nx轴 128 X0-127 y0-63 PWM脉冲宽度调制 PWM脉冲宽度调制 2023年10月13日 基本特性&#xff1a;脉冲宽度调制PWM是一种对模拟信号进行数字编码的方法。广泛引用于电机控制&#xff0c;灯光的亮度调节&#xff0c;功率控制等领域…

赶紧收藏!全网最佳WebSocket封装:完美支持断网重连,自动心跳!

文章目录 一、WebSocket封装库简介二、库的安装与配置2.1 安装2.2 初始化 三、功能详解3.1 断网重连3.2 自动心跳3.3 消息队列3.4 事件管理 四、示例代码五、总结 &#x1f389;欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&…

Windows Server 2019部署网络负载均衡NLB服务的详细操作步骤

部署前准备 首先需要准备两台Windows Server 2019服务器&#xff0c;虚拟机创建请参考 VMware Workstation安装Windows Server2019系统详细操作步骤_安装windows server 2019操作系统(写出操作过程)-CSDN博客 克隆虚拟机请参考 VMware Workstation克隆虚拟机详细步骤-CSDN博…

超详细的 C++中的封装继承和多态的知识总结<2.多态>

引言 小伙伴们我们都知道了&#xff0c;什么是封装和继承&#xff0c;在有了这个的基础上我们接着来看什么是多态。多态从字面上意思我们就可以知道&#xff0c;大概就是一个函数的不同形态&#xff0c;而且&#xff0c;前边我们在学习函数重载的时候我们已经简单的了解了如何用…