目标:
初级目标:通过热门歌手,抓取网易云音乐上他的热门歌曲50首的ID及链接地址。
终极目标:
1、通过热门歌手,抓取歌曲ID。
2、通过歌曲ID,抓取评论用户ID。
3、通过评论用户ID,发送定向推送消息。
为了存储抓取到的结果,我们用MYSQL存储结果,这样把各个步骤分离,通过MYSQL进行数据连接。
学习内容:
掌握爬虫程序的编写,掌握Python中用PYMYSQL连接操作MYSQL数据库。
例如:
1、 搭建 mysql数据库
2、 掌握 python连接mysql基本语法
3、 掌握爬虫获取指定信息
4、 掌握链接指定url
步骤1:MYSQL建表
首先搭建好mysql环境,创建一个database叫python名字,然后在这个python创建一个表来存储抓取到的歌曲ID,歌曲名称,以及对应的网页地址。
存储的结果如下:
建表语句:
create database python
ALTER DATABASE python CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci
DROP TABLE IF EXISTS `songinf`;
CREATE TABLE `songinf` (
`id` int(12) NOT NULL AUTO_INCREMENT,
`song_id` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`song_name` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`song_url` varchar(150) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`clbz` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci ,
`height` float(3, 2) NULL DEFAULT 0.00,
PRIMARY KEY (`id`) USING BTREE,
INDEX `song_id`(`song_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
步骤2:通过pysql操作mysql
完成建表以后,我们通过pysql操作刚才创建的songinf表,测试一下是否能往其中插入一条数据。能插入表示连接成功。
创建python文件,命名为:wangyiyunSpiderSQL.py。在步骤3中import这个文件。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'luoji'
import pymysql
# from ,where, group by, select, having, order by, limit
class Mysql_pq(object):
def __init__(self):
self.conn = pymysql.Connect(host='127.0.0.1',
port=3306,
user='root',
passwd='root',
db='python',
#创建数据库格式时用utf8mb4这个格式,因为可以存储表情等非字符
charset='utf8mb4'
)
self.cursor = self.conn.cursor()
def modify_sql(self,sql,data):
self.cursor.execute(sql,data)
self.conn.commit()
def __del__(self):
self.cursor.close()
self.conn.close()
def insert_songinf(song_id,song_name,song_url,clbz):
helper = Mysql_pq()
print('连接上了数据库python,准备插入歌曲信息')
# 插入数据
insert_sql = 'insert into songinf(song_id,song_name,song_url,clbz) value (%s,%s,%s,%s)'
data = (song_id,song_name,song_url,clbz)
helper.modify_sql(insert_sql, data)
if __name__ == '__main__':
song_id='519250015'
song_name= '请记住我'
song_url = 'https://music.163.com/#/song?id=1313052960&lv=-1&kv=-1&tv=-1'
clbz = 'N'
insert_songinf(song_id, song_name, song_url,clbz)
print('test over')
运行一下这个程序,然后通过DbVisualizer检查一下表songinf是否有数据。
步骤3:通过爬虫获取歌曲的信息
核心操作:通过歌手ID,访问歌手的主页,然后获取主页里面展示的前50首热门歌曲,获取歌曲名称以及ID,同时,拼凑出歌曲的页面。
每个歌手的主页格式都一样,仅仅是ID不一样而已。形式都为:
url = 'https://music.163.com/artist?id=' + artist_id
因此,我们只要能获得歌手的id就能获得其主页地址。
歌手ID也可以通过爬虫来获得热门歌手的ID,但是网易云音乐界面是通过iframe框架开发的,获取还有一定难度,调试起来超级费时间,过年这里浪费了两天时间来调试获取用户ID的爬虫程序。这里不浪费时间,人肉爬取想要的歌手的ID,通过访问这些歌手主页地址可以获得。比如:
徐秉龙 1197168 周笔畅10558买辣椒也用券 12085562 华晨宇 861777林宥嘉 3685
李荣浩 4292杨宗纬 6066薛之谦 5781蔡健雅 7214金玟岐 893259林俊杰 3684
因此,新建python程序如下:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'luoji'
# -*- coding:utf-8 -*-
# 网易云音乐 通过歌手ID,生成该歌手的热门歌曲和歌曲主页
import requests
import sys
import re
import os
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
from lxml import etree
from selenium import webdriver
from wangyiyunSpiderSQL import *
headers = {
'Referer': 'http://music.163.com',
'Host': 'music.163.com',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'User-Agent': 'Chrome/10'
}
# 得到指定歌手页面 热门前50的歌曲ID,歌曲名
def get_songs(artist_id):
page_url = 'https://music.163.com/artist?id=' + artist_id
# 获取网页HTML
res = requests.request('GET', page_url, headers=headers)
# 用XPath解析 前50首热门歌曲
html = etree.HTML(res.text)
href_xpath = "//*[@id='hotsong-list']//a/@href"
name_xpath = "//*[@id='hotsong-list']//a/text()"
hrefs = html.xpath(href_xpath)
names = html.xpath(name_xpath)
# 设置热门歌曲的ID,歌曲名称
song_ids = []
song_names = []
for href, name in zip(hrefs, names):
song_ids.append(href[9:])
song_names.append(name)
print(href, ' ', name)
return song_ids, song_names
# 设置歌手ID,毛不易为12138269
#徐秉龙 1197168 周笔畅10558买辣椒也用券 12085562 华晨宇 861777林宥嘉 3685
# 李荣浩 4292杨宗纬 6066薛之谦 5781蔡健雅 7214金玟岐 893259林俊杰 3684
# 邓紫棋 7763孙燕姿 9272梁静茹 8325张惠妹 10559林忆莲 8336莫文蔚 8926
# 赵雷 6731宋冬野 5073马頔 4592朴树 4721逃跑计划 12977黄霄雲
# 14077324陈奕迅 2116艾辰 12174057封茗囧菌 12172529阮豆 12172496黑猫
# 12383659Fine乐团 1160085郭顶 2843周兴哲 980025田馥甄 9548五月天
# 13193苏打绿 12707王力宏 5346陶喆 5196周杰伦 6452周华健 6456
artist_id_list = ['12138269','1197168','10558','12085562','861777','3685','4292',
'6066','5781','7214','893259','3684','7763','9272','8325','10559',
'8336','8926','6731','5073','4592','4721','12977','14077324',
'2116','12174057','12172529','12172496','12383659','1160085',
'2843','980025','9548','13193','12707','5346','5196','6452',
'6456','6453','6454','6455','6457','6458','6459','6460','6461',
'6462','6463','6464','6465','6466','6467','6468','6469','6470']
for artist_id in artist_id_list:
[song_ids, song_names] = get_songs(artist_id)
print('len(song_ids) = ',len(song_ids))
for (song_id, song_name) in zip(song_ids, song_names):
# 歌词API URL
song_url = 'https://music.163.com/#/song?id=' + song_id + '&lv=-1&kv=-1&tv=-1'
print('song_url = ',song_url)
print('song_id = ', song_id)
print('song_name =', song_name)
clbz = 'N'
insert_songinf(song_id, song_name, song_url, clbz)
print('插入歌曲id结束')
#lyric = get_song_lyric(headers, song_url)
#print('len(lyric)=',len(lyric))
print('插入歌曲id全部成功,结束')
运行程序,能获得2613首歌曲的ID和链接地址。
下一篇,我们将用获得这个歌曲ID,去获取评论用户的ID.