Python爬虫-爬取豆瓣Top250电影信息

🎈 博主:一只程序猿子

🎈 博客主页:一只程序猿子 博客主页

🎈 个人介绍:爱好(bushi)编程!

🎈 创作不易:喜欢的话麻烦您点个👍和

🎈 欢迎访问我的主页(点我直达)

🎈 除此之外您还可以通过个人名片联系我

额滴名片儿

目录

1.介绍

2.网页分析

(1)获取电影列表

(2)获取电影信息

3.源码

4.效果展示

5.结语


1.介绍

        本文将详细介绍如何编写Python爬虫爬取豆瓣电影排行榜Top250榜单电影信息

        首先,感谢各位童鞋们的点赞关注收藏!!!

        其次,如果在编写代码的过程中,如果有任何疑问,可以在评论区留言、私信或名片联系我!!!

2.网页分析

(1)获取电影列表

         这里我们需要获取电影的名称和对应的URL地址:

        每一个li标签下都存放着一个电影,可见一页共有25个电影,一共有10个页面。我们需要把10个页面的电影名称和电影URL获取出来。

        每一页的url变化:

        可以看到只需要修改参数start=?即可实现换页!

(2)获取电影信息

        第一步我们获取到了电影名称和电影URL,通过电影URL可以进入到电影的详情页面:

        红色框标记出了我们需要获取的信息,我们将在代码中使用BeautifulSoup来匹配出对应的内容!当然,你也可以选择使用xpath或者正则表达式匹配数据!

3.源码

import random
import time

import requests

from bs4 import BeautifulSoup

class DouBan_top250(object):
    def __init__(self):
        self.cookies = {
               '''换成你自己的cookies'''
        }

        self.headers = {
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,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': 'max-age=0',
            'Connection': 'keep-alive',
            'Sec-Fetch-Dest': 'document',
            'Sec-Fetch-Mode': 'navigate',
            'Sec-Fetch-Site': 'none',
            '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/120.0.0.0 Safari/537.36 Edg/120.0.0.0',
            'sec-ch-ua': '"Not_A Brand";v="8", "Chromium";v="120", "Microsoft Edge";v="120"',
            'sec-ch-ua-mobile': '?0',
            'sec-ch-ua-platform': '"Windows"',
        }


    def get_movie_list(self, start):
        params = {
            'start': str(start),
            'filter': '',
        }
        html_content = requests.get('https://movie.douban.com/top250', params=params, cookies=self.cookies,
                                    headers=self.headers).text
        soup = BeautifulSoup(html_content, 'html.parser')
        ol_tag = soup.find('ol', {'class': 'grid_view'})
        li_tags = ol_tag.find_all('div', {'class': 'info'})
        titles =[]
        urls = []
        for li_tag in li_tags:
            title = li_tag.find('span', {'class': 'title'}).get_text()
            url = li_tag.find('a').get('href')
            titles.append(title)
            urls.append(url)

        return titles, urls


    def get_movie_info(self, url):
        resp = requests.get(url, headers=self.headers, cookies=self.cookies)
        if resp.status_code == 200:
            soup = BeautifulSoup(resp.text, 'html.parser')
            info = soup.find('div', {'id': 'info'})
            # 封面图片的URL
            img_url = soup.find('a', {'class': 'nbgnbg'}).find('img').get('src')
            # 导演
            director = info.find_all('span', {'class': 'attrs'})[0].get_text()
            # 编剧
            scriptwriter = info.find_all('span', {'class': 'attrs'})[1].get_text().split(' /')
            # 主演
            actors = info.find_all('span', {'class': 'attrs'})[2].get_text().split(' /')

            # 类型
            type_tags = info.find_all('span', {'property': 'v:genre'})
            types = []
            for type_tag in type_tags:
                types.append(type_tag.get_text())
            # 制片国家/地区
            country = info.find_all('span', {'class': 'pl'})[4].next_sibling.strip().split(' / ')
            # 语言
            language = info.find_all('span', {'class': 'pl'})[5].next_sibling.strip().split(' / ')
            try:
                # 简介
                intro = soup.find('div', {'class': 'indent', 'id': 'link-report-intra'})\
                    .find('span', {'class': 'all hidden'}).get_text()\
                    .replace(' ', '').replace('\u3000', '  ').replace('\n\n', '\n').strip('\n')
            except AttributeError as e:
                # 简介
                intro = soup.find('div', {'class': 'indent', 'id': 'link-report-intra'})\
                    .find('span').get_text()\
                    .replace(' ', '').replace('\u3000', '  ').replace('\n\n', '\n').strip('\n')

            rating = soup.find('strong', {'class': 'll rating_num'}).get_text()
            rating_people = soup.find('span', {'property': 'v:votes'}).get_text()

            # print(director, scriptwriter, actors, types, country, language, intro, rating, rating_people, img_url)

            movie_info = [director, scriptwriter, actors, types, country, language, intro, rating, rating_people, img_url]

        else:
            print(f'数据请求失败。。。状态码:{resp.status_code}')
            movie_info = ['', '', '', '', '', '', '', '', '', '']

        return movie_info


    def main(self):
        start = 0
        while start <= 25:
            titles, urls = self.get_movie_list(start)
            time.sleep(1)
            for title, url in zip(titles, urls):
                print(title, url)
                movie_info = self.get_movie_info(url)
                movie_info.insert(0, title)
                print(movie_info)
                time.sleep(random.randint(2, 5))
            start += 25
            time.sleep(random.randint(2, 5))


if __name__ == '__main__':
    douban = DouBan_top250()
    douban.main()

        这是一个完整的源码, 你拿到后只要不缺少相关的模块库,添加上你自己浏览器访问豆瓣网的cookies就可正常运行!!

        因为时间关系,这次我在代码中添加的注释很少,后续有时间我再优化一下这一部分!争取添加更多的注释帮助你理解代码!!

4.效果展示

列表中的数据分别对应的是:【电影名称、导演、编剧、主演、电影类型、制片国家、 语言、电影简介、评分、评分人数、封面URL】 

5.结语

        本篇文章中,我仅实现了获取到豆瓣网电影排行榜Top250的电影信息,但是我还没有实现把获取到的信息保存到表格中或保存到数据库,把电影封面图片下载到本地,后续的文章中我将把这些功能实现!

        如果你对本文感兴趣且想要把数据持久化存储,可以留意我后续发布的文章!

 

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

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

相关文章

003集Class类应用实例—python基础入门实例

面向对象编程是一种编程方式&#xff0c;此编程方式的落地需要使用 “类” 和 “对象” 来实现&#xff0c;所以&#xff0c;面向对象编程其实就是对 “类” 和 “对象” 的使用。 类就是一个模板&#xff0c;模板里可以包含多个函数&#xff0c;函数里实现一些功能 对象则是根…

Hyperledger Fabric 自动发现网络信息 discover 工具使用

客户端要往 Fabric 网络中发送请求&#xff0c;首先需要知道网络的相关信息&#xff0c;如网络中成员组织信息、背书节点的地址、链码安装信息等。 在 Fabric v1.2.0 版本之前&#xff0c;这些信息需要调用者手动指定&#xff0c;容易出错&#xff1b;另外&#xff0c;当网络中…

2024.1.8 关于 Redis 数据类型 Zset 集合命令、编码方式、应用场景

目录 引言 Zset 集合命令 ZINTERSTORE ZUNIONSTORE Zset 编码方式 Zset 应用场景 排行榜系统 引言 在 Redis 中集合间操作无非就是 交集、并集、差集 Set 类型与之相对应的操作命令为 sinter、sunion、sdiff 注意&#xff1a; 从 Redis 6.2 版本开始&#xff0c;Zset 命…

可充电助听器有哪些优势?

可充电助听器有哪些优势 01 无需频繁更换电池&#xff0c;对于手指不灵活、眼神不好的老年用户以及无法自行更换电池的儿童用户&#xff0c;使用更为方便。 02 可充电助听器的电池一般密封在助听器内部&#xff0c;机身的防水防尘性能更强。 03 部分充电盒具有快充、储电、…

SNP分享:企业并购与拆分的关键成功因素

成功执行并购或拆分需要考虑的关键因素 合并、收购和资产剥离对CIO和CFO来说都是一项艰巨的任务&#xff1b;它们在业务和技术方面都具有很大影响力&#xff0c;企业并购或拆分在数据迁移方面需要考虑哪些关键因素&#xff1f; 一、在迁移中构建自动化 先确定要迁移、集成或剥离…

计算机体系结构流水线学习记录

一、知识点汇总 1.理想情况下&#xff0c;流水线能够实现 n 倍的吞吐率加速比&#xff08;n为流水线深度&#xff09;&#xff0c;但是流水线深度并非越大越好&#xff0c;因为流水线的深度会影响到性能和功耗之间的平衡。 2.RISC&#xff1a;Reduced Instruction Set Comput…

NetCore使用SixLabors组件生成图片

主要用到SixLabors.Fonts(2.1.0)和SixLabors.ImageSharp.Drawing(2.1.0)组件 这里我把组件创建成一个单独的类库&#xff0c;供其他模块来同意调用 ISixLaborsExtensions.cs using SixLabors.Fonts; using SixLabors.ImageSharp; using SixLabors.ImageSharp.Drawing.Processi…

【算法Hot100系列】搜索旋转排序数组

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

[AutoSar]基础部分 RTE 05 Port的实例化和初始化

目录 关键词平台说明一、端口类型二、端口的实例化2.1 创建application port2.2 实例化 三、初始化 关键词 嵌入式、C语言、autosar、Rte 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语言C&#xff0c;C编译器HighTec (GCC) 一、端口类型 如下图所示&am…

一种DevOpts的实现方式:基于gitlab的CICD(一)

写在之前 笔者最近准备开始入坑CNCF毕业的开源项目&#xff0c;看到其中有一组开源项目的分类就是DevOpts。这个领域内比较出名的项目是Argocd&#xff0c;Argo CD 是一个用于 Kubernetes 的持续交付 (Continuous Delivery) 工具&#xff0c;它以声明式的方式实现了应用程序的…

scipy-interpolate整理

文章目录 scipy-interpolate整理Univariate interpolation 单变量插值Multivariate interpolation 多元插值Unstructured data 非结构化数据&#xff1a;:For data on a grid 对于网格上的数据&#xff1a;:Tensor product polynomials 张量积多项式&#xff1a;: 1-D Splines …

Windows更新 遇到错误 你的设备中缺少重要的安全和质量修复 0x80070643问题解决

一、原因 日常Windows更新时&#xff0c;突然出现以下错误&#xff1a; 二、最简单的方法 官方网址windows10升级工具进行更新&#xff1a;https://www.microsoft.com/zh-cn/software-download/windows10/   更新助手可以帮助你更新到 Windows 10 的最新版本&#xff0c…

【刷题日记】青少年CTF-Misc(三)A1-Misc部分完结!撒花!

StegoTXT 题目难度&#xff1a;★ 题目编号&#xff1a;QSNCTF-2023-T-MISC-20230228003 题目描述&#xff1a;今天维护网站的时候出了一道这样的题目&#xff0c;上传上来看看大家怎么解&#xff0c;flag格式为&#xff1a;qsnctf{xxx}。 下载解压文件&#xff0c;得到一个…

海淘注意事项科普

关税和税费&#xff1a; 在海淘过程中&#xff0c;您可能需要支付关税和其他税费。了解目标国家的相关规定&#xff0c;预先了解可能的费用&#xff0c;并确保考虑到这些额外成本。 货币汇率&#xff1a; 注意货币汇率的波动&#xff0c;以避免因兑换率变化导致支付更多费用。…

嵌入式-C语言-江科大-指针的详解与应用

文章目录 一&#xff1a;计算机存储机制二&#xff1a;定义指针三&#xff1a;指针的操作四&#xff1a;数组与指针五&#xff1a;指针的应用道友&#xff1a;最清晰的脚印&#xff0c;踩在最泥泞的道路上。 推荐视频配合我的笔记使用 [C语言] 指针的详解与应用-理论结合实践&a…

Flask修改Response Headers中的Server值

Headers中的Server会暴露出Python版本&#xff0c;导致的结果就是方便被渗透快速定位Python版本后找到对应版本的漏洞&#xff0c;因此导致网络安全问题 伪方法&#xff1a; 像这个马上就暴露出Python版本&#xff0c;如何解决这个网络上有说直接用response.headers.remove(Ser…

Windows内存管理(二):内存架构 浅谈一二

《Windows内存管理&#xff08;一&#xff09;&#xff1a;Windows性能监视器(PerfMon)》 Windows内存管理是一个复杂的主题&#xff0c;涉及多个层次和组件。以下是一个分层的概述。 1、虚拟内存管理 Windows使用虚拟内存来给每个进程提供一个看似连续的内存空间&#xff0c…

Java学习笔记-day01-Flowable工作流入门

课程来源B站大佬波哥的课程 本文仅做笔记&#xff0c;课件需要的联系B站大佬获取 0.前置 相关话术 流程定义&#xff08;Process Definition&#xff09;&#xff1a; 描述业务流程的定义&#xff0c;通常使用BPMN&#xff08;Business Process Model and Notation&#xff09…

没有货源是不是就没办法在家做抖店?打包发货怎么完成?解答如下

我是王路飞。 有人问了我一个问题&#xff1a;无货源模式的抖店&#xff0c;自己一个人在家里做不了是吧&#xff1f;毕竟打包发货这些问题怎么解决呢&#xff1f; 店铺要是发货不及时被平台罚款怎么办&#xff1f;产品有质量问题怎么解决呢&#xff1f;店铺一直不出单怎么办…

并发程序设计--D5~D7线程的创建、回收和取消清理

一个进程中的多个线程共享以下资源 可执行指令 静态数据 进程中打开的文件描述符 当前工作目录 用户ID 用户组ID 每个线程私有的资源 线程ID PC&#xff08;程序计数器&#xff09;和相关寄存器 堆区和栈区 错误号&#xff08;errno&#xff09; 优先级 执行状态和属性 线程的…