要:从零开始写爬虫,初学者的速成指南!
需要免费获取本文章讲解的视频+源码,关注+转发此文然后私信我回复“音乐”即可领取资料,也欢迎大家和我一起交流学习Python,共同成长
封面:
封面
大家好,《手把手教你写网络爬虫》连载开始了!在笔者的职业生涯中,几乎没有发现像网络爬虫这样的编程实践,可以同时吸引程序员和门外汉的注意。本文由浅入深的把爬虫技术和盘托出,为初学者提供一种轻松的入门方式。请跟随我们一起踏上爬虫学习的打怪升级之路吧!
介绍
什么是爬虫?
先看看百度百科的定义:
网络爬虫
简单的说网络爬虫(Web crawler)也叫做网络铲(Web scraper)、网络蜘蛛(Web spider),其行为一般是先“爬”到对应的网页上,再把需要的信息“铲”下来。
为什么学习爬虫?
看到这里,有人就要问了:google、百度等搜索引擎已经帮我们抓取了互联网上的大部分信息了,为什么还要自己写爬虫呢?这是因为,需求是多样的。比如在企业中,爬取下来的数据可以作为数据挖掘的数据源。甚至有人为了炒股,专门抓取股票信息。笔者就见过有人为了分析房价,自学编程,爬了绿中介的数据。
在大数据深入人心的时代,网络爬虫作为网络、存储与机器学习等领域的交汇点,已经成为满足个性化网络数据需求的最佳实践。还犹豫什么?让我们开始学习吧!
语言&环境
语言:人生苦短,我用Python。让Python带我们飞!
Python
urllib.request:这是Python自带的库,不需要单独安装,它的作用是为我们打开url获取html的内容。Python官方文档的介绍:The urllib.request module defines functions and classes which help in opening URLs (mostly HTTP) in a complex world — basic and digest authentication, redirections, cookies and more.
BeautifulSoup:是一个可以从HTML或XML文件中提取数据的Python库。它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。Beautiful Soup会帮你节省数小时甚至数天的工作时间。安装比较简单:
$pip install beautifulsoup4
验证的方法,进入Python直接import一下,如果没有异常,那就说明安装成功了!
BeautifulSoup
“美味的汤,绿色的浓汤,
在热气腾腾的盖碗里装!
谁不愿意尝一尝,这样的好汤?
晚餐用的汤,美味的汤!”
BeautifulSoup库的名字取自《爱丽丝梦游仙境》里的同名诗歌。
爬取数据
接下来,我们就用urllib.request获取html内容,再用BeautifulSoup提取其中的数据,完成一次简单的爬取。
urllib.request
把这段代码保存为get_html.py,然后运行,看看输出了什么:
get_html.py
果然,输出了http://jr.jd.com 这个网页的全部HTML代码。
输出的代码简直无法直视,如何方便的找到我们想抓取数据呢?用Chrome打开url,然后按F12,再按Ctrl + Shift + C。如果我们要抓导航栏,就用鼠标点击任意一个导航栏的项目,浏览器就在html中找到了它的位置。效果如下:
HTML代码
定位到的html代码:
html代码
有了这些信息,就可以用BeautifulSoup提取数据了。升级一下代码:
BeautifulSoup
把这段代码保存为get_data.py,然后运行,看看输出了什么:
get_data.py
没错,得到了我们想要的数据!
BeautifulSoup提供一些简单的、Python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。怎么样,是不是觉得只要复制粘贴就可以写爬虫了?简单的爬虫确实是可以的!
一个迷你爬虫
我们先定一个小目标:爬取网易云音乐播放数大于500万的歌单。
打开歌单的url: http://music.163.com/#/discover/playlist,然后用BeautifulSoup提取播放数<span class="nb">3715</span>。结果表明,我们什么也没提取到。难道我们打开了一个假的网页?
动态网页:所谓的动态网页,是指跟静态网页相对的一种网页编程技术。静态网页,随着html代码的生成,页面的内容和显示效果就基本上不会发生变化了——除非你修改页面代码。而动态网页则不然,页面代码虽然没有变,但是显示的内容却是可以随着时间、环境或者数据库操作的结果而发生改变的。
值得强调的是,不要将动态网页和页面内容是否有动感混为一谈。这里说的动态网页,与网页上的各种动画、滚动字幕等视觉上的动态效果没有直接关系,动态网页也可以是纯文字内容的,也可以是包含各种动画的内容,这些只是网页具体内容的表现形式,无论网页是否具有动态效果,只要是采用了动态网站技术生成的网页都可以称为动态网页。
现在我们明白了,这是一个动态网页,我们得到它的时候,歌单还没请求到呢,当然什么都提取不出来!
我们之前的技术不能执行那些让页面产生各种神奇效果的JavaScript 代码。如果网站的HTML页面没有运行JavaScript,就可能和你在浏览器里看到的样子完全不同,因为浏览器可以正确地执行JavaScript。用Python 解决这个问题只有两种途径:直接从JavaScript 代码里采集内容,或者用Python 的第三方库运行JavaScript,直接采集你在浏览器里看到的页面。我们当然选择后者。今天第一课,不深究原理,先简单粗暴的实现我们的小目标。
干
Selenium:是一个强大的网络数据采集工具,其最初是为网站自动化测试而开发的。近几年,它还被广泛用于获取精确的网站快照,因为它们可以直接运行在浏览器上。Selenium 库是一个在WebDriver 上调用的API。WebDriver 有点儿像可以加载网站的浏览器,但是它也可以像BeautifulSoup对象一样用来查找页面元素,与页面上的元素进行交互(发送文本、点击等),以及执行其他动作来运行网络爬虫。安装方式与其他Python第三方库一样。
$pip install Selenium
验证一下:
Selenium
Selenium 自己不带浏览器,它需要与第三方浏览器结合在一起使用。例如,如果你在Firefox 上运行Selenium,可以直接看到一个Firefox 窗口被打开,进入网站,然后执行你在代码中设置的动作。虽然这样可以看得更清楚,但不适用于我们的爬虫程序,爬一页就打开一页效率太低,所以我们用一个叫PhantomJS的工具代替真实的浏览器。
PhantomJS:是一个“无头”(headless)浏览器。它会把网站加载到内存并执行页面上的JavaScript,但是它不会向用户展示网页的图形界面。把Selenium和PhantomJS 结合在一起,就可以运行一个非常强大的网络爬虫了,可以处理cookie、JavaScript、header,以及任何你需要做的事情。
PhantomJS并不是Python的第三方库,不能用pip安装。它是一个完善的浏览器,所以你需要去它的官方网站下载,然后把可执行文件拷贝到Python安装目录的Scripts文件夹,像这样:
Scripts文件夹
开始干活!
打开歌单的第一页:
http://music.163.com/#/discover/playlist/?order=hot&cat=%E5%85%A8%E9%83%A8&limit=35&offset=0
用Chrome的“开发者工具”F12先分析一下,很容易就看穿了一切。
html代码
播放数nb (number broadcast):29915
封面 msk (mask):有标题和url
同理,可以找到“下一页”的url,最后一页的url是“javascript:void(0)”。
最后,用18行代码即可完成我们的工作。
代码
把这段代码保存为get_data.py,然后运行。运行结束后,在程序的目录里生成了一个playlist.csv文件。
playlist.csv文件
看到成果后是不是很有成就感?如果你感兴趣,还可以按照这个思路,找找评论数最多的单曲,再也不用担心没歌听了!
需要免费获取本文章讲解的视频+源码,关注+转发此文然后私信我回复“音乐”即可领取资料,也欢迎大家和我一起交流学习Python,共同成长
今天的内容比较浅显,希望对你有用。就先介绍到这里,我们下期再见!
易云音乐2018年度听歌报告—遇见你,真好。
相信有不少人在上周,应该已经看过自己网易云音乐的年度报告了。
小F也是去凑凑热闹,瞅了一波自己的年度听歌报告。
那么你在云村又听了多少首歌,听到最多的歌词又是什么呢?
2018年你的年度歌手又是谁,哪些又是你最爱的歌呢?
不过相比去年,我的票圈并没有很多发自己年度报告的朋友。
不得不说,版权之争开始,网易云音乐似乎就在走下坡路。
很多喜欢的歌听不了,这应该是大家共同的痛点。
最大的印象就是周董的歌,在愚人节时下架了,原以为只是个玩笑,不想却是真的。
本次通过对网易云音乐华语歌单数据的获取,对华语歌单数据进行可视化分析。
可视化库不采用pyecharts,来点新东西。
使用matplotlib可视化库,利用这个底层库来进行可视化展示。
/ 01 / 网页分析
01 歌单索引页
选取华语热门歌单页面。
获取歌单播放量,名称,及作者,还有歌单详情页链接。
本次一共获取了1302张华语歌单。
02 歌单详情页
获取歌单详情页信息,信息比较多。
有歌单名,收藏量,评论数,标签,介绍,歌曲总数,播放量,收录的歌名。
这里歌曲的时长、歌手、专辑信息在网页的iframe中。
需要用selenium去获取信息,鉴于耗时过长,小F选择放弃...
有兴趣的小伙伴,可以试一下哈...
/ 02 / 数据获取
01 歌单索引页
from bs4 import BeautifulSoup import requests import time headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36' } for i in range(0, 1330, 35): print(i) time.sleep(2) url = 'https://music.163.com/discover/playlist/?cat=欧美&order=hot&limit=35&offset=' + str(i) response = requests.get(url=url, headers=headers) html = response.text soup = BeautifulSoup(html, 'html.parser') # 获取包含歌单详情页网址的标签 ids = soup.select('.dec a') # 获取包含歌单索引页信息的标签 lis = soup.select('#m-pl-container li') print(len(lis)) for j in range(len(lis)): # 获取歌单详情页地址 url = ids[j]['href'] # 获取歌单标题 title = ids[j]['title'] # 获取歌单播放量 play = lis[j].select('.nb')[0].get_text() # 获取歌单贡献者名字 user = lis[j].select('p')[1].select('a')[0].get_text() # 输出歌单索引页信息 print(url, title, play, user) # 将信息写入CSV文件中 with open('playlist.csv', 'a+', encoding='utf-8-sig') as f: f.write(url + ',' + title + ',' + play + ',' + user + '\n')
获取歌单索引页信息如下,共1302张华语歌单。
02 歌单详情页
from bs4 import BeautifulSoup import pandas as pd import requests import time df = pd.read_csv('playlist.csv', header=None, error_bad_lines=False, names=['url', 'title', 'play', 'user']) headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36' } for i in df['url']: time.sleep(2) url = 'https://music.163.com' + i response = requests.get(url=url, headers=headers) html = response.text soup = BeautifulSoup(html, 'html.parser') # 获取歌单标题 title = soup.select('h2')[0].get_text().replace(',', ',') # 获取标签 tags = [] tags_message = soup.select('.u-tag i') for p in tags_message: tags.append(p.get_text()) # 对标签进行格式化 if len(tags) > 1: tag = '-'.join(tags) else: tag = tags[0] # 获取歌单介绍 if soup.select('#album-desc-more'): text = soup.select('#album-desc-more')[0].get_text().replace('\n', '').replace(',', ',') else: text = '无' # 获取歌单收藏量 collection = soup.select('#content-operation i')[1].get_text().replace('(', '').replace(')', '') # 歌单播放量 play = soup.select('.s-fc6')[0].get_text() # 歌单内歌曲数 songs = soup.select('#playlist-track-count')[0].get_text() # 歌单评论数 comments = soup.select('#cnt_comment_count')[0].get_text() # 输出歌单详情页信息 print(title, tag, text, collection, play, songs, comments) # 将详情页信息写入CSV文件中 with open('music_message.csv', 'a+', encoding='utf-8-sig') as f: f.write(title + ',' + tag + ',' + text + ',' + collection + ',' + play + ',' + songs + ',' + comments + '\n') # 获取歌单内歌曲名称 li = soup.select('.f-hide li a') for j in li: with open('music_name.csv', 'a+', encoding='utf-8-sig') as f: f.write(j.get_text() + '\n')
获取的1302张华语歌单的详情。
1302张歌单里的121118首歌。
/ 03 / 数据可视化
可视化代码已上传GitHub,点击左下角阅读原文即可访问!!!
01 歌曲出现次数 TOP10
榜上的十首歌,除了「水星记」,小F听得次数都不少。
那么你又是如何的呢?
在小F的印象里,这些歌都曾在网易云音乐热歌榜的榜首出现过。
02 歌单贡献UP主 TOP10
10大歌单贡献UP主,感谢这些辛勤的“搬运工”,给大家带来优质的歌单。
给广大懒人癌患者,亦或选择困难症患者,带来福利。
03 歌单播放量 TOP10
歌单播放量前十名单,第一名7000多万播放量。
其实matplotlib生成的图是挺清楚的,只不过一上传就变模糊了。
所以这里你可能会觉得图片质量不行...
其实并不是,为此小F做了相应的图表,具体见文末~
04 歌单收藏量 TOP10
同样是好东西,收藏收藏!!!
有一些歌单和播放量TOP10里歌单有重复。
05 歌单评论数 TOP10
歌单「再见大侠:武侠小说泰斗金庸逝世」评论数最多。
相信不少人的阅读时光,就是与金庸前辈的武侠小说一起度过。
飞雪连天射白鹿,笑书神侠倚碧鸳。
还有由小说改编成的电视剧,都是经典!!!
小F武侠小说看的少,武侠电视剧看的多...
06 歌单收藏数量分布情况
将收藏数做对数处理,使得能直观看出歌单收藏数的分布。
主要分布在0-15万之间(ln(150000)=12)。
07 歌单播放数量分布情况
歌单播放数主要分布在0-1000万。
其中ln(10000000)=16。
08 歌单标签图
既然选取的是华语歌单,那么华语这二字必不可少,而且还占大头。
那么就看看除了华语,还有什么其他标签。
「流行」没啥好说的。
「古风」「说唱」「民谣」近些年来热度是越来越高,不过也有玩坏的时候。
比如「离人愁」、「一人我饮酒醉」,小F作为吃瓜群众,只能说且行且珍惜...
09 歌单介绍词云图
歌单介绍词云图,希望你能找到你喜欢某首歌的原因!!!
到底是希望,还是青春,亦或是回忆呢?
/ 04 / 总结
最后,把本次搜刮的干货,分享给大家。
可视化及相关代码都放「GitHub」上头了。
有兴趣的加群:960410445
项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。
SpringBoot+Mybatis+MySQL5.7的轻语音乐网
系统有1权限:管理员
用户管理模块:用户登录、用户注册、修改密码
榜单列表模块:动态地从数据库中获取歌曲的链接和数据在榜单中显示
歌曲搜索模块:在首页的搜索框中可以输入关键字进行歌曲的模糊搜索
歌曲收藏模块:在榜单列表中或搜索页面中可以点击歌曲进行收藏
我的音乐模块:收藏的歌曲会被添加到我的音乐列表中,在我的音乐列表中也可以对歌曲进行删除操作
音乐播放器模块:在榜单、搜索页面和我的音乐列表等地方点击歌曲可以跳转到播放页面进行播放。播放页面显示播放进度条,删除歌曲,暂停等操作。播放页面背景为模糊背景,根据歌手的专辑图片自动变化。
登录:
http://localhost:8082/index.html
账号密码:
李权 10086
*请认真填写需求信息,我们会在24小时内与您取得联系。