使用Python抓取网易云音乐所有歌手信息

本文介绍如何使用Python通过requests和lxml库抓取网易云音乐中所有歌手的详细信息,包括歌手ID、名字、分类和主页链接。在抓取过程中,通过并发处理提高效率,并讨论了可能遇到的问题,如IP被禁导致的503错误。最终成功获取到超过3万条歌手数据。

思路

1. 构造请求页面的URL

每个页面由歌手分类和歌手名字的大写字母值构成,比如,”http://music.163.com/discover/artist/cat?id=1001&initial=65“,就是请求华语男歌手,字母为”A”的所有歌手

2. 请求数据

请求数据使用的是requests包,当请求的网址没有错误并且status_code为200时,返回网页的内容。

注意:这里并没改变请求的headers,也没有使用代理

3. 解析数据

使用lxml包进行html解析,抓取包括歌手id,name,cat,userhome四个信息

4. 存储到MongoDB

存储时将歌手id作为数据表的’_id’,由于歌手id唯一性,可以防止数据库中的文档重复插入

import requests
from requests.exceptions import RequestException
from lxml import etree
from pymongo import MongoClient
from concurrent import futures

CATS = {
            '1001': '华语男歌手',
            '1002': '华语女歌手',
            '1003': '华语组合/乐队',
            '2001': '欧美男歌手',
            '2002': '欧美女歌手',
            '2003': '欧美乐队/组合',
            '6001': '日本男歌手',
            '6002': '日本女歌手',
            '6003': '日本乐队/组合',
            '7001': '韩国男歌手',
            '7002': '韩国女歌手',
            '7003': '韩国乐队/组合',
            '4001': '其他男歌手',
            '4002': '其他女歌手',
            '4003': '其他乐队/组合'
        }

def get_artists(args):
    '''
    根据不同参数请求不同页面,并返回歌手信息
    :param args: 
    :return: 
    '''
    url = 'http://music.163.com/discover/artist/cat?id={}&initial={}'.format(args[0],args[1])
    result = fetch(url)
    if result is not None:
        artists = parse(result,args[0])
    return artists

def fetch(url):
    '''
    请求连接,成功时(200)返回页面内容
    :param url: 
    :return: 
    '''
    try:
        resp = requests.get(url)
    except RequestException:
        return None
    if resp.status_code == 200:
        return resp.text
    else:
        return None

def parse(page,cat_id):
    '''
    页面解析,返回当前页面所有的歌手信息
    :param page: 
    :param cat_id: 
    :return: 
    '''
    html = etree.HTML(page)
    ul = html.xpath('//ul[@id="m-artist-box"]')
    lis = ul[0].xpath('li')
    artists = []
    for li in lis:
        tmp = {}
        href = li.xpath('a|p/a')
        tmp['cat'] = CATS[cat_id]
        tmp['name'] = href[0].text
        # 使用'_id'存储歌手的id,能够保证插入数据的唯一性
        tmp['_id'] = href[0].attrib['href'].split('=')[1]
        # 如果歌手有主页的话,添加主页的信息
        if len(href) == 2:
            tmp['userhome'] = href[1].attrib['href']
        else:
            tmp['userhome'] = None
        artists.append(tmp)
    return artists

def get_args(hot=False):
    '''
    根据hot生成请求参数
    :param hot: 
    :return: 
    '''
    if hot is False:
        initials = [i for i in range(65, 91)]
        initials.append(0)
    else:
        initials = [-1]
    return [[cat_no,initial] for cat_no in CATS.keys() for initial in initials]

def get_all_artists(hot=False):
    '''
    1. 初始化请求参数
    2. 初始化存储信息
    3. 获取并保存
    :param hot: 
    :return: 
    '''
    args = get_args(hot)

    client = MongoClient()
    db = client['py_netease']
    if not hot:
        artists = db['artists']
    else:
        artists = db['hot_artists']

    # 多线程下载,用时约24秒
    with futures.ThreadPoolExecutor(4) as executor:
        res = executor.map(get_artists,args)
    for result in res:
        try:
            artists.insert_many(result)
        except:
            pass

    # 单线程下载,用时约1分33秒
    # for arg in args:
    #     result = get_artists(arg)
    #     try:
    #         artists.insert_many(result)
    #     except:
    #         pass


if __name__ == '__main__':

   get_all_artists()

其他

1. 关于多线程

最简单的方法就是使用concurrent.futures包,其他也可以使用threading包。由于抓取属于IO密集型,因此使用多线程会明显改善效率。
2. 关于抓取失败
有可能是IP被禁止访问,返回503错误
3. 最后,发一下效果图,所有歌手一共有3w+条数据,而热门歌手有1500条数据

所有歌手

热门歌手

Python合法网页爬虫工具项目分享 内容概览: 这个分享包涵了我开发的Python爬虫工具项目,主要用于合法爬取某些网页信息。以下是主要内容: 源代码:包括Python代码和相关脚本。这些代码展示了如何使用Python进行网页抓取、解析和数据提取。 项目文件:除了代码,我还分享了整个项目的文件,包括设计稿、图标、图片等资源。这些资源对于理解项目背景和设计思路至关重要。 文档与操作手册:为了方便他人理解和使用我的作品,我编写了详细的操作手册和使用说明,同时提供了一份Markdown格式的文档,概述了项目的主要功能和特点。 学习笔记:在项目开发过程中,我记录了大量的学习笔记和心得体会。这些笔记不仅有助于理解项目的开发过程,还能为学习Python爬虫技术提供宝贵的参考资料。 适用人群: 这份项目合集适用于所有对Python爬虫开发感兴趣的人,无论你是学生、初学者还是有一定经验的开发者。无论你是想学习新的技术,还是想了解一个完整的项目开发流程,这份资料都将为你提供极大的帮助。 使用建议: 按部就班地学习:建议从基础的Python爬虫开发开始,逐步深入到实际应用中。通过实践,逐步掌握Python爬虫开发的各项技能。 参考项目文件和笔记:项目文件和笔记提供了丰富的背景信息和开发经验。在学习的过程中,不妨参考这些资料,以帮助你更好地理解和学习。 动手实践:Python爬虫开发是一门实践性很强的技能。通过实际操作,你可以更好地掌握Python爬虫开发的各项技能,并提高自己的实践能力。Python合法网页爬虫工具项目分享 内容概览: 这个分享包涵了我开发的Python爬虫工具项目,主要用于合法爬取某些网页信息。以下是主要内容: 源代码:包括Python代码和相关脚本。这些代码展示了如何使用Python进行网页抓取、解析和数据提取。 项目文件:除了代码,我还分享了整个项目的文件,包括设计稿、图标、图片等资源。这些资源对于理解项目背景和设计思路至关重要。 文档与操作手册:为了方便他人理解和使用我的作品,我编写了详细的操作手册和使用说明,同时提供了一份Markdown格式的文档,概述了项目的主要功能和特点。 学习笔记:在项目开发过程中,我记录了大量的学习笔记和心得体会。这些笔记不仅有助于理解项目的开发过程,还能为学习Python爬虫技术提供宝贵的参考资料。 适用人群: 这份项目合集适用于所有对Python爬虫开发感兴趣的人,无论你是学生、初学者还是有一定经验的开发者。无论你是想学习新的技术,还是想了解一个完整的项目开发流程,这份资料都将为你提供极大的帮助。 使用建议: 按部就班地学习:建议从基础的Python爬虫开发开始,逐步深入到实际应用中。通过实践,逐步掌握Python爬虫开发的各项技能。 参考项目文件和笔记:项目文件和笔记提供了丰富的背景信息和开发经验。在学习的过程中,不妨参考这些资料,以帮助你更好地理解和学习。 动手实践:Python爬虫开发是一门实践性很强的技能。通过实际操作,你可以更好地掌握Python爬虫开发的各项技能,并提高自己的实践能力。Python合法网页爬虫工具项目分享 内容概览: 这个分享包涵了我开发的Python爬虫工具项目,主要用于合法爬取某些网页信息。以下是主要内容: 源代码:包括Python代码和相关脚本。这些代码展示了如何使用Python进行网页抓取、解析和数据提取。 项目文件:除了代码,我还分享了整个项目的文件,包括设计稿、图标、图片等资源。这些资源对于理解项目背景和设计思路至关重要。 文档与操作手册:为了方便他人理解和使用我的作品,我编写了详细的操作手册和使用说明,同时提供了一份Markdown格式的文档,概述了项目的主要功能和特点。 学习笔记:在项目开发过程中,我记录了大量的学习笔记和心得体会。这些笔记不仅有助于理解项目的开发过程,还能为学习Python爬虫技术提供宝贵的参考资料。 适用人群: 这份项目合集适用于所有对Python爬虫开发感兴趣的人,无论你是学生、初学者还是有一定经验的开发者。无论你是想学习新的技术,还是想了解一个完整的项目开发流程,这份资料都将为你提供极大的帮助。 使用建议: 按部就班地学习:建议从基础的Python爬虫开发开始,逐步深入到实际应用中。通过实践,逐步掌握Python爬虫开发的各项技能。 参考项目文件和笔记:项目文件和笔记提供了丰富的背景信息和开发经验。在学习的过程中,不妨参考这些资料,以帮助你更好地理解和学习。 动手实践:Python爬虫开发是一门实践性很强的技能。通过实际操作,你可以更好地掌握Python爬虫开发的各项技能,并提高自己的实践能力。Python合法网页爬虫工具项目分享 内容概览: 这个分享包涵了我开发的Python爬虫
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值