网络爬虫丨基于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

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



这里不难发现,其实每页的网址是有规律的,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 模块记录日志信息,方便调试和错误追踪。该工具类可以在其他代码中被引用,简化了数据库操作的代码编写。

运行结果

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

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

程序设计

import requests
from lxml import etree
from requests_html import UserAgent

url = "https://cssjc.com/direct/8a4510b1ff3f42cb8177239d8b6454e0.png" alt="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函数进行数据分析和可视化。

运行结果


遇到问题

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


写在后面

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

转载请说明出处内容投诉
CSS教程_站长资源网 » 网络爬虫丨基于requests+mysql爬取猫眼热门电影数据做可视化分析

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买
ICP备案号:蜀ICP备2023023382号

Powered By Z-BlogPHP 1.7.3