博客原文和源码下载: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爬取豆瓣+数据可视化相关推荐

  1. Python爬取天气数据及可视化分析!

    来源丨Python之王 Python爬取天气数据及可视化分析 说在前面 天气预报我们每天都会关注,我们可以根据未来的天气增减衣物.安排出行,每天的气温.风速风向.相对湿度.空气质量等成为关注的焦点.本 ...

  2. Python爬取天气数据及可视化分析

    Python爬取天气数据及可视化分析 文章目录 Python爬取天气数据及可视化分析 说在前面 1.数据获取 请求网站链接 提取有用信息 保存csv文件 2.可视化分析 当天温度变化曲线图 当天相对湿 ...

  3. python实现天气数据爬取实现数据可视化和天气查询gui界面设计

    在学校大一实训中,我的实训项目就是使用python爬取天气数据并且实现gui图形界面的设计. 实训结束了,希望自己的代码可以帮助大家的学习.(代码是大一时候写的,比较青涩,大家多包涵) 第一个部分是g ...

  4. 如何使用Python爬取基金数据,并可视化显示

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于Will的大食堂,作者打饭大叔 前言 美国疫情越来越严峻,大选也进入 ...

  5. python爬取豆瓣电影评论_python 爬取豆瓣电影评论,并进行词云展示及出现的问题解决办法...

    def getHtml(url): """获取url页面""" headers = {'User-Agent':'Mozilla/5.0 ( ...

  6. python爬取豆瓣影评理论依据_我用Python爬取了豆瓣的影评

    使用Python爬取豆瓣的影评,比爬取网易云简单,因为不需要设置特定的headers,关于网易云说几句,很难爬取,对请求头有着严格的要求,前几年那会还好些. 爬取结果分为:用户名,评价的星级,评论的内 ...

  7. 利用python爬取豆瓣电影top250

    利用python爬取豆瓣电影top250: 注:本内容只是作为个人学习记录 1.业务分析 进入网页https://movie.douban.com/top250 可以看见每部电影都呈现在眼前,点击电影 ...

  8. Python爬取豆瓣电影top250的电影信息

    Python爬取豆瓣电影top250的电影信息 前言 一.简介 二.实例源码展示 小结 前言 相信很多小伙伴在学习网络爬虫时,老师们会举一些实例案例讲解爬虫知识,本文介绍的就是经典爬虫实际案例–爬取豆 ...

  9. Python小姿势 - Python爬取网页数据

    Python爬取网页数据 爬取网页数据是一个比较常见的Python应用场景,有很多第三方库可以帮助我们完成这个任务.这里我们介绍一下urllib库中的一个常用方法:urllib.request.url ...

最新文章

  1. 全球首个 AI 说唱歌手 TikTok 发新歌,虚拟偶像正当时
  2. 小姐姐在硅谷生活了三年,实现了理想的生活模式
  3. Firefox下div层被Flash遮住的解决方法
  4. Java字符串与包装类
  5. asp.net Session丢失问题
  6. [Java基础]自定义注解之属性定义
  7. 二十四节气插画素材,每一张都带你如感
  8. [Ext JS 4] Extjs 图表 Legend(图例)的分行与分列显示
  9. 什么是智能标签?DevExpress WPF控件这份入门指南请查收
  10. 解决Firefox3下Flashgot的”AddRef”问题
  11. 无状态,无连接的理解
  12. 自定义考勤统计日历(二)
  13. QT子窗体直接调用父窗体成员、函数、控件的方法
  14. 3288 配置声卡芯片
  15. 本周 GitHub 速览:自动化当道,破密、爬虫各凭本事
  16. Log of Grade Two
  17. 超有创意的素材模板,摸鱼的技能又提升了
  18. 一个外语达人的经验(转自天涯)
  19. 水煮旅途之“天山夜话”
  20. H3C 交换机封锁445端口防御病毒和漏洞

热门文章

  1. Intent意图的深入
  2. iphone html5音乐播放器,从界面到功能 五款iPhone音乐播放器年度横评
  3. 新学问教育php,神墨教师的教育梦——让梦想与爱同行
  4. 人体生物钟,24小时器官工作表
  5. POJ 1984 Navigation Nightmare 【经典带权并查集】
  6. MySQL Packet for query is too large (xxx > xxx)...by setting the ‘max_allowed_packet‘ variable.的解决办法
  7. 如何写接口,有什么规范?
  8. iOS下载不了迅雷怎么办
  9. C++ 指向数组的指针
  10. wordpress ajax请求,在wordpress中如何使用ajax