网络爬虫丨基于requests+mysql爬取猫眼热门电影数据做可视化分析

文章目录

  • 写在前面
    • 实验描述
    • 实验内容
    • 遇到问题
  • 写在后面

写在前面

本期内容:基于requests+mysql爬取猫眼热门电影数据做可视化分析

实验需求

  • anaconda丨pycharm
  • python3.11.4
  • requests
  • mysql

项目下载地址:https://download.csdn.net/download/m0_68111267/88737727

实验描述

学习网络爬虫相关技术,熟悉爬虫基本库requests的使用;学习数据库技术,熟悉mysql数据库的基本操作。本文博主将用requests库抓取猫眼热门电影的数据,将数据保存在mysql数据库中,然后再用tkinter做可视化分析。

实验内容

1. 分析猫眼热门电影的网页信息

我们先进入要抓取数据的网页:http://maoyan.com/board/4?offset=0

然后分别进入不同页码,分析热门电影每一页的网址信息:

1
2
3

这里不难发现,其实每页的网址是有规律的,0、10、20……网址的最后每次会增加10,也就是说我们要爬取的网址应该是:

    http://films.com/board/4?offset=0
    http://films.com/board/4?offset=10
    http://films.com/board/4?offset=20
    ……
    http://films.com/board/4?offset=90

2. 创建mysql数据库

编写"db.py"文件,运行该文件可以连接到mysql数据库并创建本项目需要的电影表:

程序设计

import logging
import pymysql

logger = logging.getLogger("db_log.txt")
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
file_handler = logging.FileHandler("db_log.txt")
file_handler.setFormatter(formatter)
logger.setLevel(logging.INFO)
logger.addHandler(file_handler)


class DBHelper:
    def __init__(self, host="localhost", user="root",
                 password="123456", db="test", port=3306):
        self.host = host
        self.user = user
        self.password = password
        self.db = db
        self.port = port
        self.conn = None
        self.cur = None

    def connectDataBase(self):
        try:
            self.conn = pymysql.connect(host="localhost", user="root",
                                        password="123456", db="test", port=3306)
        except:
            logger.error("connectDataBase Error")
            return False
        self.cur = self.conn.cursor()
        return True

    def execute(self, sql, params=None):
        if not self.connectDataBase():
            return False
        try:
            if self.conn and self.cur:
                self.cur.execute(sql, params)
                self.conn.commit()
        except:
            logger.error(str(sql))
            return False
        return True

    def fetchCount(self, sql, params=None):
        if not self.connectDataBase():
            return False
        self.execute(sql, params)
        return self.cur.fetchone()

    def myClose(self):
        if self.cur:
            self.cur.close()
        if self.conn:
            self.conn.close()
        return True


if __name__ == '__main__':
    dbhelper = DBHelper()
    sql = 'create table films(title varchar(50), actor varchar(200), time varchar(100));'
    result = dbhelper.execute(sql, None)
    if result:
        print("创建成功")
    else:
        print("创建失败,详情见日志文件")
    dbhelper.myClose()
    logger.removeHandler(file_handler)

程序分析

这段代码是一个封装了数据库操作的工具类 DBHelper。具体分析如下:

  1. 该工具类使用了 logging 模块来记录日志信息。首先创建了一个 logger 对象,并设置了记录日志格式和保存日志文件的对象。然后设置日志级别为 INFO,并将 file_handler 添加到 logger 中。

  2. DBHelper 类的构造函数中,初始化了数据库的连接信息(host、user、password、db、port)和连接对象 conn、游标对象 cur。这些连接信息是硬编码的,可以根据实际情况进行修改。

  3. connectDataBase() 方法用于连接数据库。首先尝试使用 pymysql.connect() 方法连接数据库,如果连接失败,则记录错误日志并返回 False。如果连接成功,则返回 True。

  4. execute() 方法用于执行 SQL 语句。该方法首先调用 connectDataBase() 方法来确保数据库连接。然后使用游标对象的 execute() 方法执行 SQL 语句,并提交事务。如果执行过程中出现异常,则记录错误日志并返回 False。如果执行成功,则返回 True。

  5. fetchCount() 方法用于执行查询操作,并返回结果。该方法首先调用 execute() 方法执行 SQL 语句。然后使用游标对象的 fetchone() 方法获取查询结果的第一条记录。如果执行过程中出现异常,则返回 False。如果执行成功,则返回查询结果。

  6. myClose() 方法用于关闭连接和游标。该方法首先判断游标和连接是否存在,如果存在则关闭它们,并返回 True。

  7. 在主程序中,首先创建了一个 DBHelper 对象 dbhelper。然后使用 execute() 方法执行了一个创建表的 SQL 语句,并将执行结果存储在 result 变量中。根据执行结果,打印出相应的消息。最后使用 myClose() 方法关闭连接和游标,并将 file_handler 从 logger 中移除。

总的来说,这段代码封装了数据库操作的工具类 DBHelper,通过调用该类的方法,可以实现连接数据库、执行 SQL 语句、获取查询结果等操作。使用 logging 模块记录日志信息,方便调试和错误追踪。该工具类可以在其他代码中被引用,简化了数据库操作的代码编写。

运行结果

4

3. 尝试抓取热门电影的数据

编写文件"test.py",尝试抓取热门电影的信息:

程序设计

import requests
from lxml import etree
from requests_html import UserAgent

url = "https://www.maoyan.com/board/4?offset=0"
ua_headers = {
    "User-Agent": UserAgent().random
}
reponse = requests.get(url, headers=ua_headers)

tree = etree.HTML(reponse.text)
titles = tree.xpath('/html/body/div[4]/div/div/div[1]/dl/dd/div/div/div[1]/p[1]/a/text()')
actors = tree.xpath('/html/body/div[4]/div/div/div[1]/dl/dd/div/div/div[1]/p[2]/text()')
times = tree.xpath('/html/body/div[4]/div/div/div[1]/dl/dd/div/div/div[1]/p[3]/text()')

items = []
for i in range(len(titles)):
    title = titles[i].strip()
    actor = actors[i].strip()
    time = times[i].strip()
    items.append({
        'title': title,
        'actor': actor[3:],
        'time': time[5:]
    })
for i in items:
    print(i)

程序分析

这段代码是一个简单的爬虫程序,用于从猫眼电影网站上爬取电影的标题、演员和上映时间信息。

首先,导入需要的模块:requests用于发送HTTP请求,lxml用于解析HTML文档,requests_html中的UserAgent类用于生成随机的User-Agent头。然后,定义了要爬取的URL和设置了User-Agent头。使用requests.get()方法发送GET请求,将响应保存在response变量中。接下来,使用etree.HTML()方法将响应的文本内容解析为一个可用于XPath解析的HTML文档树tree

随后,使用XPath表达式定位到电影标题、演员和上映时间元素,并使用tree.xpath()方法提取出相应的文本内容,保存在titlesactorstimes变量中。接下来,使用一个循环遍历这些信息,并通过strip()方法去除首尾的空白字符。然后,将标题、演员和上映时间组合成一个字典,并添加到items列表中。最后,打印出items列表,即爬取到的电影信息。

运行结果

5

4. 抓取热门电影数据并可视化分析

编写文件"films.py",抓取猫眼热门电影的信息,将抓取到的信息先保存到前面创建的mysql数据库中,然后再从数据库中读出来做可视化分析:

程序设计

import requests
import db
from lxml import etree
from multiprocessing import Pool, Manager
import functools
import matplotlib.pyplot as plt
from requests_html import UserAgent
import logging

plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题

# 获取logger的实例
logger = logging.getLogger("films_log.txt")
# 指定logger的输出格式
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
# 文件日志,终端日志
file_handler = logging.FileHandler("films_log.txt")
file_handler.setFormatter(formatter)

# 设置默认的级别
logger.setLevel(logging.INFO)
logger.addHandler(file_handler)

……完整代码请下载后查看哦~

程序分析

该代码实现了一个爬取猫眼电影网站热门电影信息的功能。具体实现过程如下:

  1. 导入需要的库,包括requests、db、lxml、multiprocessing、functools和matplotlib.pyplot等。

  2. 设置logger,用于记录日志信息,并将日志输出到文件films_log.txt中。

  3. 编写函数get_one_page,用于发起HTTP请求,获取网页的响应结果。

  4. 编写函数write_to_sql,用于将电影信息写入数据库。

  5. 编写函数parse_one_page,用于解析网页内容,提取电影信息。

  6. 编写函数analysisCounry,用于从数据库中查询每个国家的电影数量,并绘制饼状图进行统计分析。

  7. 编写函数CrawlMovieInfo,用于抓取电影信息。该函数接收锁和偏移量作为参数,通过调用get_one_page和parse_one_page函数获取电影信息,并调用write_to_sql函数将信息写入数据库。

  8. 在主函数中,创建Manager对象和Lock对象,用于实现多进程间的共享和同步。使用functools.partial函数创建部分应用于CrawlMovieInfo函数的函数partial_CrawlMovieInfo,并创建进程池pool。

  9. 使用进程池的map方法将partial_CrawlMovieInfo函数应用于10个偏移量的列表,实现并发地抓取电影信息。

  10. 关闭进程池,等待所有进程完成。

  11. 移除文件日志处理器,调用analysisCounry函数进行数据分析和可视化。

运行结果

6
7

遇到问题

注:如遇到以下问题,完成安全验证就好喽

8
9

写在后面

我是一只有趣的兔子,感谢你的喜欢!

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

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

相关文章

OceanBase 4.2特性解读:Show Trace全链路跟踪,助力快速问题定位与精准诊断

在分布式数据库环境下,慢 SQL 诊断是运维人员面临的一大挑战。在无法及时发现问题根本原因的情况下,可能会严重影响用户体验,甚至会导致业务服务不可用。相对于单机数据库,分布式数据库系统涉及多个节点、多组件的协同工作&#x…

苍穹外卖学习----出错记录

1.微信开发者工具遇到的问题: 1.1appid消失报错: {errMsg: login:fail 系统错误,错误码:41002,appid missing [20240112 16:44:02][undefined]} 1.2解决方式: appid可在微信开发者官网 登录账号后在开发栏 找到 复制后按以下步骤粘贴即…

玩转 openEuler (一)-- 系统安装

简介 openEuler 是一款开源操作系统。当前 openEuler 内核源于Linux,支持鲲鹏及其它多种处理器,能够充分释放计算芯片的潜能,是由全球开源贡献者构建的高效、稳定、安全的开源操作系统,适用于数据库、大数据、云计算、人工智能等…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例4-1 表单

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>表单</title> </head><body> <!--<form action"URL地址" method"提交方式" name"表单名称" /*编码“多部…

GPT实战系列-简单聊聊LangChain搭建本地知识库准备

GPT实战系列-简单聊聊LangChain搭建本地知识库准备 LangChain 是一个开发由语言模型驱动的应用程序的框架&#xff0c;除了和应用程序通过 API 调用&#xff0c; 还会&#xff1a; 数据感知 : 将语言模型连接到其他数据源 具有代理性质 : 允许语言模型与其环境交互 LLM大模型…

05-微服务Sentinel流量哨兵

一、Sentinel介绍 1.1 什么是Sentinel 分布式系统的流量防卫兵&#xff1a;随着微服务的普及&#xff0c;服务调用的稳定性变得越来越重要。Sentinel以“流量”为切入点&#xff0c;在流量控制、断路、负载保护等多个领域开展工作&#xff0c;保障服务可靠性。特点&#xff1…

vue的element ui使用el-table组件实现懒加载树、默认自动展开层级(一层,二层)、并且解决新增、删除、修改之后树节点不刷新问题

1.整体思路 问题&#xff1a;数据量太大了&#xff0c;导致接口返回数据时间较长。解决: 将ElementUi中Table组件加载改为懒加载&#xff08;查看文档&#xff09;。思路&#xff1a;初始化打开页面时只显示第一级菜单,用户点击展开菜单之后往后端发送请求,然后加载出一级子菜…

python接口自动化(十)--post请求四种传送正文方式(详解)

1.简介 post请求我在python接口自动化&#xff08;八&#xff09;--发送post请求的接口&#xff08;详解&#xff09;已经讲过一部分了&#xff0c;主要是发送一些较长的数据&#xff0c;还有就是数据比较安全等。我们要知道post请求四种传送正文方式首先需要先了解一下常见的四…

快速入门java网络编程基础------Nio

一. NIO 基础 哔哩哔哩黑马程序员 netty实战视频 0.什么是nio&#xff1f; NIO&#xff08;New I/O&#xff09;是Java中提供的一种基于通道和缓冲区的I/O&#xff08;Input/Output&#xff09;模型。它是相对于传统的IO&#xff08;InputStream和OutputStream&#xff09;模型…

Java SPI机制总结系列之开发入门实例

原创/朱季谦 在该文章正式开始前&#xff0c;先对 Java SPI是什么做一个简单的介绍。 SPI&#xff0c;是Service Provider Interface的缩写&#xff0c;即服务提供者接口&#xff0c;单从字面上看比较抽象&#xff0c;你可以理解成&#xff0c;该机制就像Spring容器一样&…

机器学习---lightGBM

1. lightGBM演进过程 AdaBoost是⼀种提升树的方法&#xff0c;和三个臭皮匠&#xff0c;赛过诸葛亮的道理⼀样。 AdaBoost两个问题&#xff1a; (1) 如何改变训练数据的权重或概率分布提高前⼀轮被弱分类器错误分类的样本的权重&#xff0c;降低前⼀ 轮被分对的权重 (2) 如何…

远程登陆利器 ssh

文章目录 远程登陆利器 ssh登陆远程服务器指定用户名多数情况的登陆方式查看服务器的时间指定端口更多信息 远程登陆利器 ssh ssh命令是openssh套件中的客户端连接工具&#xff0c;使用加密协议实现安全的远程登录服务器&#xff0c;实现对服务器的远程管理。 官方定义为&…

[学习笔记]刘知远团队大模型技术与交叉应用L1-NLPBig Model Basics

本节主要介绍NLP和大模型的基础知识。提及了词表示如何从one-hot发展到Word Embedding。语言模型如何从N-gram发展成预训练语言模型PLMs。然后介绍了大模型在NLP任务上的表现&#xff0c;以及它遵循的基本范式。最后介绍了本课程需要用到的编程环境和GPU服务器。 一篇NLP方向的…

还在因为版本不一致重装node吗,用它试试

一、卸载nodejs 首先卸载已安装的nodejs&#xff0c;总体分三步 1)打开控制面板&#xff0c;卸载nodejs 2)打开计算机->高级->环境变量&#xff0c;删除path中nodejs相关的配置 3)打开nodejs安装目录&#xff0c;整体删除 打开cmd&#xff0c;输入以下命令&#xff…

Android Studio下载gradle反复失败

我的版本&#xff1a;gradle-5.1.1 首先检查设置路径是否正确&#xff0c;参考我的修改&#xff01; 解决方案 1.手动下载Gradle.bin Gradle Distributions 下载地址 注意根据编译器提示下载&#xff0c;我这要求下载的是bin 而不是all 2.把下载好的整个压缩包放在C:\Users\…

Uniapp软件库源码-全新带勋章等

测试环境&#xff1a;php7.1。ng1.2&#xff0c;MySQL 5.6 常见问题&#xff1a; 配置好登录后转圈圈&#xff0c;检查环境及伪静态以及后台创建好应用 上传图片不了&#xff0c;检查php拓展fileinfo 以及public文件权限 App个人主页随机背景图&#xff0c;在前端uitl文件夹里面…

数组深入详解

1、什么是数组&#xff1f; Java 语言中提供的数组是用来存储固定大小的同类型元素。 如&#xff1a;可以声明一个数组变量&#xff0c;如 numbers[100] 来代替直接声明 100 个独立变量 number0&#xff0c;number1&#xff0c;…&#xff0c;number99。 注意事项&#xff1a;…

第二百六十六回

文章目录 1. 概念介绍2. 分析与解决2.1 分析问题2.2 解决方案 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何修改CircleAvatar的大小"相关的内容&#xff0c;本章回中将介绍如何修改StatusBar中文字的颜色.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1.…

鸿蒙Harmony-层叠布局(Stack)详解

我们总是为了太多遥不可及的东西去拼命&#xff0c;却忘了人生真正的幸福不过是灯火阑珊处的温暖&#xff0c;柴米油盐的充实&#xff0c;人生无论你赚的钱&#xff0c;是多还是少&#xff0c;经历的事情是好还是坏&#xff0c;都不如过好当下的每一天&#xff01; 目录 一&am…

CF1178F1 Short Colorful Strip 题解

Short Colorful Strip 传送门 题面翻译 题目描述 这是F题的第一个子任务。F1和F2的区别仅在对于m和时间的限制上 有n1种颜色标号从0到n&#xff0c;我们有一条全部染成颜色0的长为m的纸带。 Alice拿着刷子通过以下的过程来给纸带染色&#xff1a; 我们按照从1到n的顺序进…
最新文章