目標:
初級目標:通過熱門歌手,抓取網易云音樂上他的熱門歌曲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.
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/261386.html
標籤:python
上一篇:爬取美女壁紙
