爬虫综合大作业

 一.把爬取的内容保存取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()

以下是对评论人年龄分布的分析,发现主要人都是青年人在听

 

posted @ 2019-04-22 16:20  一觉不觉已千年  阅读(519)  评论(0编辑  收藏  举报