【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 Huo
 3 # Create : 2018-12-06
 4 import os
 5 import time
 6 import json
 7 import requests
 8 
 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 -- config
 3 import time
 4 
 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电子书

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

图片

四、入门学习视频全套

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

图片

图片

五、实战案例

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

图片

图片

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python海量数据处理脚本大集合:pyWhat

pyWhat:精简海联数据,直达数据弱点要害- 精选真开源,释放新价值。 概览 pyWhat是Github社区上一款比较实用的开源Python脚本工具。它能够快速提取信息中的 IP 地址、邮箱、信用卡、数字货币钱包地址、YouTube 视频等内容。当你遇到了一串莫名…

elementUI 年份范围选择器实现

elementUI 不支持年份范围的选择器,依照下面的文章进行修改和完善 el-year-picker; element日期选择范围、选择年份范围_elemet 两个日期 选择的年份范围必须在三年之内-CSDN博客 el-year-picker 组件: 依赖包:moment 属性&…

赛灵思FFT的IP核——非实时模式 Non real time

一、IP核配置 使用非实时模式配置如下 二、时序 三、资源消耗 在implement查看两者的资源消耗差不多

怎么测试远程服务器能否连通

远程服务器连接测试的方法很多,下面简单介绍下其中两种方法。 ping命令 按WINR快截键,打开“运行”对话框,输入cmd,回车,打开命令提示符。 输入ping IP地址或ping 域名即可,如ping360服务器通不通&#xf…

前端接入chatgpt,实现流式文字的显示

前端接入chatgpt,实现流式文字的显示 业务需求: 项目需要接入chatgpt提供的api,后端返回流式的字符,前端接收并实时显示。 相关技术原理: 1. JS中的Stream流: 在JavaScript中,使用Stream流通常指的是处理数据流的…

RK3568驱动指南|第十五篇 I2C-第172章 I2C 驱动框架编写

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

吃瓜Llama3-V之余,看多模态大模型架构演变!

今天最大的瓜莫过于:斯坦福 Llama3-V PK 清华 MiniCPM-Llama3-V-2.5,详细证据: https://github.com/OpenBMB/MiniCPM-V/issues/196吃瓜之余,来看一下多模态大模型架构演变! 一篇优秀的论文综述了多模态AI架构——包含…

无线领夹麦克风哪个牌子好,口碑最好的麦克风品牌推荐!

自媒体的兴起极大地推动了音频设备技术的发展,尤其是麦克风,它已成为自媒体创作中不可或缺的工具。从早期的新闻采访到当下流行的网络直播和Vlog,麦克风的应用场景不断扩展。一个视频的音频质量直接影响观众的观看体验,因此&#…

使用Netty框架实现WebSocket服务端与客户端通信(附ssl)

仓库地址: https://gitee.com/lfw1024/netty-websocket 导入后可直接运行 预览页面 自签证书: #换成自己的本地ip keytool -genkey -alias server -keyalg RSA -validity 3650 -keystore D:\mystore.jks -ext sanip:192.168.3.7,ip:127.0.0.1,dns:lo…

【存储】相关内容

【存储】相关内容 1. 存储类型1. 块存储2. 文件存储3. 对象存储4. 三种存储类型对比 2. 常见的存储分类1. DAS2. SAN3. NAS4. 存储分类分析比较 3. 一些存储的概念1. LUN2. volume3. HBA4. iSCSI 1. 存储类型 块存储和文件存储是我们比较熟悉的两种主流的存储类型,…

《昇思25天学习打卡营第21天 | 昇思MindSporePix2Pix实现图像转换》

21天 本节学习了通过Pix2Pix实现图像转换。 Pix2Pix是基于条件生成对抗网络(cGAN)实现的一种深度学习图像转换模型。可以实现语义/标签到真实图片、灰度图到彩色图、航空图到地图、白天到黑夜、线稿图到实物图的转换。Pix2Pix是将cGAN应用于有监督的图…

JavaSE--基础语法--类和对象(第二期)

(一).面向对象的初步认知 1.1什么是面向对象? Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象…

新手使用超市收银系统应该注意哪些问题?

大部分小型超市都没怎么使用过智能收银系统,都是采用的传统手工收银方式,盘点、进货、库存也都是靠手工记录,完全没有接触过智能收银系统带来的优势和便利。超市收银软件特别是小区里面的超市,就跟传统的夫妻便利店的营销模式差不…

教育心理学期末考试重点

人本主义学习理论 人本主义主张,心理学应当把人作为一个整体来研究,而不是将人的心理肢解为不完整的几个部分,应该研究正常的人,而且更应该关注人的高级心理活动,如热情、信念、生命、尊严等内容。人本主义的学习理论…

【C++】使用C++在线程中动态记录数据到外部文件

在现代软件开发中,多线程编程已成为处理并发任务、提高程序性能的重要手段。而在多线程环境下,如何有效地管理和记录数据,尤其是将动态生成的数据安全地写入外部文件,是许多应用程序必须面对的问题。本文将深入探讨如何在C中使用多…

【运维】Windows server 2022 开启 telnet 功能

控制面板》启动或关闭Windows 功能 仪表盘》添加角色和功能》功能》telnet客户端

python-糖果俱乐部(赛氪OJ)

[题目描述] 为了庆祝“华为杯”的举办,校园中开展了许多有趣的热身小活动。小理听到这个消息非常激动,他赶忙去参加了糖果俱乐部的活动。 该活动的规则是这样的:摊位上有 n 堆糖果,第 i 堆糖果有 ai​ 个,参与的同学可…

全平台7合一自定义小程序源码系统功能强大 前后端分离 带完整的安装代码包以及搭建教程

系统概述 这款全平台 7 合一自定义小程序源码系统是专为满足各种业务需求而设计的。它整合了多种功能,能够在不同平台上运行,为用户提供了全方位的体验。无论你是企业主、开发者还是创业者,这款系统都能为你提供强大的支持。 代码示例 系统…

MATLAB code 生成C代码样式

Matlab code 生成C代码需要以下产品: MATLABMATLAB CoderC 编译器 MATLAB Coder 将查找并使用支持的已安装编译器。 可以使用 mex -setup 更改默认编译器。 在本地工作文件夹中创建文件 创建一个本地工作文件夹,例如 c:\ecoder\work。创建包含以下代…

【Python】Python的安装与环境搭建

个人主页:【😊个人主页】 系列专栏:【❤️Python】 文章目录 前言Python下载环境配置测试环境变量是否配置成功配置环境变量 运行Python交互式解释器:命令行脚本集成开发环境(IDE:Integrated Development E…