哔哩哔哩IT私塾python爬虫视频教程中的项目文件

视频链接:
Python课程天花板,Python入门+Python爬虫+Python数据分析5天项目实操/Python基础.Python教程_哔哩哔哩_bilibili

视频教程中要访问的链接
豆瓣电影 Top 250

httpbin.org

seo推广公司网站模板_站长素材

Examples - Apache ECharts

WordCloud for Python documentation — wordcloud 1.8.1 documentation

BeautifulSoup
用于解析HTML/XML文档,提取和操纵网页数据,常用于网页抓取。

re(正则表达式库)
提供正则表达式支持,用于字符串匹配、搜索和替换,适合数据清洗和验证。

urllib
处理URL和从网络获取数据,包括打开URL、处理异常和解析URLs,便于网页数据抓取。

xlwt
将数据写入旧版Excel文件(.xls),提供创建工作簿、工作表和写入数据的API。

Flask
轻量级Web应用框架,使用WSGI,提供路由和模板引擎,适合快速开发Web应用。

jieba
中文分词库,将中文文本切分为词语,是生成词云前的重要步骤。

matplotlib
绘图库,提供丰富的绘图功能,用于显示或保存生成的图表,如词云图。

wordcloud
生成词云的库,词云中词语大小表示其在文本中的出现频率,用于文本可视化。

PIL (Pillow)
图像处理库,用于打开、操作和保存多种格式图像,常用于生成词云时的遮罩图片处理。

numpy
数学函数库,提供大型多维数组和矩阵运算支持,常用于图像处理(如转换为数组)和数据分析。

sqlite3
SQLite数据库接口库,提供轻量级、嵌入式的关系型数据库管理功能,用于数据检索和存储。

第一个项目douban(纯python项目):爬取数据并保存到xls和数据库
spider.py

# -*- coding = utf-8 -*-

from bs4 import BeautifulSoup
import re
import urllib.request, urllib.error, urllib.parse
import xlwt
import sqlite3


def main():
    baseurl = 'https://movie.douban.com/top250?start='
    # 1、爬取网页
    datalist = getData(baseurl)

    savepath1 = "./豆瓣电影Top250.xls"
    saveData(datalist,savepath1)

    savepath2 = "./豆瓣电影Top250.db"
    initDB(savepath2)
    saveData2DB(datalist,savepath2)


# 影片链接的匹配规则
findLink = re.compile(r'<a href="(.*?)">')    # 匹配规则的正则表达式对象
# 影片图片
findImg = re.compile(r'<img.*src="(.*?)"', re.S)    #re.S忽略换行符
# 影片片名
findTitle = re.compile(r'<span class="title">(.*)</span>')
# 影片的评分
findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
# 影片评价人数
findJudge = re.compile(r'<span>(\d*)人评价</span>', re.S)
# 影片的概况
findInq = re.compile(r'<span class="inq">(.*)</span>')
# 影片的相关内容
findBd = re.compile(r'<p class="">(.*?)</p>', re.S)


def getData(baseurl):
    datalist = []
    num = 0
    # 2、逐一解析数据
    for i in range(0, 25):   # 调用获取页面信息的函数 10次
        url = baseurl + str(i*25)
        html = askURL(url)  # 保存获取到的单个页面的网页源码
        # html = urllib.request.urlopen(url).read()
        # 逐一解析数据
        soup = BeautifulSoup(html, 'html.parser')
        for item in soup.find_all("div", class_="item"):# 定位获取所需的标签内容
            # print(item) # 测试:单个电影item
            data = []
            item = str(item)

            link = re.findall(findLink, item)[0].replace('\xa0', "")    # \xa0(不间断空白符)
            data.append(link)

            imgSrc = re.findall(findImg, item)[0].replace('\xa0', "")
            data.append(imgSrc)

            title = re.findall(findTitle, item)
            if(len(title) >= 2):
                ctitle = title[0].replace('\xa0', "")
                data.append(ctitle)
                ftitle = title[1].replace('/',"").replace('\xa0', "")
                data.append(ftitle)
            elif(len(title) == 1):
                data.append(title[0].replace('\xa0', ""))
                data.append(" ")    # 第二个名称留空

            rating = re.findall(findRating, item)[0].replace('\xa0', "")
            data.append(rating)

            judge = re.findall(findJudge, item)[0].replace('\xa0', "")
            data.append(judge)

            inq = re.findall(findInq, item)
            if len(inq) != 0:
                inq = inq[0].replace('。',"").replace('\xa0', "")
                data.append(inq)
            else:
                data.append(" ")

            bd = re.findall(findBd, item)[0].replace('\xa0', "")
            bd = re.sub(r'<br(\s+)?/>(\s+)?', " ", bd)
            bd = re.sub('/', ' ', bd)
            data.append(bd.strip())

            if data:
                num +=1
            datalist.append(data)

    print(datalist)
    print(num)
    return datalist


# 得到指定一个URL的网页内容
def askURL(url):
    # 模拟浏览器头部信息
    head = {    # 这里访问的是www.douban.com,加上cookie才成功访问,不然会403
        "cookie":'''bid=lmDVVK_MwCE; dbcl2="287312225:gaIljLl3paE"; ck=A87B; _pk_ref.100001.4cf6=%5B%22%22%2C%22%22%2C1740403496%2C%22https%3A%2F%2Faccounts.douban.com%2F%22%5D; _pk_id.100001.4cf6=c5aee2ffb5a4b0b1.1740403496.; push_noty_num=0; push_doumail_num=0; __yadk_uid=FMUehx3EWLsxQlgs8OU0iEQf5rgnlRfM''',
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36 Edg/133.0.0.0" }
    # 用户代理: 表示告诉浏览器我们是什么类型的机器、浏览器(我们能接受什么信息)
    req = urllib.request.Request(url, headers=head)

    html = ""
    try:
        response = urllib.request.urlopen(req)
        html = response.read().decode("utf-8")
        # print(html)
    except urllib.error.URLError as e:
        if hasattr(e, 'code'):  # hasattr 含有指定变量与否
            print(e.code)
        if hasattr(e, 'reason'):
            print(e.reason)

    return html


def saveData(datalist,savepath):
    print("save...")
    book = xlwt.Workbook(encoding='utf-8', style_compression = 0)
    sheet = book.add_sheet('豆瓣电影Top250', cell_overwrite_ok=True)
    col = ("电影详情链接", "图片链接", "影片中文名", "影片外国名", "评分", "评价数", "概括", "相关信息")
    for i in range(0, 8):
        sheet.write(0, i, col[i])
    for i in range(0,250):
        print("第%d条"%(i+1))
        data = datalist[i]
        for j in range(0,8):
            sheet.write(i+1, j, data[j])

    book.save(savepath)


def saveData2DB(datalist,savepath):
    conn = sqlite3.connect(savepath)
    c = conn.cursor()
    print("豆瓣电影-------------------------------------------",len(datalist))
    for data in datalist:
        for i in range(len(data)):
            if i == 4 or i == 5:
                pass
            else:
                data[i] = '"'+str(data[i])+'"'
        sql = '''
            insert into movie250 (info_link,pic_link,cname,fname,score,rated,instroduction,relax_info)
            values (%s)'''%",".join(data)
        print(sql)
        c.execute(sql)

    conn.commit()
    conn.close()

    print("成功保存到数据库")


def initDB(dbpath):
    sql = '''
        create table if not exists movie250 (
            id integer primary key autoincrement,
            info_link text,
            pic_link text,
            cname varchar,
            fname varchar,
            score numeric,
            rated numeric,
            instroduction text,
            relax_info text
        )
    '''
    conn = sqlite3.connect(dbpath)
    c = conn.cursor()
    c.execute(sql)
    conn.commit()
    conn.close()


if __name__ == '__main__':
    main()

第二个项目douban_flask(flask项目):把第一个项目得到的数据库文件的数据可视化
这里只给出python文件,其他文件看教程视频自行下载或看上传的资源又或者GitHub - chenzanhong/Douban_DataVis: 把项目douban获取到的数据(movie.db)可视化:
app.py:

from flask import Flask,render_template
import sqlite3


app = Flask(__name__)


@app.route('/')
def index():  # put application's code here
    return render_template('index.html')


@app.route('/index')
def home():  # put application's code here
    return render_template('index.html')
    # return index()    # 请求转发


@app.route('/movie')
def movie():  # put application's code here
    datalist = []
    conn = sqlite3.connect('豆瓣电影Top250.db')
    c = conn.cursor()
    sql = '''select * from movie250'''
    data = c.execute(sql)
    for item in data:
        datalist.append(item)
    c.close()
    conn.close()
    return render_template('movie.html', movies=datalist)


@app.route('/score')
def score():  # put application's code here
    score = []  # 评分
    num = []    # 每个评分的电影数
    conn = sqlite3.connect('豆瓣电影Top250.db')
    c = conn.cursor()
    sql = '''select score,count(score) from movie250 group by score'''
    data = c.execute(sql)
    for item in data:
        score.append(item[0])
        num.append(item[1])
    c.close()
    conn.close()
    return render_template('score.html', score=score, num=num)


@app.route('/word')
def word():  # put application's code here
    return render_template('word.html')


@app.route('/team')
def team():  # put application's code here
    return render_template('team.html')




if __name__ == '__main__':
    app.run()

test_WordCloud.py:

import jieba    # 分词

# 设置 Matplotlib 后端(如果需要)
import matplotlib
matplotlib.use('TkAgg')  # 或者 'Agg', 'Qt5Agg', 等,取决于你的系统支持

from matplotlib import pyplot as plt    # 绘图,数据可视化
from wordcloud import WordCloud # 词云
from PIL import Image   # 图片处理
import numpy as np  # 矩阵运算
import sqlite3  # 数据库


# 准备词云所需的句子
conn = sqlite3.connect('豆瓣电影Top250.db')
c = conn.cursor()
sql = '''select instroduction from movie250'''
data = c.execute(sql)
text = ""
for item in data:
    text += item[0]
    # print(item[0])
print(text)
c.close()
conn.close()

# 分词
cut = jieba.cut(text)
str = ' '.join(cut)
print(len(str))


# 准备
img = Image.open(r'static\assets\img\b.jpg') # 打开遮罩图片
img_array = np.array(img)   # 将图片转换为数据
wc = WordCloud(
    background_color = 'white',
    mask = img_array,
    font_path = r"C:\Windows\Fonts\STXINWEI.TTF",    # 改为自己电脑下的路径
    scale = 4,  # 缩放
    # width
    # height

)
wc.generate_from_text(str)


# 绘制图片
fig = plt.figure(1)
plt.imshow(wc)
plt.axis('off') # 是否显示坐标轴
# plt.show()  # 显示生成的图片
plt.savefig(r'static\assets\img\b2wc.jpg',dpi=500)  # dpi为清晰度,可选

效果:
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/980645.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实验:k8s+keepalived+nginx+iptables

1、创建两个nginx的pod&#xff0c;app都是nginx nginx1 nginx2 2、创建两个的pod的service 3、配置两台keepalived的调度器和nginx七层反向代理&#xff0c;VIP设置192.168.254.110 keepalived调度器master keepalived调度器backup 两台调度器都配置nginx七层反向代理&#…

【Cadence仿真学习笔记】ADS Dynamic Link报错model is reserved的解决办法

首先创建好原理图 创建symbol 在library manager下就会出现symbol了 在Cadence的CIW窗口中运行ADS dynamic link 打开ADS后&#xff0c;创建对应的cellview 加入控件OPTIONS 加入网表netlist 这个时候的Netlist没有路径 点击加载symbol 把原来的netlist include删掉…

【星云 Orbit • STM32F4】06. 串口密码:USART 数据传递

1. 引言 STM32F407是一款高性能的微控制器&#xff0c;具有丰富的外设和强大的处理能力。串口&#xff08;USART&#xff09;是STM32F407的重要外设之一&#xff0c;广泛应用于数据通信、调试和控制等领域。本教程旨在帮助小白从零开始&#xff0c;手动配置STM32F407的串口功能…

Win32 C++ 电源计划操作

CPowerCfgUtils.h #pragma once#include <Windows.h> #include <powrprof.h>// https://learn.microsoft.com/zh-cn/windows/win32/api/powrprof/?sourcerecommendations//节能 //DEFINE_GUID(GUID_MAX_POWER_SAVINGS, 0xA1841308, 0x3541, 0x4FAB, 0xBC, 0x81, …

MySQL—使用binlog日志恢复数据

一、binlog日志恢复数据简介 在 MySQL 中&#xff0c;使用二进制日志&#xff08;binlog&#xff09;恢复数据是一种常见的用于故障恢复或数据找回的方法。以下是详细的使用步骤&#xff1a; 确认 binlog 已启用&#xff1a;首先需要确认 MySQL 服务器已经启用了二进制日志功…

基于springboot+vue实现的宠物救助及领养平台(源码+L文+ppt)43-21

摘 要 宠物救助及领养平台是一个专注于宠物保护和幸福的在线平台。它致力于连接那些需要帮助的宠物与愿意给予它们关爱的家庭。通过这个平台&#xff0c;人们可以报告丢失的宠物、寻求救助资源&#xff0c;以及浏览可领养的宠物信息。该平台不仅提供了一个渠道&#xff0c;让…

人大金仓国产数据库与PostgreSQL

一、简介 在前面项目中&#xff0c;我们使用若依前后端分离整合人大金仓&#xff0c;在后续开发过程中&#xff0c;我们经常因为各种”不适配“问题&#xff0c;但可以感觉得到大部分问题&#xff0c;将人大金仓视为postgreSQL就能去解决大部分问题。据了解&#xff0c;Kingba…

【Java分布式】Nacos注册中心

Nacos注册中心 SpringCloudAlibaba 也推出了一个名为 Nacos 的注册中心&#xff0c;相比 Eureka 功能更加丰富&#xff0c;在国内受欢迎程度较高。 官网&#xff1a;https://nacos.io/zh-cn/ 集群 Nacos就将同一机房内的实例划分为一个集群&#xff0c;一个服务可以包含多个集…

派可数据BI接入DeepSeek,开启智能数据分析新纪元

派可数据BI产品完成接入DeepSeek&#xff0c;此次接入标志着派可数据BI在智能数据分析领域迈出了重要一步&#xff0c;将为用户带来更智能、更高效、更便捷的数据分析体验。 派可数据BI作为国内领先的商业智能解决方案提供商&#xff0c;一直致力于为用户提供高效、稳定易扩展…

【漫话机器学习系列】110.线性可分(Linearly Separable)

线性可分与线性不可分的概念详解 1. 引言 在机器学习和模式识别领域&#xff0c;分类问题是一个重要的研究方向。在分类任务中&#xff0c;我们通常需要将不同类别的数据点分开&#xff0c;而如何进行分割是一个关键问题。线性可分&#xff08;Linearly Separable&#xff09…

架构师面试(九):缓存一致性

问题 关于【数据库和缓存】一致性&#xff0c;下面哪几项是在线上生产环境中相对合理的处理方式&#xff1f; A. 对于查询操作&#xff0c;先查缓存&#xff0c;如果为空则查 DB&#xff0c;然后将数据带入缓存&#xff1b; B. 对于插入操作&#xff0c;只写 DB 即可&#…

LearnOpenGL之Shader编程用算法绘画

———————————————————— 前序 ——————————————————— AndroidLearnOpenGL是本博主自己实现的LearnOpenGL练习集合&#xff1a; Github地址&#xff1a;GitHub - wangyongyao1989/AndroidLearnOpenGL: OpenGL基础及运用 系列文章&#xff…

基于 Flink CDC YAML 的 MySQL 到 Kafka 流式数据集成

本教程的演示都将在 Flink CDC CLI 中进行&#xff0c;无需一行 Java/Scala 代码&#xff0c;也无需安装 IDE。 这篇教程将展示如何基于 Flink CDC YAML 快速构建 MySQL 到 Kafka 的 Streaming ELT 作业&#xff0c;包含整库同步、表结构变更同步演示和关键参数介绍。 准备阶段…

【Maven】基于IDEA进行Maven工程的创建、构建

文章目录 一、基于IDEA创建Maven工程1. 概念梳理Maven工程的GAVP2. Idea构建Maven Java SE工程3. Idea构建Maven Java Web工程3.1 创建一个maven的javase工程3.2 修改pom.xml文件打包方式3.3 设置web资源路径和web.xml路径 4. Maven工程项目结构说明 二、基于IDEA进行Maven工程…

计算机毕业设计SpringBoot+Vue.js在线课程管理系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

【爬虫基础】第二部分 爬虫基础理论 P3/3

上节内容回顾&#xff1a;【爬虫基础】第一部分 网络通讯 P1/3-CSDN博客 【爬虫基础】第一部分 网络通讯-Socket套接字 P2/3-CSDN博客 【爬虫基础】第一部分 网络通讯-编程 P3/3-CSDN博客 【爬虫基础】第二部分 爬虫基础理论 P1/3-CSDN博客 【爬虫基础】第二部分 爬虫基础理论…

【子网掩码计算器:Python + Tkinter 实现】

子网掩码计算器&#xff1a;Python Tkinter 实现 引言代码功能概述代码实现思路1. 界面设计2. 功能实现3. 事件处理 子网掩码计算器实现步骤1. 导入必要的库2. 定义主窗口类 SubnetCalculatorApp3. 创建菜单栏4. 创建界面组件5. 判断 IP 地址类别6. 计算子网信息7. 其他功能函…

【第十节】C++设计模式(结构型模式)-Flyweight( 享元)模式

目录 一、问题背景 二、模式选择 三、代码实现 四、总结讨论 一、问题背景 享元模式&#xff08;Flyweight Pattern&#xff09;在对象存储优化中的应用 在面向对象系统的设计与实现中&#xff0c;创建对象是最常见的操作之一。然而&#xff0c;如果一个应用程序使用了过多…

macOS - 使用 tmux

文章目录 安装 tmux使用更多快捷键说明 安装 tmux brew install tmux使用 在终端输入 tmux 进入 tmux 界面&#xff0c;然后 输入 Control Option B 进入交互模式 输入 % 左右分栏&#xff0c;" 上下分割 上一个窗格&#xff1a;{&#xff0c;下一个&#xff1a;} PS…

【洛谷贪心算法题】P1094纪念品分组

该题运用贪心算法&#xff0c;核心思想是在每次分组时&#xff0c;尽可能让价格较小和较大的纪念品组合在一起&#xff0c;以达到最少分组的目的。 【算法思路】 输入处理&#xff1a;首先读取纪念品的数量n和价格上限w&#xff0c;然后依次读取每件纪念品的价格&#xff0c;…