一.把爬取的内容儲存取MySQL資料庫:
from urllib.request import urlopen
from urllib.request import urlretrieve
from bs4 import BeautifulSoup
import pymysql
import csv
import xlrd
import pandas as pd
import jieba
ExcelFile=xlrd.open_workbook(r'C:\Users\Administrator\Desktop\postcode.xls')
csv_file=csv.reader(open('music_comments.csv','r',encoding='UTF-8'))
content=list() #用來存儲整個檔案的資料,存成一個清單,清單的每一個元素又是一個清單,表示的是檔案的某一行
words=[]
lists=[]
for line in csv_file:
if(len(line)>=7):
lists.append(line[5])
# print(lists)
conn = pymysql.connect(host='127.0.0.1',user='root',passwd='',db='test',charset='utf8')
cur = conn.cursor()
for i in lists:
# i='\''+i+'\''
cur.execute("insert into content(content) VALUES ('"+i+"')")
conn.commit()
cur.close()
conn.close()
print("成功!")

二.爬蟲綜合大作業:
爬蟲目标:關于《人中之龍》這首音樂在網頁雲音樂的評論人的情況。
import json
import time
import requests
headers = {
'Host': 'music.163.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}
def get_comments(page):
"""
擷取評論資訊
"""
url = 'http://music.163.com/api/v1/resource/comments/R_SO_4_454232001?limit=20&offset=' + str(page)
response = requests.get(url=url, headers=headers)
# 将字元串轉為json格式
result = json.loads(response.text)
items = result['comments']
for item in items:
# 使用者名
user_name = item['user']['nickname'].replace(',', ',')
# 使用者ID
user_id = str(item['user']['userId'])
# 擷取使用者資訊
user_message = get_user(user_id)
# 使用者年齡
user_age = str(user_message['age'])
# 使用者性别
user_gender = str(user_message['gender'])
# 使用者所在地區
user_city = str(user_message['city'])
# 個人介紹
user_introduce = user_message['sign'].strip().replace('\n', '').replace(',', ',')
# 評論内容
comment = item['content'].strip().replace('\n', '').replace(',', ',')
# 評論ID
comment_id = str(item['commentId'])
# 評論點贊數
praise = str(item['likedCount'])
# 評論時間
date = time.localtime(int(str(item['time'])[:10]))
date = time.strftime("%Y-%m-%d %H:%M:%S", date)
# print(user_name, user_id, user_age, user_gender, user_city, user_introduce, comment, comment_id, praise, date)
with open('music_comments.csv', 'a', encoding='utf-8-sig') as f:
f.write(user_name + ',' + user_id + ',' + user_age + ',' + user_gender + ',' + user_city + ',' + user_introduce + ',' + comment + ',' + comment_id + ',' + praise + ',' + date + '\n')
f.close()
def get_user(user_id):
"""
擷取使用者注冊時間
"""
data = {}
url = 'https://music.163.com/api/v1/user/detail/' + str(user_id)
response = requests.get(url=url, headers=headers)
# 将字元串轉為json格式
js = json.loads(response.text)
if js['code'] == 200:
# 性别
data['gender'] = js['profile']['gender']
# 年齡
if int(js['profile']['birthday']) < 0:
data['age'] = 0
else:
data['age'] = (2018 - 1970) - (int(js['profile']['birthday']) // (1000 * 365 * 24 * 3600))
if int(data['age']) < 0:
data['age'] = 0
# 城市
data['city'] = js['profile']['city']
# 個人介紹
data['sign'] = js['profile']['signature']
else:
data['gender'] = '無'
data['age'] = '無'
data['city'] = '無'
data['sign'] = '無'
return data
def main():
# 前500頁
# for i in range(210000, 230000, 20):
# 後500頁
for i in range(0, 25000, 20):
print('\n---------------第 ' + str(i // 20 + 1) + ' 頁---------------')
get_comments(i)
if __name__ == '__main__':
main()
以上是爬取網易雲音樂的關于《人中之龍》這首音樂評論人員的評論時間,評論人的地區,評論内容等,儲存到檔案裡,如下圖:
總共2000來條評論資料。
以下是對評論使用者所在的省份進行統計,用pyecharts描繪出評論人在全國省份的的大緻情況:
import csv
import xlrd
from pyecharts import Map, Geo
def show_map(data):
geo = Geo("評論人在全國省份的主占比,顔色越深,占的人數越多", "data from num", title_color="#fff",
title_pos="center", width=1000,
height=600, background_color='#404a59')
attr, value = geo.cast(data)
geo.add("", attr, value, visual_range=[0, 200], maptype='china',visual_text_color="#fff",
symbol_size=50, is_visualmap=True)
geo.show_config()
geo.render(path="./評論人地區分布圖.html")
def read_excel(city_code,ExcelFile):
rows=len(ExcelFile.sheet_names())
# #擷取整行或者整列的值
for i in range(rows):
sheet=ExcelFile.sheet_by_name(ExcelFile.sheet_names()[i])
if( city_code[0:2] == str(sheet.row_values(2)[1])[0:2] ):
return city_code[0:2];
if __name__ == '__main__':
ExcelFile=xlrd.open_workbook(r'C:\Users\Administrator\Desktop\postcode.xls')
data={'84': '新疆', '85': '西藏', '81': '青海', '73': '甘肅', '61': '四川', '65': '雲南', '75': '甯夏', '02': '内蒙古', '16': '黑龍江', '13': '吉林', '11': '台灣', '05': '河北', '10': '北京', '30': '天津', '71': '陝西', '03': '山西', '27': '山東', '47': '河南', '40': '重慶', '44': '湖北', '23': '安徽', '21': '江蘇', '20': '上海', '55': '貴州', '53': '廣西', '41': '湖南', '33': '江西', '32': '浙江', '35': '福建', '51': '廣東', '57': '海南', '99': '香港'}
csv_file=csv.reader(open('music_comments.csv','r',encoding='UTF-8'))
content=list() #用來存儲整個檔案的資料,存成一個清單,清單的每一個元素又是一個清單,表示的是檔案的某一行
cityList={}
cityArry=[]
for line in csv_file:
if(len(line)>=5):
temp=read_excel(line[4],ExcelFile)
if(temp!=None):
if(temp in cityList):
cityList[temp]=cityList[temp]+1
else:
cityList[temp]=0
for city in cityList:
cityArry.append( (data[city],cityList[city]) )
show_map(cityArry)
print (cityArry)
以下是效果圖,可以看出主要的評論人在北京地區和廣東福建地區比較多。
import csv
import xlrd
import pandas as pd
import jieba
ExcelFile=xlrd.open_workbook(r'C:\Users\Administrator\Desktop\postcode.xls')
csv_file=csv.reader(open('music_comments.csv','r',encoding='UTF-8'))
content=list() #用來存儲整個檔案的資料,存成一個清單,清單的每一個元素又是一個清單,表示的是檔案的某一行
words=[]
wcdict={}
for line in csv_file:
if(len(line)>=7):
for word in jieba.lcut(line[5]):
wcdict[word]=wcdict.get(word,0)+1
for word in jieba.lcut(line[6]):
wcdict[word]=wcdict.get(word,0)+1
# 過濾的單詞
removeWord=[
',','。','是',',','(',')','ノ','*','•','´','啊','都','‘','你','有','','Д','σ','ପ','ଓ','⃛',
'!','、','的','來','雖然','了','我','在','▽','ω','也','`','…','聽','不','就','`',
'/','[',']','?','?'
]
words=list(wcdict.items())
i=0
while i < len(words):
if words[i][0] in removeWord: #查找單詞清單是否在要過濾的單詞表中,有的,從單詞清單中去掉該單詞
words.remove(words[i])
if i!=0: #因為去掉單詞後,清單内容會前移一位,是以索引要減一
i=i-1
else:
i=i+1
# print (words)
pd.DataFrame(data=words).to_csv('big.csv',encoding='utf_8_sig')
以下是根據評論的語句進行詞雲分析。
import csv
import xlrd
import math
import pandas as pd
import jieba
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
ExcelFile=xlrd.open_workbook(r'C:\Users\Administrator\Desktop\postcode.xls')
csv_file=csv.reader(open('music_comments.csv','r',encoding='UTF-8'))
content=list() #用來存儲整個檔案的資料,存成一個清單,清單的每一個元素又是一個清單,表示的是檔案的某一行
ages=[]
wcdict={}
for line in csv_file:
if(len(line)>=3):
if(line[2]!='0'):
if(int(line[2]) <100):
ages.append(int(line[2]) )
wcdict[line[2]]=wcdict.get(line[2],0)+1
wcls=list(wcdict.items())
data=[0,0,0,0,0,0,0];
for item in wcls:
index= int(int(item[0])/10 )
data[index]+= int(item[1])
myfont = matplotlib.font_manager.FontProperties(fname=r'C:\Users\Administrator\Desktop\msyhbd.ttf')
# 建構資料
x_data = ['10-19', '20-29', '30-39', '40-49', '50-59', '60-69','70-79']
plt.bar(range(len(x_data)),data ,color='rgb',tick_label=x_data)
# plt.bar(x=x_data, height=500, label='age', color='steelblue', alpha=0.8)
# 在柱狀圖上顯示具體數值, ha參數控制水準對齊方式, va控制垂直對齊方式
for x, y in enumerate(data):
plt.text(x, 100 , '%s' % y, ha='center', va='bottom')
# # 設定标題
plt.title("歌曲評論人的年齡分布",fontproperties = myfont)
# 為兩條坐标軸設定名稱
plt.xlabel("年齡分布",fontproperties = myfont)
plt.ylabel("人數",fontproperties = myfont)
# 顯示圖例
plt.legend()
plt.show()
以下是對評論人年齡分布的分析,發現主要人都是青年人在聽