美文网首页web服务器
Spider_xiamiTop100

Spider_xiamiTop100

作者: GHope | 来源:发表于2018-11-05 19:29 被阅读20次

本次爬取内容为虾米排行的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的解密让我对凯撒密码有了新的认识。。。以前就只是以为那玩意是字母错位,后来发现错位——还能这么错。

GitHub地址

相关文章

  • Spider_xiamiTop100

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

网友评论

    本文标题:Spider_xiamiTop100

    本文链接:https://www.haomeiwen.com/subject/bshqtqtx.html