python爬虫之豆瓣音乐top250代码数据分析问题祝福

回家很久了,实在熬不住,想起来爬点数据玩一玩,之前自己笔记本是win7加ubuntu16.04双系统,本打算在ubuntu里写代码的,可是回到家ubuntu打开一直是紫屏,百度知乎方法用了也没解决,厉害的兄弟可以教下我哦,过年有红包哦!!然后就还是在win7下开始写代码了(电脑太卡,一直不想装Python),今天爬的是豆瓣音乐top250,比较简单,主要是练练手。

代码

import requests
import re
from bs4 import BeautifulSoup
import time
import pymongo

client = pymongo.MongoClient('localhost', 27017)
douban = client['douban']
musictop = douban['musictop']

headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
}
urls = ['https://music.douban.com/top250?start={}'.format(str(i)) for i in range(0,250,25)]

def get_url_music(url):
    wb_data = requests.get(url,headers=headers)
    soup = BeautifulSoup(wb_data.text,'lxml')
    music_hrefs = soup.select('a.nbg')
    for music_href in music_hrefs:
        get_music_info(music_href['href'])
        time.sleep(2)

def get_music_info(url):
    wb_data = requests.get(url,headers=headers)
    soup = BeautifulSoup(wb_data.text,'lxml')
    names = soup.select('h1 > span')
    authors = soup.select('span.pl > a')
    styles = re.findall('<span class="pl">流派:</span> (.*?)<br />',wb_data.text,re.S)
    times = re.findall('<span class="pl">发行时间:</span> (.*?)<br />',wb_data.text,re.S)
    contents = soup.select('span.short > span')
    if len(names) == 0:
        name = '缺失'
    else:
        name = names[0].get_text()
    if len(authors) == 0:
        author = '佚名'
    else:
        author = authors[0].get_text()
    if len(styles) == 0:
        style = '未知'
    else:
        style = styles[0].split('\n')[0]
    if len(times) == 0:
        time = '未知'
    else:
        time = times[0].split('-')[0]
    if len(contents) == 0:
        content = '无'
    else:
        content = contents[0].get_text()
    info = {
        'name':name,
        'author':author,
        'style':style,
        'time':time,
        'content':content
    }
    musictop.insert_one(info)

for url in urls:
    get_url_music(url)

1加了请求头(本来没加,调试几次突然没数据了,加了请求头开始也没好,后来又好了,可能是网络原因) 2这次是进入信息页爬的数据(上次爬电影没采用这种方法,缺少了部分数据) 3数据的预处理用了很多if函数,厉害的兄弟有什么优化的方法。

数据分析

1部分数据可以见上图 2中国音乐作者还是很多的,哈哈。 3随着音乐设备和网络的普及,流行音乐的发展,可以看出2000年后作品越来越多,到2010年又积极下滑(经典就是经典,无法吐槽现在的音乐) 4风格大家可以看出流行,摇滚,民谣占了一大半。 5最后弄了一首周董的《不能说的秘密》做词云,想想小时候都是回忆啊。

问题

import requests
import re
from bs4 import BeautifulSoup
import time
import pymysql

conn = pymysql.connect(host='localhost', user='root', passwd='123456', db='test', port=3306, charset='utf8')
cursor = conn.cursor()

headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
}
urls = ['https://music.douban.com/top250?start={}'.format(str(i)) for i in range(0,225,25)]

def get_url_music(url):
    wb_data = requests.get(url,headers=headers)
    soup = BeautifulSoup(wb_data.text,'lxml')
    music_hrefs = soup.select('a.nbg')
    for music_href in music_hrefs:
        get_music_info(music_href['href'])
        time.sleep(2)

def get_music_info(url):
    wb_data = requests.get(url,headers=headers)
    soup = BeautifulSoup(wb_data.text,'lxml')
    names = soup.select('h1 > span')
    authors = soup.select('span.pl > a')
    styles = re.findall('<span class="pl">流派:</span> (.*?)<br />',wb_data.text,re.S)
    times = re.findall('<span class="pl">发行时间:</span> (.*?)<br />',wb_data.text,re.S)
    contents = soup.select('span.short > span')
    if len(names) == 0:
        name = '缺失'
    else:
        name = names[0].get_text()
    if len(authors) == 0:
        author = '佚名'
    else:
        author = authors[0].get_text()
    if len(styles) == 0:
        style = '未知'
    else:
        style = styles[0].split('\n')[0]
    if len(times) == 0:
        time = '未知'
    else:
        time = times[0].split('-')[0]
    if len(contents) == 0:
        content = '无'
    else:
        content = contents[0].get_text()
    info = {
        'name':name,
        'author':author,
        'style':style,
        'time':time,
        'content':content
    }

    cursor.execute("use test")
    cursor.execute("insert into doubanmusic250 (name,author,style,time,content) values(%s,%s,%s,%s,%s)", (name,author,style,time,content))
    conn.commit()

for url in urls:
    get_url_music(url)

最近再学mysql,想用Python连接MySQL的,可是出错,附上代码,大牛们前来指导。代码出错图:

祝福

在这里住大家新年快乐,鸡年大吉。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序人生

程序员的暴力美学

调试程序是件闹心的事。尤其是你坐在那里几乎不动,在屏幕上苦苦工作了好几个小时,才发现这狗日的内存泄漏不是你的问题,而是某个浏览器(或者别的什么应用)。为了形象一...

3237
来自专栏镁客网

三星Note 5外观大曝光,安兔兔跑分成绩不错

1465
来自专栏漏斗社区

专属| 940万名客户信息遭泄露

据报道,日前大型国际航空公司国泰航空披露,在今年3月发生的一次数据泄露事件中,该公司的940万名乘客的记录被盗,含有姓名、出生日期、住址等个人信息的护照信息也可...

1494
来自专栏腾讯数据中心

Google水冷服务器,制冷革命正当时

Google首次开放了其位于美国和欧洲地区的数据中心后,媒体公布了一批其数据中心的照片。照片里谷歌数据中心内成千上万台服务器严阵以待,线缆以及冷却管道色彩各异,...

4725
来自专栏Vamei实验室

程序员电邮札记

“Across the Great Wall, we can reach every corner in the world”。 这是1987年从中科院计算机所...

1767
来自专栏腾讯数据中心

数据中心专用术语词典首发!破译圈内暗语

随着互联网数据中心的蓬勃发展,IDC相关的讯息也呈几何级喷发。不胜枚举的行业术语、不拘一格的表达方式,对传递数据中心相关信息的影响已不可小觑。本文可以帮助大家更...

6674
来自专栏小轻论坛

真是笑skr人,贴膜师傅让我删掉这条推送!

相信许多人都在依赖天桥上的小贩、手机店老板贴膜吧!然而很多人在不断进化过程中学会了贴膜这一项“技术活”。贴膜真的是技术活么?手机真的要贴膜么?什么膜更加适合你?...

1285
来自专栏IT大咖说

一年一度的每周5晚程序员段子又来了

程序员设计的版本号,一般会从1.0开始,然后,1.1、1.2、1.3……1.9,接下来的版本号会是1.10、1.11、1.12……于是有一天,在你的面前放着1....

682
来自专栏Zchannel

影驰发布旗下最大容量SSD:2TB

954
来自专栏FreeBuf

DIY一个自己喜欢的瓦力吧!

随着科学技术的快速发展,AI技术已经越来越接近人们的日常生活,人们对智能车的研究有增无减,智能小车已然成为以后科学技术发展的新思路和新方向。智能小车可以按照预先...

1270

扫码关注云+社区