写在前面
本期内容:基于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。具体分析如下:
-
该工具类使用了 logging 模块来记录日志信息。首先创建了一个 logger 对象,并设置了记录日志格式和保存日志文件的对象。然后设置日志级别为 INFO,并将 file_handler 添加到 logger 中。
-
DBHelper 类的构造函数中,初始化了数据库的连接信息(host、user、password、db、port)和连接对象 conn、游标对象 cur。这些连接信息是硬编码的,可以根据实际情况进行修改。
-
connectDataBase() 方法用于连接数据库。首先尝试使用 pymysql.connect() 方法连接数据库,如果连接失败,则记录错误日志并返回 False。如果连接成功,则返回 True。
-
execute() 方法用于执行 SQL 语句。该方法首先调用 connectDataBase() 方法来确保数据库连接。然后使用游标对象的 execute() 方法执行 SQL 语句,并提交事务。如果执行过程中出现异常,则记录错误日志并返回 False。如果执行成功,则返回 True。
-
fetchCount() 方法用于执行查询操作,并返回结果。该方法首先调用 execute() 方法执行 SQL 语句。然后使用游标对象的 fetchone() 方法获取查询结果的第一条记录。如果执行过程中出现异常,则返回 False。如果执行成功,则返回查询结果。
-
myClose() 方法用于关闭连接和游标。该方法首先判断游标和连接是否存在,如果存在则关闭它们,并返回 True。
-
在主程序中,首先创建了一个 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)
……完整代码请下载后查看哦~
程序分析
该代码实现了一个爬取猫眼电影网站热门电影信息的功能。具体实现过程如下:
-
导入需要的库,包括requests、db、lxml、multiprocessing、functools和matplotlib.pyplot等。
-
设置logger,用于记录日志信息,并将日志输出到文件films_log.txt中。
-
编写函数get_one_page,用于发起HTTP请求,获取网页的响应结果。
-
编写函数write_to_sql,用于将电影信息写入数据库。
-
编写函数parse_one_page,用于解析网页内容,提取电影信息。
-
编写函数analysisCounry,用于从数据库中查询每个国家的电影数量,并绘制饼状图进行统计分析。
-
编写函数CrawlMovieInfo,用于抓取电影信息。该函数接收锁和偏移量作为参数,通过调用get_one_page和parse_one_page函数获取电影信息,并调用write_to_sql函数将信息写入数据库。
-
在主函数中,创建Manager对象和Lock对象,用于实现多进程间的共享和同步。使用functools.partial函数创建部分应用于CrawlMovieInfo函数的函数partial_CrawlMovieInfo,并创建进程池pool。
-
使用进程池的map方法将partial_CrawlMovieInfo函数应用于10个偏移量的列表,实现并发地抓取电影信息。
-
关闭进程池,等待所有进程完成。
-
移除文件日志处理器,调用analysisCounry函数进行数据分析和可视化。
运行结果
遇到问题
注:如遇到以下问题,完成安全验证就好喽
写在后面
我是一只有趣的兔子,感谢你的喜欢!