一.把爬取的内容保存取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()
以下是对评论人年龄分布的分析,发现主要人都是青年人在听