Python爬取豆瓣+数据可视化
博客原文和源码下载:Python爬取豆瓣+数据可视化
前言
前段时间应我姐邀请,看了一下Python爬虫。不得不说Python的语法确实简洁优美,可读性强,比较接近自然语言,非常适合编程的初学者上手。
在开始之前还是先介绍下什么是爬虫:
网络爬虫(英语:web crawler),也叫网络蜘蛛(spider),是一种用来自动浏览万维网的网络机器人。 – 维基百科
爬虫是一种程序或者脚本,用来替代人工浏览网页并从中提取信息,通常将提取的信息存储然后对其进行分析,从而获取有价值的信息。
爬虫也不是什么新鲜事物,可以说只要是编程语言几乎都能做到,而Python因为其简洁的语法和丰富的第三方库可以快速高效的编写爬虫,对于初学者可以说相当友好。接下来以爬取豆瓣电影TOP250页面为例说明如何用Python实现爬虫和数据可视化。
实现步骤
一、HTTP请求
导入第三方库requests,调用requests.get()方法向豆瓣电影TOP250页面发起GET请求,拿到响应的HTML。
二、数据提取
浏览器访问豆瓣电影TOP250页面并进入开发者模式复制要抓取节点的XPath。导入第三方库lxml的etree对象,调用etree.HTML(HTML)将HTML转换成element对象,然后使用element.xpath(XPath)方法拿到抓取的节点的文本(PS:也可以使用正则匹配文本)。
三、数据存储
导入第三方库openpyxl,调用openpyxl.Workbook()方法获取一个新的工作簿workbook,写入workbook.active=sheet获得一个工作表的引用sheet,为excel表指定位置添加数据:sheet[“A1”]=value,最后使用workbook.save(”excel表名“)保存数据,这里不用数据库是为了方便没有编程基础也能查看数据。
四、继续爬取
根据爬取页面的URL参数重复以上步骤,如豆瓣电影TOP250有两个参数start和filter,start表示页面的电影排行从TOP几的后一个开始,每个页面有25个电影,也就是说第一个页面参数start=0,第二个页面参数start=25,filter为过滤,暂时不用管,请求下一个页面时GET请求的参数start+25即可。
五、数据可视化
调用openpyxl.load_workbook(“excel表名”)方法获取存放数据的excel表,写入workbook.active=sheet获得一个工作表的引用,获取excel表指定位置的数据:data=sheet[“A1”].value。然后导入第三方库pyecharts,并根据文档调用合适的API生成图表实现数据可视化。
爬虫开发
创建一个项目Crawler,安装使用的第三方库:
pip install requests
pip install lxml
pip install openpyxl
pip install pyecharts
接下来在项目目录下新建文件html_parser.py:
from lxml import etreeclass HTMLParser: # HTML解析类def __init__(self):pass# 返回豆瓣电影Top250页面特定序号的电影的相关数据def parse(self, html, number):movie = {"title": "", "actors": "", "classification": "", "score": "", "quote": ""}selector = etree.HTML(html)movie["title"] = selector.xpath('//*[@id="content"]/div/div[1]/ol/li[' + str(number) + ']/div/div[2]/div[1]/a/span[1]/text()')[0]movie["actors"] = selector.xpath('//*[@id="content"]/div/div[1]/ol/li[' + str(number) + ']/div/div[2]/div[2]/p[1]/text()[1]')[0]movie["classification"] = selector.xpath('//*[@id="content"]/div/div[1]/ol/li[' + str(number) + ']/div/div[2]/div[2]/p[1]/text()[2]')[0]movie["score"] = selector.xpath('//*[@id="content"]/div/div[1]/ol/li[' + str(number) + ']/div/div[2]/div[2]/div/span[2]/text()')[0]# 如果存在则为该值,否则为空movie["quote"] = selector.xpath('//*[@id="content"]/div/div[1]/ol/li[' + str(number) + ']/div/div[2]/div[2]/p[2]/span/text()')[0] if len(selector.xpath('//*[@id="content"]/div/div[1]/ol/li[' + str(number) + ']/div/div[2]/div[2]/p[2]/span/text()')) > 0 else ""return movie
该模块封装了解析豆瓣电影TOP250页面并提取数据的方法。
然后同样新建文件excel_handler.py:
import openpyxlclass ExcelHandler: # excel文件处理类__book = None__sheet = Nonedef __init__(self):self.book = Noneself.sheet = Nonepass# 获取工作簿并获得工作表的引用def startHandleExcel(self):self.book = openpyxl.Workbook()self.sheet = self.book.active# 为A、B、C、D、E列的指定行添加数据def handleExcel(self, row, A, B, C, D, E):self.sheet["A" + str(row)] = str(A).strip()self.sheet["B" + str(row)] = str(B).strip()self.sheet["C" + str(row)] = str(C).strip()self.sheet["D" + str(row)] = str(D).strip()self.sheet["E" + str(row)] = str(E).strip()return True# 处理完成保存exceldef endHandleExcel(self, fileName):self.book.save(fileName)# 读取excel并获得工作表的引用def startReadExcel(self, fileName):self.book = openpyxl.load_workbook(fileName)self.sheet = self.book.active# 读取excel指定位置的数据def readExcel(self, coordinate):return str(self.sheet[coordinate].value)# 读取完成def endReadExcel(self):pass
该模块封装了存储和读取excel表的方法。
接下来在mian.py中写入:
import requests
import random
import timefrom html_parser import HTMLParser
from excel_handler import ExcelHandler
from pyecharts import options as opts
from pyecharts.charts import Bardef crawling(): # 爬取豆瓣电影Top250函数# 定义当前处理的excel表的行excelRow = 1# 实例化excel处理类excelHandler = ExcelHandler()# 开始处理excelexcelHandler.startHandleExcel()# 在excel表中添加标题行excelHandler.handleExcel(excelRow, "名字", "演员", "分类", "评分", "引言")# 处理的行+1excelRow += 1# 定义豆瓣电影Top250页面的地址和所使用的user-agent(伪装为正常浏览器)url = "https://movie.douban.com/top250"headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/89.0.4389.82 Safari/537.36"}# 实例化网页解析类htmlParser = HTMLParser()print("开始爬取豆瓣电影Top250...")# 爬取豆瓣电影Top250的十个网页for page in range(10):# 定义URL的参数param = {"start": page * 25, "filter": ""}# 发起GET请求response = requests.get(url=url, params=param, headers=headers).text# 将请求结果页的25个电影信息存入excelfor list in range(25):print("正在处理" + str(page + 1) + "页的第" + str(list + 1) + "部电影...")# 解析电影的信息movie = htmlParser.parse(response, list + 1)# 将解析结果存入excelexcelHandler.handleExcel(excelRow, movie["title"], movie["actors"], movie["classification"], movie["score"],movie["quote"])# 处理的行+1excelRow += 1print("第" + str(page + 1) + "页爬取完成!")# 等待5-20秒之后再次爬取,模拟人的操作time.sleep(random.randint(5, 20))# excel存入完成excelHandler.endHandleExcel("movies.xlsx")print("豆瓣电影Top250爬取完成!")def getCharts(): # 绘制评分数据图函数# 定义评分的字典scoreLevel = {}# 实例化excel处理类excelHandler = ExcelHandler()# 开始读取excel表excelHandler.startReadExcel("movies.xlsx")print("开始读取excel表中的评分列...")# 循环遍历excel表评分列for row in range(250):# 从excel表中读取评分列作为字典的keykey = excelHandler.readExcel("D" + str(row + 2))# 如果该key存在则+1if key in scoreLevel:scoreLevel[key] += 1# 否则初始化该key的值为1else:scoreLevel[key] = 1# 读取excel结束excelHandler.endReadExcel()# 定义一个列表表示scoreLevel字典所有的key(即评分)keys = []# 定义一个列表表示scoreLevel字典所有的value(即该评分的数量)values = []# 提取scoreLevel的key和valuefor key in scoreLevel:keys.append(key)values.append(scoreLevel[key])print("评分数据读取完成!")print("开始绘制评分数据图...")# 绘制柱状图c = (Bar().add_xaxis(keys).add_yaxis("评分:数量(部)", values).set_global_opts(title_opts=opts.TitleOpts(title="豆瓣电影评分Top250"),toolbox_opts=opts.ToolboxOpts(),legend_opts=opts.LegendOpts(is_show=False),).render("movies_score.html"))print("评分数据图绘制完成!")# 爬取豆瓣电影TOP250
crawling()# 绘制评分数据图
getCharts()
main.py中的两个函数分别实现爬取豆瓣电影TOP250并存储数据和读取数据进行数据可视化操作,具体的过程已在注释中详细标注。
源码
源码下载访问博客原文:Python爬取豆瓣+数据可视化
相关链接
requests
lxml
openpyxl
pyecharts
Python 网络爬虫之Requests库的基本用法
python–lxml.etree解析html
Openpyxl 教程
最后
Python有很多优秀的爬虫框架,有兴趣可以自行了解,例如:
8个最高效的Python爬虫框架,你用过几个?
最后,爬虫不是什么内容都可以爬取,所谓"爬虫写的好,监狱进的早",在爬取内容之前得先看一下:
网络爬虫的法律规制
网络爬虫?你可能面临的法律责任
网络爬虫robots.txt的作用以及规范写法
等相关规范和限制。
Python爬取豆瓣+数据可视化相关推荐
- Python爬取天气数据及可视化分析!
来源丨Python之王 Python爬取天气数据及可视化分析 说在前面 天气预报我们每天都会关注,我们可以根据未来的天气增减衣物.安排出行,每天的气温.风速风向.相对湿度.空气质量等成为关注的焦点.本 ...
- Python爬取天气数据及可视化分析
Python爬取天气数据及可视化分析 文章目录 Python爬取天气数据及可视化分析 说在前面 1.数据获取 请求网站链接 提取有用信息 保存csv文件 2.可视化分析 当天温度变化曲线图 当天相对湿 ...
- python实现天气数据爬取实现数据可视化和天气查询gui界面设计
在学校大一实训中,我的实训项目就是使用python爬取天气数据并且实现gui图形界面的设计. 实训结束了,希望自己的代码可以帮助大家的学习.(代码是大一时候写的,比较青涩,大家多包涵) 第一个部分是g ...
- 如何使用Python爬取基金数据,并可视化显示
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于Will的大食堂,作者打饭大叔 前言 美国疫情越来越严峻,大选也进入 ...
- python爬取豆瓣电影评论_python 爬取豆瓣电影评论,并进行词云展示及出现的问题解决办法...
def getHtml(url): """获取url页面""" headers = {'User-Agent':'Mozilla/5.0 ( ...
- python爬取豆瓣影评理论依据_我用Python爬取了豆瓣的影评
使用Python爬取豆瓣的影评,比爬取网易云简单,因为不需要设置特定的headers,关于网易云说几句,很难爬取,对请求头有着严格的要求,前几年那会还好些. 爬取结果分为:用户名,评价的星级,评论的内 ...
- 利用python爬取豆瓣电影top250
利用python爬取豆瓣电影top250: 注:本内容只是作为个人学习记录 1.业务分析 进入网页https://movie.douban.com/top250 可以看见每部电影都呈现在眼前,点击电影 ...
- Python爬取豆瓣电影top250的电影信息
Python爬取豆瓣电影top250的电影信息 前言 一.简介 二.实例源码展示 小结 前言 相信很多小伙伴在学习网络爬虫时,老师们会举一些实例案例讲解爬虫知识,本文介绍的就是经典爬虫实际案例–爬取豆 ...
- Python小姿势 - Python爬取网页数据
Python爬取网页数据 爬取网页数据是一个比较常见的Python应用场景,有很多第三方库可以帮助我们完成这个任务.这里我们介绍一下urllib库中的一个常用方法:urllib.request.url ...
最新文章
- 全球首个 AI 说唱歌手 TikTok 发新歌,虚拟偶像正当时
- 小姐姐在硅谷生活了三年,实现了理想的生活模式
- Firefox下div层被Flash遮住的解决方法
- Java字符串与包装类
- asp.net Session丢失问题
- [Java基础]自定义注解之属性定义
- 二十四节气插画素材,每一张都带你如感
- [Ext JS 4] Extjs 图表 Legend(图例)的分行与分列显示
- 什么是智能标签?DevExpress WPF控件这份入门指南请查收
- 解决Firefox3下Flashgot的”AddRef”问题
- 无状态,无连接的理解
- 自定义考勤统计日历(二)
- QT子窗体直接调用父窗体成员、函数、控件的方法
- 3288 配置声卡芯片
- 本周 GitHub 速览:自动化当道,破密、爬虫各凭本事
- Log of Grade Two
- 超有创意的素材模板,摸鱼的技能又提升了
- 一个外语达人的经验(转自天涯)
- 水煮旅途之“天山夜话”
- H3C 交换机封锁445端口防御病毒和漏洞
热门文章
- Intent意图的深入
- iphone html5音乐播放器,从界面到功能 五款iPhone音乐播放器年度横评
- 新学问教育php,神墨教师的教育梦——让梦想与爱同行
- 人体生物钟,24小时器官工作表
- POJ 1984 Navigation Nightmare 【经典带权并查集】
- MySQL Packet for query is too large (xxx > xxx)...by setting the ‘max_allowed_packet‘ variable.的解决办法
- 如何写接口,有什么规范?
- iOS下载不了迅雷怎么办
- C++ 指向数组的指针
- wordpress ajax请求,在wordpress中如何使用ajax