前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >网易云音乐热门作品名字和链接抓取(html5lib篇)

网易云音乐热门作品名字和链接抓取(html5lib篇)

作者头像
前端皮皮
发布2022-08-17 18:38:20
3280
发布2022-08-17 18:38:20
举报

大家好,我是皮皮。

一、前言

前几天在Python白银交流群有个叫【O|】的粉丝问了一道关于网易云音乐热门作品名字和链接抓取的问题,获取源码之后,发现使用xpath匹配拿不到东西,从响应来看,确实是可以看得到源码的。

之前的文章,已经使用了正则表达式和xpathbs4pyquery四个方法进行了相关实现,网易云音乐热门作品名字和链接抓取(正则表达式篇)网易云音乐热门作品名字和链接抓取(xpath篇)网易云音乐热门作品名字和链接抓取(bs4篇)网易云音乐热门作品名字和链接抓取(pyquery篇),这篇文章我们使用html5lib来实现。

二、实现过程

这里【甯同学】给了一个使用html5lib方法来实现的代码,简单来说就是用html5lib修复html就可以了,代码如下。

代码语言:javascript
复制
# coding:utf-8

# @Time : 2022/5/10 10:46
# @Author: 皮皮
# @公众号: Python共享之家
# @website : http://pdcfighting.com/
# @File : 网易云音乐热门作品名字和链接(html5lib).py
# @Software: PyCharm

#
#                             _ooOoo_
#                            o8888888o
#                            88" . "88
#                            (| -_- |)
#                            O\  =  /O
#                         ____/`---'\____
#                       .'  \\|     |//  `.
#                      /  \\|||  :  |||//  \
#                     /  _||||| -:- |||||-  \
#                     |   | \\\  -  /// |   |
#                     | \_|  ''\---/''  |   |
#                     \  .-\__  `-`  ___/-. /
#                   ___`. .'  /--.--\  `. . __
#                ."" '<  `.___\_<|>_/___.'  >'"".
#               | | :  `- \`.;`\ _ /`;.`/ - ` : | |
#               \  \ `-.   \_ __\ /__ _/   .-` /  /
#          ======`-.____`-.___\_____/___.-`____.-'======
#                             `=---='
#         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#                   ☀佛祖保佑☀   卍   ☀永无BUG☀
import requests, re
from lxml import etree
from fake_useragent import UserAgent
import html5lib


class Wangyiyun(object):
    def __init__(self):
        self.base_url = 'https://music.163.com/discover/artist'
        self.headers = {
            'user-agent': UserAgent().random,
            'referer': 'https://music.163.com/',
            'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'
        }

    def get_xpath(self, url):
        res = requests.get(url, headers=self.headers)
        # print(res.text)
        return etree.HTML(etree.tostring(html5lib.parse(res.text, treebuilder='lxml')))

    def singers_parse(self, url, items):
        html = self.get_xpath(url)
        song_dict = {}
        a_lis = html.xpath('//div[@id="song-list-pre-cache"]/ul/li/a')  # "song-list-pre-cache"
        for a in a_lis:
            song_name = a.xpath('.//text()')[0]
            print(song_name)
            song_url = 'https://music.163.com' + a.xpath('./@href')[0]
            print(song_url)
            # song_dict[song_name] = song_url
        items['所有歌曲:'] = song_dict
        # print(items)
        # name = items['歌手名:']
        # print(f'歌手:{name} 的歌曲已经获取完毕!即将写入文件!')
        # time.sleep(1)
        # self.writer_data(items)
        # print(f'歌手:{name} 的歌曲已经写入完毕!')


Wangyiyun().singers_parse(url='https://music.163.com/artist?id=50653542', items={})

这个代码亲测好使,运行之后结果如下。

难点在于掌握pyquery选择器的使用,获取值等等。

如果遇到下图这个报错,一般是编码问题导致的。

只需要将86行的代码加个编码就行,如下图所示:

代码语言:javascript
复制
return etree.HTML(etree.tostring(html5lib.parse(res.text, treebuilder='lxml'), encoding='iso8859-1'))

之后就可以正常跑起来了:

三、总结

大家好,我是皮皮。网易云音乐热门作品名字和链接抓取(pyquery篇),行之有效,难点在于构造pyquery选择器。也欢迎大家积极尝试,一起学习。目前我们已经实现了使用正则表达式、xpathbs4pyquery四种方法来进行操作,接下来的一篇文章,我们html5lib库来进行实现,帮助大家巩固下Python选择器基础。

最后感谢粉丝【O|】提问,感谢【dcpeng】、【月神】、【甯同学】、【凡人不烦人】等人参与学习交流。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-05-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python共享之家 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言
  • 二、实现过程
  • 三、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档