文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-01-21 15:45

关注

文章目录

写在前面

本期内容:基于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 loggingimport pymysqllogger = 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 Trueif __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 requestsfrom lxml import etreefrom requests_html import UserAgenturl = "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 requestsimport dbfrom lxml import etreefrom multiprocessing import Pool, Managerimport functoolsimport matplotlib.pyplot as pltfrom requests_html import UserAgentimport loggingplt.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

写在后面

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

来源地址:https://blog.csdn.net/m0_68111267/article/details/135569457

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯