Python爬取豆瓣电影全部分类数据并存入数据库

        在当今数字化的时代,网络上丰富的影视资源信息吸引着众多开发者去挖掘和利用。今天,我就来和大家分享一段有趣的代码,它能够从豆瓣电影平台获取相关数据并存储到数据库中哦。

结果展示(文末附完整代码):

目录

结果展示(文末附完整代码):

一、代码准备

二、Douban 类的初始化

1. 请求头设置

2. Cookie 设置

3. 数据库连接

三、获取电影种类相关数据

1. 初始请求

2. 进一步处理

四、解析并存储数据

1. 请求数据

2. 数据处理与存储

 完整代码:


一、代码准备

        首先,我们看到这段代码开头进行了一系列的导入操作。它引入了像 re(用于正则表达式处理)、pymysql(用于与 MySQL 数据库进行交互)、requests(方便发送 HTTP 请求)以及 lxml(用于解析 HTML 等)这些非常实用的库。

# -*- coding:utf-8 -*-
import re
import pymysql
import requests
from lxml import etree

二、Douban 类的初始化

        接下来,定义了一个名为 Douban 的类。在这个类的初始化方法 __init__ 中,做了很多重要的设置。

1. 请求头设置

        设置了 headers,这里面包含了各种关于请求的信息,比如接受的内容类型、语言偏好、缓存控制等等。这些设置能够让我们的请求更符合豆瓣服务器的要求,顺利获取到数据。例如:

self.headers = {"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",// 其他设置省略
}

2. Cookie 设置

        同时,也配置了 cookies,这些是在之前与豆瓣网站交互过程中可能留下的一些标识信息,对于后续请求获取准确数据也起到了一定的作用哦。比如:

self.cookies = {"_pk_id.100001.4cf6": "f993e3f352d610f5.1712975414.","__gads": "ID=8f742f4360ad4561:T=1712975416:RT=1712975416:S=ALNI_MYEjjG_8aAehpZQ58LPXuy8119UYQ",// 其他设置省略
}

3. 数据库连接

        还建立了与 MySQL 数据库的连接哦。指定了数据库的主机地址(这里是本地的 127.0.0.1)、端口(3306)、用户名(root)、密码(921108)以及要使用的数据库名(data),并且创建了一个游标,以便后续执行 SQL 语句呢。

self.db = pymysql.Connect(host='127.0.0.1',port=3306,user='root',password='921108',db='data'
)
self.cursor = self.db.cursor()

三、获取电影种类相关数据

        在 Douban 类中有一个 get_zhonglei 方法,它主要负责获取电影的种类相关信息。

1. 初始请求

        首先,它会向豆瓣电影的排行榜页面(https://movie.douban.com/chart)发送一个 GET 请求,带上之前设置好的 headers 和 cookies。然后通过 lxml 的 etree 来解析获取到的 HTML 内容,找到页面中相关的 span 元素列表。

url = "https://movie.douban.com/chart"
response = requests.get(url, headers=self.headers, cookies=self.cookies).text
html = etree.HTML(response)
span_list = html.xpath('//*[@id="content"]/div/div[2]/div[1]/div/span')

2. 进一步处理

        对于每个找到的 span 元素,它会提取出其中链接的 href 属性值,通过正则表达式从 href 中获取到电影类型对应的编号 type_。然后根据这个编号构建新的请求链接,再次发送请求获取到该类型电影的总数 filtered_total,最后调用 parse 方法来进一步处理这些数据哦。

for span in span_list:href = span.xpath('./a/@href')[0]type_ = re.findall(r'type=(\d+)', href)[0]url = f'https://movie.douban.com/j/chart/top_list_count?type={type_}&interval_id=100%3A90&action='response = requests.get(url=url, headers=self.headers, cookies=self.cookies).json()filtered_total = response['filtered_total']self.parse(type_, filtered_total, j, i)

四、解析并存储数据

   Douban 类中parse 方法则承担着解析获取到的具体电影数据并存储到数据库的重要任务。

1. 请求数据

        它会根据传入的电影类型编号 type_ 和总数 filtered_total,构建合适的请求参数,向 https://movie.douban.com/j/chart/top_list 发送请求,获取到该类型下的一系列电影详细信息,这些信息是以 JSON 格式返回的哦。

url = "https://movie.douban.com/j/chart/top_list"
params = {"type": type_,"interval_id": "100:90","action": "","start": "0","limit": filtered_total,
}
response = requests.get(url, headers=self.headers, cookies=self.cookies, params=params).json()

2. 数据处理与存储

        对于每一部电影的信息,它提取出诸如电影标题、演员数量、演员名单、评分、地区、上映日期、电影类型、投票数等重要信息。并且对上映日期进行了一些格式上的处理,然后将这些数据按照一定的格式准备好,尝试插入到名为 movie_info 的数据库表中。如果在插入过程中出现了 MySQL 错误,它会打印出错误信息哦。

for item in response:title = item['title']actor_count = item['actor_count']actors = item['actors']score = item['rating'][0]regions = item['regions'][0]release_date = item['release_date']types = item['types']vote_count = item['vote_count']// 数据处理省略部分代码try:sql = "insert into movie_info (movie_name,movie_date,movie_type, movie_country,actor_name,score, score_all) values (%s,%s,%s,%s,%s,%s,%s)"self.cursor.execute(sql, (movie_name,movie_date,movie_type, movie_country,actor_name,score, score_all))self.db.commit()except pymysql.MySQLError as e:print(f"An error occurred: {e}")

 完整代码:

# -*- coding:utf-8 -*-
import reimport pymysql
import requests
from lxml import etreeclass Douban(object):def __init__(self):self.headers = {"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6","cache-control": "no-cache","pragma": "no-cache","priority": "u=0, i","referer": "https://cn.bing.com/","sec-ch-ua": "\"Microsoft Edge\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"","sec-ch-ua-mobile": "?0","sec-ch-ua-platform": "\"Windows\"","sec-fetch-dest": "document","sec-fetch-mode": "navigate","sec-fetch-site": "cross-site","sec-fetch-user": "?1","upgrade-insecure-requests": "1","user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0"
}self.cookies = {‘填入你的cookies’}self.db = pymysql.Connect(host='127.0.0.1',port=3306,user='root',password='921108',db='data')self.cursor = self.db.cursor()def get_zhonglei(self, j ,i):url = "https://movie.douban.com/chart"response = requests.get(url, headers=self.headers, cookies=self.cookies).texthtml = etree.HTML(response)span_list = html.xpath('//*[@id="content"]/div/div[2]/div[1]/div/span')for span in span_list:href = span.xpath('./a/@href')[0]# text = span.xpath('./a/text()')[0]# print(url)type_ = re.findall(r'type=(\d+)', href)[0]# print(type_)url = f'https://movie.douban.com/j/chart/top_list_count?type={type_}&interval_id=100%3A90&action='response = requests.get(url=url, headers=self.headers, cookies=self.cookies).json()filtered_total = response['filtered_total']print(type_, filtered_total)self.parse(type_, filtered_total, j, i)def parse(self, type_, filtered_total, j, i):url = "https://movie.douban.com/j/chart/top_list"params = {"type": type_,"interval_id": "100:90","action": "","start": "0","limit": filtered_total,}response = requests.get(url, headers=self.headers, cookies=self.cookies, params=params).json()for item in response:title = item['title']actor_count = item['actor_count']actors = item['actors']score = item['rating'][0]regions = item['regions'][0]release_date = item['release_date']types = item['types']vote_count = item['vote_count']j += 1# i.append([j, title, actor_count, actors, score, regions, release_date, types, vote_count])# print(j, title, actor_count, actors, score, regions, release_date, types, vote_count)if len(release_date) == 4:movie_date = f"{release_date}-01-01"else:movie_date = release_datemovie_name = titlemovie_type = str(types)movie_country = regionsactor_name = str(actors)score_all = vote_countprint(j, movie_name,movie_date,movie_type, movie_country,actor_name,score, score_all)# 插入movies表try:sql = "insert into movie_info (movie_name,movie_date,movie_type, movie_country,actor_name,score, score_all) values (%s,%s,%s,%s,%s,%s,%s)"self.cursor.execute(sql, (movie_name,movie_date,movie_type, movie_country,actor_name,score, score_all))self.db.commit()except pymysql.MySQLError as e:print(f"An error occurred: {e}")# self.db.rollback()pass
if __name__ == '__main__':j = 0i = []spider = Douban()spider.get_zhonglei(j, i)

        通过这段代码,我们就可以实现从豆瓣电影平台获取丰富的电影数据,并将它们有序地存储到我们自己的数据库中啦,是不是很有意思呢?当然,在实际应用中,我们还可以根据自己的需求对代码进行进一步的优化和扩展哦。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java: itext8.05 create pdf

只能调用windows 已安装的字体,这样可以在系统中先预装字体,5.0 可以调用自配文件夹的字体文件。CSharp donetItext8.0 可以调用。 /*** encoding: utf-8* 版权所有 2024 ©涂聚文有限公司 言語成了邀功盡責的功臣,還需要行爲每日來值班…

基于Java Springboot公园管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…

Java中的File和IO流

File对象 File对象本质是一个文件或文件夹,用于写入和读取文件内容 注意:对于相对路径而言,在单元测试方法中的File是相对于Module,在main中的File是相对于Project 构造器 File(String pathname)File file1 new File("D:…

(Keil)MDK-ARM各种优化选项详细说明、实际应用及拓展内容

参考 MDK-ARM各种优化选项详细说明、实际应用及拓展内容 本文围绕MDK-ARM优化选项,以及相关拓展知识(微库、实际应用、调试)进行讲述,希望对你今后开发项目有所帮助。 1 总述 我们所指的优化,主要两方面: 1.代码大小(Size) 2.代码性能(运行时间) 在MDK-ARM中,优…

ssm实战项目──哈米音乐(二)

目录 1、流派搜索与分页 2、流派的添加 3、流派的修改 4、流派的删除 接上篇:ssm实战项目──哈米音乐(一),我们完成了项目的整体搭建,接下来进行后台模块的开发。 首先是流派模块: 在该模块中采用分…

STM32的中断(什么是外部中断和其他中断以及中断号是什么)

一、什么是EXTI 和NVIC EXTI(External Interrupt/Event Controller)EXTI 是外部中断/事件控制器,它负责处理外部信号变化,并将信号传递给中断控制器(如 NVIC)。主要负责以下功能: 外部事件检测…

5、AI测试辅助-生成测试用例思维导图

AI测试辅助-生成测试用例思维导图 创建测试用例两种方式1、Plantuml思维导图版本 (不推荐)2、Markdown思维导图版本(推荐) 创建测试用例两种方式 完整的测试用例通常需要包含以下的元素: 1、测试模块 2、测试标题 3、前置条件 4、…

IDEA 2024安装指南(含安装包以及使用说明 cannot collect jvm options 问题 四)

汉化 setting 中选择插件 完成 安装出现问题 1.可能是因为之前下载过的idea,找到连接中 文件,卸载即可。

js+jquery实现经典推箱子游戏

纯前端项目,只使用html,css,js,jquery实现经典推箱子游戏,直接下载本地双击index.html即可运行体验。 游戏展示 开始界面 完成游戏 代码展示

《文件操作》

一 . 文本文件和二进制文件 根据数据的组织形式,数据文件被分为了二进制文件和文本文件 数据在内存中是以二进制的形式存储,如果不加转换的输出到外存的文件中,就是二进制文件。 如果要求在外存上以ASCII 码的形式存储,则需要再存…

监控报警系统的指标、规则与执行闭环

随笔 从千万粉丝“何同学”抄袭开源项目说起,为何纯技术死路一条? 数据源的统一与拆分 监控报警系统的指标、规则与执行闭环 java 老矣,尚能饭否? 一骑红尘妃子笑,无人知是荔枝来! 有所依 我们如何知道系统交易…

LLaMA-Mesh: Unifying 3D Mesh Generation with Language Models 论文解读

目录 一、概述 二、相关工作 1、LLMs到多模态 2、3D对象生成 3、自回归的Mesh生成 三、LLaMA-Mesh 1、3D表示 2、预训练模型 3、有监督的微调数据集 4、数据集演示 四、实验 1、生成的多样性 2、不同模型text-to-Mesh的比较 3、通用语境的评估 一、概述 该论文首…

【大数据学习 | Spark-Core】Spark提交及运行流程

spark的集群运行结构 我们要选择第一种使用方式 命令组成结构 spark-submit [选项] jar包 参数 standalone集群能够使用的选项。 --master MASTER_URL #集群地址 --class class_name #jar包中的类 --executor-memory MEM #executor的内存 --executor-cores NUM # executor的…

ES6 、ESNext 规范、编译工具babel

ES6 、ESNext 规范、编译工具简介 ES6ES(ECMAScript) vs JS常量进一步探讨 obj对象的扩展面试:使对象属性也不能更改——Object.freeze(obj) 解构deconstruction变量的解构赋值:数组解构赋值:对象解构赋值:…

【MyBatis】全局配置文件—mybatis.xml 创建xml模板

文章目录 模板文件配置元素typeAliasessettings 模板文件 创建模板 按照顺序打开【File】–>【settings】–>【Editor】–>【File and Code Templates】&#xff08;或直接搜索&#xff09; <?xml version"1.0" encoding"UTF-8" ?> <…

小程序免备案:快速部署与优化的全攻略

小程序免备案为开发者提供了便捷高效的解决方案&#xff0c;省去繁琐的备案流程&#xff0c;同时通过优化网络性能和数据传输&#xff0c;保障用户体验。本文从部署策略、应用场景到技术实现&#xff0c;全面解析小程序免备案的核心优势。 小程序免备案&#xff1a;快速部署与优…

【数据结构】—— 线索二叉树

引入 我们现在提倡节约型杜会&#xff0c; 一切都应该节约为本。对待我们的程序当然也不例外&#xff0c;能不浪费的时间或空间&#xff0c;都应该考虑节省。我们再观察团下图的二叉树&#xff08;链式存储结构)&#xff0c;会发现指针域并不是都充分的利用了&#xff0c;有许…

Outlook for Mac同步错误:The total attachment size exceeds the limit.

现象 mac一直弹出同步错误提示&#xff1a;The total attachment size exceeds the limit. 怎么也去不掉 解决办法 ①清除收件箱和已发送邮件的缓存 ②删除邮箱账号再重新添加

IT服务团队建设与管理

在 IT 服务团队中&#xff0c;需要明确各种角色。例如系统管理员负责服务器和网络设备的维护与管理&#xff1b;软件工程师专注于软件的开发、测试和维护&#xff1b;运维工程师则保障系统的稳定运行&#xff0c;包括监控、故障排除等。通过清晰地定义每个角色的职责&#xff0…