本次爬取内容为虾米排行的100歌曲,保存歌曲本身,只需要获取歌曲名称和下载链接即可,解析页面无难度可言,比较困难的是对data-mp3的解密。解密参考

爬取过程
本次爬取过程就很简单了。获取页面 -- 解析页面 -- 解密链接 -- 保存数据。需要注意的地方时保存MP3文件的时候命名后缀需要指明为.mp3
,否则下载文件需要指定文件类型后才能被识别。还有就是因为网络问题引起的程序抛锚,通过设置无头浏览器、模拟滚动页面(随机间隔时间)、逐条保存数据能够很大程度上解决网络引起的问题。
import json
import random
import time
import requests
from lxml import etree
from selenium import webdriver
from kaisa import dataMp3
# 无头浏览器
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
# 启动浏览器
browser = webdriver.Chrome(chrome_options=chrome_options)
def get_html(url):
browser.get(url)
# 网速不好的时候使用延长加载时间
# # 随机等待时间
# t = random.randint(0, 9)
# # 分六次滚动页面
# for i in range(6):
# str_js = 'var step = document.body.scrollHeight/6;window.scrollTo(0,step*%d)' % (i + 1)
# browser.execute_script(str_js)
# time.sleep(t)
page_source = browser.page_source
return page_source
def download(name, path):
items = []
for i in range(len(name)):
item = {}
# item_name = name[i]
# item_path = dataMp3(path[i])
item['name'] = name[i]
real_path = dataMp3(path[i])
item['path'] = real_path
items.append(item)
# 将下载到本地的代码
# filename = "./download/%s.mp3" % item_name
# r = requests.get(item_path)
# with open(filename, "wb") as f:
# f.write(r.content)
# 网速不好逐条添加
# music_json = json.dumps(item, ensure_ascii=False, check_circular=True)
# filename = './虾米Top100'
# with open(filename, "a", encoding='utf-8') as f:
# f.write(music_json)
music_json = json.dumps(items, ensure_ascii=False, check_circular=True)
filename = './虾米Top100'
with open(filename, "w", encoding='utf-8') as f:
f.write(music_json)
def parse_html(page_source):
# print(page_source)
etree_html = etree.HTML(page_source)
name = etree_html.xpath('//div[@id="chart"]/table/tr/@data-title')
# print(name)
path = etree_html.xpath('//div[@id="chart"]/table/tr/@data-mp3')
# print(path)
download(name, path)
def main():
url = 'https://www.xiami.com/chart'
page_source = get_html(url)
parse_html(page_source)
if __name__ == '__main__':
main()
总结:
网速是制约爬虫的重大因素。掌握一些解决该因素引起的问题是很有意义的。还有对data-mp3的解密让我对凯撒密码有了新的认识。。。以前就只是以为那玩意是字母错位,后来发现错位——还能这么错。
网友评论