long blogs

进一步有进一步惊喜


  • Home
  • Archive
  • Tags
  •  

© 2025 long

Theme Typography by Makito

Proudly published with Hexo

酷狗音乐排行爬虫

Posted at 2019-03-14 爬虫 Python 

一、分析

地址规律:

https://www.kugou.com/yy/rank/home/1-8888.html

https://www.kugou.com/yy/rank/home/2-8888.html

https://www.kugou.com/yy/rank/home/3-8888.html

规律:相差的只有1-2-3,榜单从1-66

二、需要爬取的信息

1、排名

2、歌名

3、时长

三、爬取策略

1、先将第一页的源码下载下来,生成测试文件
2、获取测试文件的各项元素,能够准确提取网页中的元素,得到的数据写入文件中
2-1 提取元素,确定函数
2-2 写入数据
3、生成爬取的页面URL数组
4、联网爬取,设置时间间隔为2+RANDOM(),避免被禁
5、爬取完成

四、代码文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# encoding=utf-8
# coding=utf-8
# 引入包
import requests
from bs4 import BeautifulSoup
import time
import random
header = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/71.0.3578.98 Safari/537.36'
}


# 获得头文件,随机生成
def get_header():

return header


# 打开测试文件,模拟用的
def open_test_file(file_url):
file = open(file_url, 'r', encoding='utf-8')
return file.read()


# 打开网页,获得网页数据
def get_web_content(url):
res = requests.get(url, headers=get_header())
return res.text


# 分析测试文件,获得相应的数据
# 数据格式:排名 歌名 时长
def analyze(txt):
# 变量区
soup = BeautifulSoup(txt, 'html.parser')
redata = []
# 选择器 #rankWrap > div.pc_temp_songlist > ul >li
datas = soup.select('#rankWrap > div.pc_temp_songlist > ul > li')

# 解析list数据
for data in datas:
# 获取排名
if data.find('strong') != None:
num = data.find('strong').string # 前三名加粗的处理
else:
num = data.find('span', 'pc_temp_num').string.strip() # 排名
# print("%r" % num)
# 获取歌名
songname = data.find('a', 'pc_temp_songname').string.strip()

# 获取时间
song_time = data.find('span', 'pc_temp_time').string.strip()

# 生成数据redata
temp_data = num + "----" + songname + "----" + song_time
# print(temp_data)
redata.append(temp_data)
return redata


# 写回数据
def write_data(datas):
f = open('song.txt', 'a', encoding='utf-8') # 文件追加写入
for data in datas:
f.write(data + '\n')
f.close()
print("写入成功!")


# 单页爬取内容
def crawl_page(pageurl):
txt = get_web_content(pageurl)
datas = analyze(txt)
write_data(datas)
print("爬取成功")


# 函数入口,开始爬取
def start():
# 生成爬取页面数组
pages = ['https://www.kugou.com/yy/rank/home/{}-8888.html'.format(number)
for number in range(1, 24)]
# print(pages)
for pageurl in pages:
print(pageurl)
crawl_page(pageurl)
time.sleep(2+random.random()) # 暂停避免过快


# 调用开始函数开始爬取
start()

# 测试
# txt = open_test_file('test2.html')
# print(txt)
# datas = analyze(txt)
# write_data(datas)

# print(random.random())

爬取结果:

收获:

  • 1、关于编码问题 写入文件的时候请使用open(xxx,x,encoding=’utf-8’)这样写入的时候才不会出现错误

Share 

 Previous post: Javascript笔记 Next post: hexo 基本用法 

© 2025 long

Theme Typography by Makito

Proudly published with Hexo