爬虫综合大作业
选择一个热点或者你感兴趣的主题。
选择爬取的对象与范围。
了解爬取对象的限制与约束。
爬取相应内容。
做数据分析与文本分析。
形成一篇文章,有说明、技术要点、有数据、有数据分析图形化展示与说明、文本分析图形化展示与说明。
文章公开发布。
1. 数据爬取
我们本次爬取的对象是一首名为《five hours》的经典电音流行歌曲,Five Hours是Erick Orrosquieta于2014年4月发行的单曲,当年这首单曲就出现在奥地利,比利时,法国,荷兰,挪威,瑞典和瑞士的榜单中。
作者Erick Orrosquieta,一般为人熟知的是他的艺名Deorro,2014年世界百大DJ排名十九位。1991年8月29日生于美国洛杉矶,墨西哥血统的音乐制作人,签约Ultra Records,2014年他创立了唱片公司Panda Funk。Deorro以前用过TON!C这个名字。Deorro的音乐倾向Melbourne Bounce风格,融合Dutch、 moombah, progressive、 house、贝斯等多种元素和风格,几分钟就可以点炸现场气氛。他的这首单曲“Five Hours”登顶Most Played on Dance Radio和Most Played on Top 40 radio Mixshows。
而在爬虫部分主要是调用官方API,本次用到的API主要有两个:
①获取评论:
http://music.163.com/api/v1/resource/comments/R_SO_4_{歌曲ID}?limit={每页限制数量}&offset={评论数总偏移}
②获取评论对应用户的信息:
https://music.163.com/api/v1/user/detail/{用户ID}
完成后的项目文件图如下:
1.1 评论爬取
具体代码如下:
1 from urllib importrequest2 importjson3 importpymysql4 from datetime importdatetime5 importre6
7 ROOT_URL = 'http://music.163.com/api/v1/resource/comments/R_SO_4_%s?limit=%s&offset=%s'
8 LIMIT_NUMS = 50 #每页限制爬取数
9 DATABASE = 'emp' #数据库名
10 TABLE = 'temp1' #数据库表名
11 #数据表设计如下:
12 '''
13 commentId(varchar)14 content(text) likedCount(int)15 userId(varchar) time(datetime)16 '''
17 PATTERN = re.compile(r'[\n\t\r\/]') #替换掉评论中的特殊字符以防插入数据库时报错
18
19 defgetData(url):20 if noturl:21 returnNone, None22 headers ={23 "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36',24 "Host": "music.163.com",25 }26 print('Crawling>>>' +url)27 try:28 req = request.Request(url, headers=headers)29 content = request.urlopen(req).read().decode("utf-8")30 js =json.loads(content)31 total = int(js['total'])32 datas =[]33 for c in js['comments']:34 data =dict()35 data['commentId'] = c['commentId']36 data['content'] = PATTERN.sub('', c['content'])37 data['time'] = datetime.fromtimestamp(c['time']//1000)38 data['likedCount'] = c['likedCount']39 data['userId'] = c['user']['userId']40 datas.append(data)41 returntotal, datas42 exceptException as e:43 print('Down err>>>', e)44 pass
45
46 defsaveData(data):47 if notdata:48 returnNone49 conn = pymysql.connect(host='localhost', user='root', passwd='123456', db='emp', charset='utf8mb4') #注意字符集要设为utf8mb4,以支持存储评论中的emoji表情
50 cursor =conn.cursor()51 sql = 'insert into' + TABLE + '(commentId,content,likedCount,time,userId) VALUES (%s,%s,%s,%s,%s)'
52
53 for d indata:54
55 try:56 #cursor.execute('SELECT max(c) FROM '+TABLE)
57 #id_ = cursor.fetchone()[0]
58
59 cursor.execu