您的位置:首页 > 编程语言 > Python开发

python爬虫——爬取喜马拉雅app

weixin_44024393 2019-06-14 12:53 176 查看 https://blog.csdn.net/weixin_4

主要爬取喜马拉雅悬疑栏目的小说名字,演播者以及简介,先上爬取的数据图。

1. 此次抓取使用fiddler抓包,喜马拉雅的抓包很简单,这里就不多阐述。

通过对比两条的url可以发现只有ts-时间戳和pageId不同,其他的都没变化,因此可以知道,改变pageId就可以实现翻页。另外最上面的url是我去除一些不必要的参数,其没有影响。
2. 分析数据

小说是存储在列表当中的,所以需要先取出这个列表,再遍历获取小说的信息。

# 访问的url
url = 'http://mobile.ximalaya.com/mobile/discovery/v2/category/metadata/albums?categoryId=49&device=android' \
'&keywordId=232&metadatas=&operator=2&pageId=1&pageSize=20&scale=1&version=6.5.87'
# 请求url获得返回的数据是json格式
resp = requests.get(url, headers=headers).json()
# 获取数据存储的列表
datas = resp.get('list')
# 判断列表是否不为空
if datas:
for data in datas:
# 声明一个字典存储数据
data_dict = {}
# 获取演播者的名字
nickname = data.get('nickname')
# 获取小说的名字
title = data.get('title')
# 获取小说简介
trackTitle = data.get('trackTitle')

data_dict['nickname'] = nickname
data_dict['title'] = title
data_dict['trackTitle'] = trackTitle
print(data_dict)

3. 然后便是将数据保存,data_list是全局变量,详细请看后面的全代码

# 将数据保存为json文件
with open('data_json.json', 'w', encoding='utf-8') as f:
json.dump(data_list, f, ensure_ascii=False, indent=4)
print('json文件保存成功')

# 将数据保存为csv文件
# 表头
title = data_list[0].keys()
with open('data_csv.csv', 'w', encoding='utf-8', newline='') as f:
writer = csv.DictWriter(f, title)
# 写入表头
writer.writeheader()
# 批量写入数据
writer.writerows(data_list)
print('csv文件保存成功')

4. 全部代码附上

import requests
import csv
import json

# 构建请求头
headers = {
'Accept': '*/*',
'user-agent': 'ting_6.5.87(HRY-AL00T,Android28)',
'Host': 'mobwsa.ximalaya.com',
'Connection': 'Keep-Alive',
'Accept-Encoding': 'gzip'

}

# 声明一个列表存储字典
data_list = []

# 请求url并获取数据函数
def get_index():
page = 1
while True:
# 访问的url
url = 'http://mobile.ximalaya.com/mobile/discovery/v2/category/metadata/albums?categoryId=49&device=android' \
'&keywordId=232&metadatas=&operator=2&pageId={}&pageSize=20&scale=1&version=6.5.87'.format(page)
# 请求url获得返回的数据是json格式
resp = requests.get(url, headers=headers).json()
# 获取数据存储的列表
datas = resp.get('list')
if datas:
get_info(datas)
else:
break
page += 1

# 获取想要数据函数
def get_info(datas):

for data in datas:
# 声明一个字典存储数据
data_dict = {}
# 获取演播者的名字
nickname = data.get('nickname')
# 获取小说的名字
title = data.get('title')
# 获取小说简介
trackTitle = data.get('trackTitle')

data_dict['nickname'] = nickname
data_dict['title'] = title
data_dict['trackTitle'] = trackTitle

data_list.append(data_dict)
print(data_dict)

# 保存文件函数
def save_file():
# 将数据保存为json文件
with open('data_json.json', 'w', encoding='utf-8') as f:
json.dump(data_list, f, ensure_ascii=False, indent=4)
print('json文件保存成功')

# 将数据保存为csv文件
# 表头
title = data_list[0].keys()
with open('data_csv.csv', 'w', encoding='utf-8', newline='') as f:
writer = csv.DictWriter(f, title)
# 写入表头
writer.writeheader()
# 批量写入数据
writer.writerows(data_list)
print('csv文件保存成功')
def main():
get_index()
save_file()

if __name__ == '__main__':
main()
标签: