【Python爬虫开发实战②】使用urllib以及jsonpath爬取即将上映电影信息

news2024/11/26 16:55:22

🚀个人主页:为梦而生~ 关注我一起学习吧!
💡专栏:python网络爬虫从基础到实战 欢迎订阅!后面的内容会越来越有意思~
💡往期推荐
⭐️首先,我们前面讲了多篇基础内容:
【Python爬虫开发基础①】Python基础(变量及其命名规范)
【Python爬虫开发基础②】Python基础(正则表达式)
【Python爬虫开发基础③】Python基础(文件操作方法汇总)
【Python爬虫开发基础④】爬虫原理
【Python爬虫开发基础⑤】HTML概述与基本标签详解
【Python爬虫开发基础⑥】计算机网络基础(Web和HTTP)
【Python爬虫开发基础⑦】urllib库的基本使用
【Python爬虫开发基础⑧】XPath库及其基本用法
【Python爬虫开发基础⑨】jsonpath和BeautifulSoup库概述及其对比
⭐️在本文章之前,上一篇实战的文章:
【Python爬虫开发实战①】使用urllib以及XPath爬取可爱小猫图片
大家可以复制代码感受一下爬虫的魅力~
💡本期内容:我们来接着上次的解析库jsonpath,以及前面的urllib,进行一个比较有趣的实战:获取即将上映的电影信息

跟上期一样,我们先来看一下效果:
在这里插入图片描述


文章目录

  • 1 需要使用的库
  • 2 寻找接口并创建请求
  • 3 发送请求并获取响应
  • 4 使用jsonpath解析得到的json数据


1 需要使用的库

  • urllib

urllib是Python的一个标准库,用于处理URL(统一资源定位符)的模块。它提供了一些常用的功能,包括发送请求、处理响应、解析URL等。

  • 可以点击之前文章链接学习基础知识【Python爬虫开发基础⑦】urllib库的基本使用
  • json

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它以易于阅读和编写的文本格式来表示结构化数据。JSON数据格式广泛用于互联网应用之间的数据传输,并且被各种编程语言支持。

  • 使用python对json格式数据进行操作,可参考【Python爬虫开发基础③】Python基础(文件操作方法汇总)这篇文章
  • jsonpath

JSONPath是一种用于从JSON数据中提取或查询数据的表达式语言。它最初由史蒂芬·摩根(Stephen Morgan)在2007年创建,并在2014年成为了IETF(互联网工程任务组)的标准。

  • 大家可以通过上一篇文章了解一下jsonpath解析 【Python爬虫开发基础⑨】jsonpath和BeautifulSoup库概述及其对比
  • csv

Python的csv是一个用于读取、写入和操作CSV(逗号分隔值)文件的模块。CSV文件是一种常见的用于存储和交换数据的文件格式,它将数据按照逗号进行分隔,并可使用文本编辑器进行查看和编辑。
在Python中,使用csv模块可以轻松地读取和写入CSV文件。它提供了一些用于处理CSV数据的函数和类,包括Reader、Writer和DictReader等。

  • 大家同样可以通过这篇文章了解一下csv【Python爬虫开发基础③】Python基础(文件操作方法汇总)

2 寻找接口并创建请求

首先打开首页,我们究竟从哪里能得到想要的数据呢?有两种方法,一、通过定位得到HTML代码,通过解析代码得到想要的内容;二、通过抓包,得到主要的接口,通过对这个接口发送请求,就可以得到数据。

在这里,我们通过第二种方法,也就是抓包获取。

  1. 首先打开相应的网页,按F12打开开发者工具点击网络,并清除所有内容。

  2. 刷新页面,抓取到响应的数据,找到json格式数据,该接口就是我们需要的
    在这里插入图片描述


3 发送请求并获取响应

下面我们开始写代码:

  • 导入需要的库
import urllib.request
import json
import jsonpath
import csv
  • 请求对象的定制
# 请求对象的定制
def create_request():
    url = '(自己复制过来)'
    
    headers = {
        'Cookie':'(自己复制过来)',
        'Referer':'(自己复制过来)',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
    }
    
    request = urllib.request.Request(url = url, headers = headers)
    
    return request
  • 获取网页源码
# 获取网页的源码
def get_content(request):
    # 发送请求获取响应
    response = urllib.request.urlopen(request)
    # 对响应进行解码
    content = response.read().decode('utf-8')
#     print(content)
    # 返回
    return content

在这里得到的content就是获取到的响应数据


4 使用jsonpath解析得到的json数据

def analyze(content):
    content = content.split('(')[1].split(')')[0]

    with open('tpp.json', 'w', encoding='utf-8') as fp:
        fp.write(content)

    obj = json.load(open('tpp.json', 'r', encoding='utf-8'))

    return obj
  • 最后将获得的数据写入到csv文件中
def down_load(obj):
    showName_list = jsonpath.jsonpath(obj, '$..showName')
    director_list = jsonpath.jsonpath(obj, '$..director') # 95
    leadingRole_list = jsonpath.jsonpath(obj, '$..leadingRole') # 90
    type_list = jsonpath.jsonpath(obj, '$..type')
    country_list = jsonpath.jsonpath(obj, '$..country')
    language_list = jsonpath.jsonpath(obj, '$..language')
    # duration_list = jsonpath.jsonpath(obj, '$..duration') # 57
    openDay_list = jsonpath.jsonpath(obj, '$..openDay')
    
    with open('./即将上映电影信息.csv', 'a', encoding='gbk', newline='') as f:
        a = csv.writer(f)
        field = ['电影名', '导演', '主演', '类型', '国家', '语言', '上映时间']
        a.writerow(field)
        print(['电影名', '导演', '主演', '类型', '国家', '语言', '上映时间'])

        for i in range(len(leadingRole_list)):
            list_data = [showName_list[i], director_list[i], leadingRole_list[i], type_list[i], country_list[i], language_list[i], openDay_list[i]]
            a.writerow(list_data)
            print(list_data)
  • 最后,我们按顺序调用以上函数就可以实现了
# (1) 请求对象的定制
request = create_request()
# (2) 获取网页的源码
content = get_content(request)
# (3) 解析
obj = analyze(content)
# (4) 下载
down_load(obj)

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

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

相关文章

【JUC并发编程】集合类安全问题

一、并发下,ArrayList类是不安全的 代码演示package CollectionSafe;import java.util.ArrayList; import java.util.List; import java.util.UUID;/*** author swaggyhang* create 2023-07-02 17:26*/ public class Test01 {public static void main(String[] arg…

ubuntu下 C/C++程序读取设置环境变量

设置环境变量很简单比如: export QMCY_LOCAL_PORT8888 追加的话 export QMCY_LOCAL_PORT$QMCY_LOCAL_PORT:8000 可以通过echo回显 读取的话 main函数多加一个env参数 一个字符串数组 然后遍历这个数组 即可 使用的时候 如下: bool QMCY_APP::Init(s…

【若依框架学习】day1-启动项目

若依开源框架,前后端分离项目,地址:http://doc.ruoyi.vip/ruoyi-vue/ 先配置环境 JDK1.8, MySQL5.7 ,Maven3.6,redis、nginx(可以不配)、 node 具体见:https://ygstriver.blog.csdn.net/articl…

day28-JSP

0目录 JSP 1.为什么使用JSP 2.B/S和C/S的区别 3.URL 4.Tomcat 5.JSP实战综合项目 1.为什么使用JSP 1.1 JSP定义: (1)是一种动态网页技术 (2)Java Server Pages(Java服务器端页面技术) 1.2 …

docker进阶

Docker网络 [rootecs-56325218 ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 2c63c1a8145c bridge bridge local 70d3439bbb55 host host local ffc74cf89143 none null local[rootecs-56325218 ~]# docker network cre…

day 42 01背包

01背包裸题 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。 每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 二维数组 dp含义: dp[ i ][ j ] 表示从下标为 [ 0 - i ]的物品里…

SpringBoot 整合RabbitMQ

SpringBoot 整合 RabbitMQ 概念 2007 年发布,是一个在 AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最主流的消息中间件之一。 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue 高级消息队列协议…

Driver、CUDA、CUDNN和TensorRT的关系【深蓝学院】

文章目录 1、Driver、CUDA、CUDNN和TensorRT的关系2、如何选择CUDA版本2.1 如何选择CUDA版本的一个例子 3、手动安装实操 1、Driver、CUDA、CUDNN和TensorRT的关系 2、如何选择CUDA版本 上面的显卡架构及其对应的CUDA版本和稳定版本是怎么得出来的呢?请看下图&#…

【数据结构与算法】将含有n个元素的整数数组A[0…n-1]的元素循环右移1≤m<n)位。要求算法的空间复杂度为O(1)。

题目&#xff1a; Qestion:  设计一个算法 , 将含有 n 个元素的整数数组 A [ 0 … n − 1 ] 的元素循环右移 ( 1 ≤ m < n ) 位。要求算法的空间复杂度为 O ( 1 ) 设计一个算法,将含有n个元素的整数数组A[0…n-1]的元素循环右移(1≤m<n)位。要求算法的空间复杂度为O(1) …

[MySQL]MySQL数据库基础

[MySQL]MySQL数据库基础 文章目录 [MySQL]MySQL数据库基础1. 什么是数据库2. 主流数据库3. 服务器数据库表之间的关系4. 数据逻辑结构5. MySQL架构6. SQL语句分类7. 存储引擎 1. 什么是数据库 数据库是存储在计算机系统内的有结构的数据集合&#xff0c;是相关数据的集合&#…

【业务功能篇38】Springboot+activiti7 工作流引擎 增加网关组件、Assignment分配权限

在前面的一篇文章中&#xff0c;简单举例了一个 工单电子流&#xff0c;【业务功能篇36】Springbootactiviti7 工作流引擎_studyday1的博客-CSDN博客仅有一个子任务&#xff0c;这种一般是针对比较简单的一个遗留问题记录场景&#xff0c;今天再介绍一个&#xff0c;相对比较复…

rabbitMq怎么查看队列消息-Tracing日志

Trace 是Rabbitmq用于记录每一次发送的消息&#xff0c;方便使用Rabbitmq的开发者调试、排错。 1、启动Tracing插件 在RabbitMQ中默认是关闭的&#xff0c;需手动开启。此处rabbitMQ是使用docker部署的 ## 进入rabbitMq中 docker exec -it rabbitmq1 bash ## 启动日志插件 rabb…

每天五分钟机器学习:构建多特征的线性回归模型

本文重点 在实际应用中,有时候一个单一特征的线性回归模型可能无法很好地解释数据,因此我们可以构建多特征的线性回归模型来提高模型的预测能力。本文还是拿房价问题来举例,来看以下多特征的线性回归模型如何构建? 多特征的数据集 以房价预测为例,现在的样本特征不再是…

贵阳阿里云代理商:阿里云中国区副总裁李国欢:数字经济与实体经济如何融合

中国青年报客户端讯&#xff08;中青在线记者 于璧嘉&#xff09;6月21日&#xff0c;在第六届世界智能大会即将召开之际&#xff0c;阿里云中国区副总裁李国欢在接受媒体专访时表示&#xff1a;“数字经济已经成为社会生产力革命的一个重要生产要素。” 6月21日&#xff0c;阿…

Linux下GO IDE安装和配置(附快捷键)

目前&#xff0c;GoLand、VSCode 这些 IDE 都很优秀&#xff0c;但它们都是 Windows 系统下的 IDE。在 Linux 系统下我们可以选择将 Vim 配置成 Go IDE。熟练 Vim IDE 操作之后&#xff0c;开发效率不输 GoLand 和 VSCode。有多种方法可以配置一个 Vim IDE&#xff0c;这里我选…

mqadmin命令的使用

mqadmin命令的使用 F:\rocketmq-all-4.9.7-bin-release\bin>mqadmin The most commonly used mqadmin commands are: updateTopic Update or create topic deleteTopic Delete topic from broker and NameServer. updateSubGroup Update or create subscription group delet…

【虚拟化】虚拟机xml文件解析

文章目录 虚拟机xml文件解析nameuuidmemory/currentMemoryvcpubootcpuon_poweroffon_rebooton_crashdiskinterfaceinputgraphics 补充说明1.磁盘总线类型 虚拟机xml文件解析 name name # 虚拟机名称&#xff0c;具有唯一性&#xff0c;不可与已建立的虚拟机重复uuid uuid #虚…

MoblieNetV1、V2、V3、ViT四种Moblie模型的分析对比

1、MoblieNetV1 2017年提出&#xff0c;论文地址为&#xff1a;https://arxiv.org/pdf/1704.04861.pdf 1.1 相关知识 提到了标准卷积、深度可分卷积、点卷积&#xff0c;并分析了不同卷积结构的计算量&#xff0c;&#xff08;假设 D k D_k Dk​为ksize&#xff0c;M为卷积的…

在VMware Workstation虚拟机上安装centos服务,并使用xshell连接centos服务。

一、安装VMware Workstation 可前往http://www.kkx.net/soft/22239.html&#xff0c;附带有下载链接&#xff0c;和对应的破解码。 二、下载centos .iso格式文件 前往https://mirrors.aliyun.com/centos/7/isos/x86_64/下载。 以下两个&#xff0c;选择哪一个都行。 记得要下…

【MySQL进阶篇】学习笔记

文章目录 MySQL进阶学习前言1、存储引擎1.1 MySQL体系结构概览1.2 存储引擎介绍1.3 常见存储引擎的特点1.3.1 InnoDB的特点1.3.2 MyISAM1.3.3 Memory1.3.4 总结 2、索引2.1 索引介绍2.2 索引的结构2.2.1 前置知识2.2.2 索引结构的种类 2.3 索引的分类2.4 索引的使用2.4.1 索引的…