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 re

import pymysql
import requests
from lxml import etree


class 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).text
        html = 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_date
            movie_name = title
            movie_type = str(types)
            movie_country = regions
            actor_name = str(actors)
            score_all = vote_count
            print(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 = 0
    i = []
    spider = Douban()
    spider.get_zhonglei(j, i)

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

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

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

相关文章

数据结构 ——— 归并排序算法的实现

目录 归并排序的思想 归并排序算法的实现 归并排序的思想 将已经有序的子序列合并,得到完全有序的序列,即先使每个子序列有序后,再使子序列段间有序 若将两个有序表合并成一个有序表,称为二路归并 归并排序步骤示意图&#x…

vue2面试题11|[2024-11-25]

1.vue源码-模版解析 <!DOCTYPE html> <html> <head><title></title> </head> <body><div idapp><h1> {{ str }} </h1>{{ str }} </div></body><script type"text/javascript" srcvue.js…

web博客系统的自动化测试

目录 前言测试用例编写自动化脚本测试准备博客登录页相关测试用例登陆成功登录失败 博客首页相关测试用例登陆成功登录失败 博客详情页相关测试用例登录成功登录失败 博客编辑页相关测试用例登陆成功登录失败 编写测试文档测试类型内容 前言 本次测试是运用个人写的一个博客系…

MATLAB矩阵元素的修改及删除

利用等号赋值来进行修改 A ( m , n ) c A(m,n)c A(m,n)c将将矩阵第 m m m行第 n n n列的元素改为 c c c&#xff0c;如果 m m m或 n n n超出原来的行或列&#xff0c;则会自动补充行或列&#xff0c;目标元素改为要求的&#xff0c;其余为 0 0 0 A ( m ) c A(m)c A(m)c将索引…

告别 Kafka,拥抱 Databend:构建高效低成本的用户行为分析体系

用户行为数据埋点指标是数据仓库中不可或缺的重要数据源之一&#xff0c;同时也是企业最宝贵的资产之一。通常情况下&#xff0c;用户行为数据分析包含两大数据源&#xff1a;用户行为分析日志和上游关系型数据库&#xff08;如 MySQL&#xff09;。基于这些数据&#xff0c;企…

WEB攻防-通用漏洞文件上传中间件解析漏洞编辑器安全

中间件文件解析-IIS&Apache&Nginx Web应用编辑器-Ueditor文件上传安全 实例CMS&平台-中间件解析&编辑器引用 Vulhub是一个基于docker和docker-compose的漏洞环境集合&#xff0c;进入对应目录并执行一条语句即可启动一个全新的漏洞环境&#xff0c;让漏洞复现…

【算法day1】数组:双指针算法

题目引用 这里以 1、LeetCode704.二分查找 2、LeetCode27.移除元素 3、LeetCode977.有序数组的平方 这三道题举例来说明数组中双指针的妙用。 1、二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜…

快速理解微服务中Sentinel怎么实现限流

Sentinel是通过动态管理限流规则&#xff0c;根据定义的规则对请求进行限流控制。 一.实现步骤 1.定义资源&#xff1a;在Sentinel中&#xff0c;资源可以是URL、方法等&#xff0c;用于标识需要进行限流的请求&#xff1b;(在Sentinel中&#xff0c;需要我们去告诉Sentinel哪些…

controller中的参数注解@Param @RequestParam和@RequestBody的不同

现在controller中有个方法&#xff1a;&#xff08;LoginUserRequest是一个用户类对象&#xff09; PostMapping("/test/phone")public Result validPhone(LoginUserRequest loginUserRequest) {return Result.success(loginUserRequest);}现在讨论Param("login…

OpenCV截取指定图片区域

import cv2 img cv2.imread(F:/2024/Python/demo1/test1/man.jpg) cv2.imshow(Image, img) # 显示图片 #cv2.waitKey(0) # 等待按键x, y, w, h 500, 100, 200, 200 # 示例坐标 roi img[y:yh, x:xw] # 截取指定区域 cv2.imshow(ROI, roi) cv2.waitKey(0) cv…

【经典】星空主题的注册界面HTML,CSS,JS

目录 界面展示 完整代码 说明&#xff1a; 这是一个简单的星空主题的注册界面&#xff0c;使用了 HTML 和 CSS 来实现一个背景为星空效果的注册页面。 界面展示 完整代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8&…

后端:事务

文章目录 1. 事务2. Spring 单独配置DataSource3. 利用JdbcTemplate操作数据库4. 利用JdbcTemplate查询数据5. Spring 声明式事务6. 事务的隔离级别6.1 脏读6.2 不可重复读6.3 幻读6.4 不可重复读和幻读的区别6.5 三种方案的比较 7. 事务的传播特性8. 设置事务 只读(readOnly)9…

vue element-ui的el-image 和 el-table冲突层级冲突问题问题preview-teleported

问题: 解决代码:preview-teleported <el-image style"width: 50px; height: 50px" :src"props.row.url" :zoom-rate"1.2" :max-scale"7":min-scale"0.2" :preview-src-list"[props.row.url]" :initial-index&…

vue3 开发利器——unplugin-auto-import

这玩意儿是干啥的&#xff1f; 还记得 Vue 3 的组合式 API 语法吗&#xff1f;如果有印象&#xff0c;那你肯定对以下代码有着刻入 DNA 般的熟悉&#xff1a; 刚开始写觉得没什么&#xff0c;但是后来渐渐发现&#xff0c;这玩意儿几乎每个页面都有啊&#xff01; 每次都要写…

FreeSWITCH 简单图形化界面34 - 网络环境安全的情况下,进行任意SIP注册

FreeSWITCH 简单图形化界面34 -网络环境安全的情况下&#xff0c;进行任意SIP注册 测试环境1、前言2、参数3、实践一下 测试环境 http://myfs.f3322.net:8020/ 用户名&#xff1a;admin&#xff0c;密码&#xff1a;admin FreeSWITCH界面安装参考&#xff1a;https://blog.cs…

基于Matlab深度学习的CT影像识别系统研究与实现

通过使用AlexNet、GoogLeNet和VGGNet等预训练模型&#xff0c;并结合迁移学习技术&#xff0c;对CT影像进行特征提取和分类。系统在公开数据集上进行了训练和测试&#xff0c;结果表明&#xff0c;该方法能够有效区分COVID-19和非COVID-19的CT影像&#xff0c;具有较高的准确率…

如何使用postman做接口测试?

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 常用的接口测试工具主要有以下几种&#xff1a; Postman: 简单方便的接口调试工具&#xff0c;便于分享和协作。具有接口调试&#xff0c;接口集管理&#…

数据分析的尽头是web APP?

数据分析的尽头是web APP&#xff1f; 在做了一些数据分析的项目&#xff0c;也制作了一些数据分析相关的web APP之后&#xff0c;总结自己的一些想法和大家分享。 1.web APP是呈现数据分析结果的另外一种形式。 数据分析常见的结果是数据分析报告&#xff0c;可以是PPT或者…

学习笔记037——Java中【Synchronized锁】

文章目录 1、修饰方法1.1、静态方法&#xff0c;锁定的是类1.2、非静态方法&#xff0c;锁定的是方法的调用者&#xff08;对象&#xff09; 2、修饰代码块&#xff0c;锁定的是传入的对象2.1、没有锁之前&#xff1a;2.2、有锁后&#xff1a; 实现线程同步&#xff0c;让多个线…

开源加密库mbedtls及其Windows编译库

目录 1 项目简介 2 功能特性 3 性能优势 4 平台兼容性 5 应用场景 6 特点 7 Windows编译 8 编译静态库及其测试示例下载 1 项目简介 Mbed TLS是一个由ARM Maintained的开源项目&#xff0c;它提供了一个轻量级的加密库&#xff0c;适用于嵌入式系统和物联网设备。这个项…