【Python从入门到进阶】24、urllib获取网站电影排行

news2024/9/25 1:24:56

接上篇《23、urllib使用post请求百度翻译》
上一篇我们讲解了如何使用urllib实现百度翻译的效果。本篇我们来讲解如何使用urllib抓取某某电影排行榜信息。

一、某某电影介绍

1、某某电影网站

某某电影成立于2005年,最初只是一个小型的电影社区,但随着时间的推移逐渐发展成为了一个拥有海量用户和内容的大型电影网站。目前,某某电影已成为全球最大的中文电影数据库之一,其数据库包含了来自各个国家和地区的电影信息。它提供了最新的电影资讯、电影评论、评分和推荐等服务,同时也提供了一个交流、分享和发现电影的平台:

2、电影排行榜介绍

点击网站首页的“排行榜”,或这直接浏览器输入“https://movie.douban.com/chart”地址,都可以看到某某电影的排行榜信息,是以从上到下的列表形式展示:

如果我们选择“动作”类电影,地址会变为“https://movie.douban.com/typerank?type_name=动作&type=5&interval_id=100:90&action=”,内容是一行2个,从上到下布局的列表:

其中地址栏的type_name就是电影的类型,type是电影类型ID,interval_id是“好于xx%-xx%的xx片”,是一个区间值,用“:”分割。

二、抓取动作类电影首页

1、分析页面数据请求

我们按照上面网页的分析,准备抓取动作类电影第一页的所有电影信息。
我们F12打开动作类电影首页的源码信息,刷新页面后,就可以看到很多请求信息:

通过分析判断,我们找到一个“”的http请求,这里的结果看起来就是电影列表的请求结果:

地址是“https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=0&limit=20”,是一个get请求:

请求参数有“type”、“interval_id”、“action”、“start”和“limit”:

这里和之前一样,type是电影类型ID,interval_id是“好于xx%-xx%的xx片”,是一个区间值,用“:”分割,start是当前获取的总数据量(目前的0是还没有获取任何数据),limit是本次新请求的数据量。

2、使用urllib抓取首页数据

我们已经确定了抓取的url地址为“https://movie.douban.com/j/chart/top_lis”,请求的参数也确定了,head参数按照之前百度翻译的规则,只需要定义好Cookie即可(这里顺带捎上User-Agent参数):

# _*_ coding : utf-8 _*_
# @Time : 2023-06-17 17:45
# @Author : 光仔December
# @File : 抓取某某电影数据
# @Project : Python_Projects
import urllib.request

# 某某电影排行服务的API地址,get请求的参数直接拼接在地址上
url = "https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=0&limit=20"

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.66 Safari/537.36',
    'Cookie': 'll="118237"; bid=XC5KAjdVhr0; _pk_ref.100001.4cf6=%5B%22%22%2C%22%22%2C1686994243%2C%22https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DdYERHe3ZepjqV24sOD9vz5FTFdU_VNfjjjJcv-wT7iKaTIkpeg3VXDZM4g-87dJO%26wd%3D%26eqid%3Dcdc028140007592b00000003648d7d48%22%5D; _pk_id.100001.4cf6=003d6c4f8c5a5918.1686994243.; _pk_ses.100001.4cf6=1; ap_v=0,6.0; __utma=30149280.1819017266.1686994243.1686994243.1686994243.1; __utmb=30149280.0.10.1686994243; __utmc=30149280; __utmz=30149280.1686994243.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __utma=223695111.1834148081.1686994243.1686994243.1686994243.1; __utmb=223695111.0.10.1686994243; __utmc=223695111; __utmz=223695111.1686994243.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __yadk_uid=CNd55Pec33U7Y2fvSlRoIIPfHFHp2r6z; _vwo_uuid_v2=DD581C8DF7B5095A18828A5BEB7A2E02B|d387f0c02fd08058553b6ad87363290f; __gads=ID=abc089f235d209f0-22edbe9eaab400ed:T=1686994466:RT=1686994466:S=ALNI_Maj4OLb9xqctrwIkc4iumOK0U6MRw; __gpi=UID=00000c50aa502f07:T=1686994466:RT=1686994466:S=ALNI_MbWaQIC_DBfN6WNUac3i9Z6tLzQmA'
}

# 创建request请求对象
request = urllib.request.Request(url=url,headers=headers)

# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)

# 获取响应的数据
content = response.read().decode('utf-8')

# 将结果写入json文件,因为里面有中文,所以要指定encoding编码格式
fp = open('douban.json','w',encoding='utf-8')
fp.write(content)

结果,生成了一个json文件,里面就是电影信息:

看的时候一般是一行,不好看,可以使用PyCharm的格式化,这样就会以json换行的格式显示,比较容易解读:

三、电影列表分页数据获取

我们一开始获取排行榜第一页的时候,只是看到20条数据,但是我们鼠标往下滑的时候,电影自动会继续加载,可以不停的往下刷:

可以看到刷到20的时候顿一下,然后加载到40条,然后再顿一下,加载了60条。这种效果就是html页面的异步加载,是通过JavaScript的ajax技术实现的,相当于在页面不整体刷新的情况下,布局更新页面的内容,每一次滑到底部,就异步请求获取下一页的20个电影拼接到列表中去。

其实我们获取也比较简单,我们F12查看每次滑动的请求地址:


可以看到其他都没有变化,只是“start”和“limit”参数有变化,即是我们请求的页数是几页,该页加载几条(这里就是分别加载了第1页,第2页,第3页,每页获取20条电影数据),这就是比较主流的“分页”逻辑效果。

清楚了这个分页逻辑,我们就知道如何实现某某电影前N页的数据,例如前10页数据,那就每次改变start的值就可以,从0加载到40即可(每页20条不变)。假设我们要获取前三页数据,我们可以使用for循环重置请求的start参数,然后将每次获取的数据拼接到上次获取的数据上即可,完整代码:

# _*_ coding : utf-8 _*_
# @Time : 2023-06-17 18:14
# @Author : 光仔December
# @File : 抓取某某电影数据-分页实现
# @Project : Python_Projects
import urllib.request
import json


# 定义一个获取每页数据的方法
def get_movies_by_start(s_url, start, limit):
    s_url = str(s_url) + '&start=' + str(start) + '&limit=' + str(limit)
    print("s_url", s_url)

    # 创建request请求对象
    request = urllib.request.Request(url=s_url, headers=headers)

    # 模拟浏览器向服务器发送请求
    response = urllib.request.urlopen(request)

    # 获取响应的数据
    result = response.read().decode('utf-8')

    return result


# 某某电影排行服务的API地址,get请求的参数直接拼接在地址上
url = "https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action="

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.66 Safari/537.36',
    'Cookie': 'll="118237"; bid=XC5KAjdVhr0; _pk_ref.100001.4cf6=%5B%22%22%2C%22%22%2C1686994243%2C%22https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DdYERHe3ZepjqV24sOD9vz5FTFdU_VNfjjjJcv-wT7iKaTIkpeg3VXDZM4g-87dJO%26wd%3D%26eqid%3Dcdc028140007592b00000003648d7d48%22%5D; _pk_id.100001.4cf6=003d6c4f8c5a5918.1686994243.; _pk_ses.100001.4cf6=1; ap_v=0,6.0; __utma=30149280.1819017266.1686994243.1686994243.1686994243.1; __utmb=30149280.0.10.1686994243; __utmc=30149280; __utmz=30149280.1686994243.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __utma=223695111.1834148081.1686994243.1686994243.1686994243.1; __utmb=223695111.0.10.1686994243; __utmc=223695111; __utmz=223695111.1686994243.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __yadk_uid=CNd55Pec33U7Y2fvSlRoIIPfHFHp2r6z; _vwo_uuid_v2=DD581C8DF7B5095A18828A5BEB7A2E02B|d387f0c02fd08058553b6ad87363290f; __gads=ID=abc089f235d209f0-22edbe9eaab400ed:T=1686994466:RT=1686994466:S=ALNI_Maj4OLb9xqctrwIkc4iumOK0U6MRw; __gpi=UID=00000c50aa502f07:T=1686994466:RT=1686994466:S=ALNI_MbWaQIC_DBfN6WNUac3i9Z6tLzQmA'
}

start = 0
limit = 20
content = []  # 获取的数据内容,拼接结果
max_page = 3  # 获取的最大页数

# 循环3页数据,并将结果拼接
for start in range(0, 3):
    result = get_movies_by_start(url, start * limit, limit)
    obj = json.loads(result)
    # 合并json数组
    content.extend(obj)

# 将结果写入json文件,因为里面有中文,所以要指定encoding编码格式
fp = open('douban2.json', 'w', encoding='utf-8')
content = json.dumps(content, ensure_ascii=False)  # 将json对象转换为字符串,因为有中文,不用ascii编码
fp.write(content)

这里我们首先定义了一个get_movies_by_start函数,可以加载任意页的某某电影排行榜数据,参数是url地址以及需要加载的页数和数据量。
拼接的话,就是每次请求时,将获取到的新json数组,加入到已经获取的json数组中去即可。
这里我们每次调用请求get_movies_by_start函数的时候,都会打印一次请求url,可以看到如同我们在页面请求的时候效果一样,每一次请求start会有变化:

数据效果:

通过"rank"字段我们可以看到获取了排行前60条的数据,证明我们的数据获取是成功的。

至此,我们通过urllib成功获取到了某某电影网站的列表。
本次我们获取数据的形式是get类型请求,下一篇博文我们将学习通过post请求来获取肯德基官网的数据。

参考:尚硅谷Python爬虫教程小白零基础速通教学视频

转载请注明出处:https://blog.csdn.net/acmman/article/details/131263587

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【备战秋招】每日一题:2023.05-B卷-华为OD机试 - 报文重排序

为了更好的阅读体检,可以查看我的算法学习博客报文重排序 题目描述 对报文进行重传和重排序是常用的可靠性机制,重传缓中区内有一定数量的子报文,每个子报文在原始报文中的顺序已知,现在需要恢复出原始报文。 输入描述 输入第…

改进YOLOv8 | 优化器篇 | YOLOv8 引入谷歌 Lion 优化器

论文地址:https://arxiv.org/pdf/2302.06675.pdf 代码地址:https://github.com/google/automl/tree/master/lion 我们提出了一种将算法发现作为程序搜索的方法,并将其应用于发现用于深度神经网络训练的优化算法。我们利用高效的搜索技术来探索一个无限且稀疏的程序空间。为了…

【SCADA】测试用KingIOServer采集杰控OPC DA服务器数据

Hello,大家好,我是雷工! 现场做数据采集时经常会遇到需要通过OPC采集数据的情况,本篇测试KingIOServer采集北京杰控组态软件的OPCDA服务器数据。 以下为测试记录过程。 一、KingIOServer的OPC DA数据采集介绍 KingIOServer可以作…

Vue中如何进行分布式日志管理与日志分析

Vue中如何进行分布式日志管理与日志分析 在现代应用程序中,日志是一项重要的功能,用于帮助开发人员和运维人员了解应用程序的行为并进行故障排除。随着应用程序的规模和复杂性的增加,日志管理和分析变得越来越困难。本文将介绍如何在Vue应用…

JSON对象花样进阶

JSON 对象使用在大括号{ }中书写。 对象可以包含多个 key/value(键/值)对。 key 必须是字符串,value 可以是合法的 JSON 数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)。 key 和 value 中使用冒号(:)分割。 每个…

Postman接口自动化之postman脚本编写

这是之前搞的接口自动化方案,已经在业务测试中实现了使用postman编写接口脚本,通过GitHubJenkinsemail html report实现了接口自动化,现在分块整理一下。 postman脚本编写 1、创建集合 和 目录: 一条业务线下的接口可以放到一个…

ACL2023 | 大模型如何快速构建指令遵循数据集?self-instruct:用175条种子数据追上InstructGPT001效果

一、概述 title:SELF-INSTRUCT: Aligning Language Models with Self-Generated Instructions 论文地址:https://arxiv.org/abs/2212.10560 代码:GitHub - yizhongw/self-instruct: Aligning pretrained language models with instruction…

chatgpt赋能python:Python怎么输出Unicode值

Python怎么输出Unicode值 Python 是一种高级编程语言,因其简单易学和快速开发已成为许多开发者的首选。Python 可以输出多种数据类型,包括字符串和数字。 在许多情况下,输出 Unicode 值是必需的,本文将介绍在 Python 中如何输出 …

shardingsphere第二课-shardingsphere-jdbc的基本使用及各种分片策略

第一章介绍 一、ShardingJDBC客户端分库分表 ShardingSphere-JDBC 定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动…

chatgpt赋能python:Python中如何输入一个列表

Python中如何输入一个列表 输入一个列表是Python编程的基本任务之一。列表可以看做是一种序列,其中包含多个元素,用逗号隔开,并用方括号括起来。在Python中,列表是一种非常常见的数据类型,常用于存储和处理一系列相关…

断言操作符介绍

目录 1.延时操作符(##) 1.1 ##m 1.2 ##[m:n] 2.蕴含操作符(|>,|->) 2.1 |>操作符 2.2 |->操作符 3 重复操作符 ([*m][->m][m]) 3.1 连续重复操作符([*m][*m:n]) 3.2 跟随重复操作…

Java选择题刷题记录5

Java堆栈 图片来自https://www.cnblogs.com/cici-new/p/14963762.html 数组、String都在堆里 枚举类 1.枚举类可以实现一个或多个接口,使用enum定义的枚举类默认继承java.lang.Enum类,而不是默认继承Object类,其中 java.lang.Enum类实现了…

机器视觉硬件的选择-标定板

康耐视智能相机Insight-缺陷检测 一>棋盘格的作用 a>畸变校正 径向畸变,径向畸变就是沿着透镜半径方向分布的畸变,产生原因是光线在原理透镜中心的地方比靠近中心的地方更加弯曲,这种畸变在短焦镜头中表现更加明显,径 向畸变主要包括桶形畸变和枕形畸变两种。以下分别…

chatgpt赋能python:Python输入π的方法及其应用

Python输入π的方法及其应用 Python是一门强大的编程语言,其支持的数学函数功能能够帮助用户完成各种复杂的计算操作。当我们需要在Python代码中使用π值时,不同的场景需要不同的处理方法。本文将详细介绍如何在Python中输入π值,并且探讨它…

Ansible 的脚本 --- playbook 剧本

playbook的相关知识 playbook 的简介 playbook是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。 简单来说,playbook是一个非常简单的配置管理和多主机部署系统, 不同于任何已经存在的模式,可作为一个适合部署…

【C++】STL之string类(2)

个人主页:平行线也会相交💪 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【C之路】💌 本专栏旨在记录C的学习路线,望对大家有所帮助🙇‍ 希望我们一起努力、成长&…

Vue中如何进行分布式任务调度与任务监控

Vue中如何进行分布式任务调度与任务监控 在复杂的系统中,如何有效地进行任务调度和监控是一个非常重要的问题。分布式系统中,任务调度和监控则更加复杂。Vue是一款流行的前端框架,本文将介绍如何在Vue中进行分布式任务调度和监控。 什么是分…

QML基础

从 Qt 4.7 开始,Qt 引入了一种声明式脚本语言,称为 QML(Qt Meta Language 或者 Qt Modeling Language),作为 C 语言的一种替代。而 Qt Quick 就是使用 QML 构建的一套类库。 QML 是一种基于 JavaScript 的声明式语言。…

Qt下存储读写应用程序设置的三种方法

一、简介 List item 用户对应用程序经常有这样的要求:要求它能记住它的settings,比如窗口大小、位置和密码等等。有三种方法可以实现: 使用注册表;使用配置文件(.ini);使用自定义文件(例如.txt)。 二、使用注册表 …

C盘空间不足清理方法 之 Google Chrome 浏览器用户数据迁移和Windows10 默认浏览器路径失效修复

原理分析 将原来C盘的目录拷贝到其他盘,然后用mklink建立一个联接,这里贴下ChatGPT对于三种链接的解释 # 在Windows 10中,mklink是一个命令行工具,用于创建符号链接(symbolic link)或者硬链接&#xff08…