当前位置: 首页 > news >正文

《0基础》学习Python——第二十一讲__网络爬虫/<4>爬取豆瓣电影电影信息

爬取网页数据(获取网页信息全过程)

1、爬取豆瓣电影的电影名称、导演、主演、年份、国家、评价

2、首先我们先爬取页面然后再获取信息

        1、爬取网页源码
import requests
from lxml import etree
if __name__ == '__main__':#UA伪装head={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0'}#获取urlurl='https://img3.doubanio.com/cuphead/movie-static/charts/top_movies.b4c3a.css'#发送请求response=requests.get(url,headers=head)#返回数据类型cont_text=response.text# print(cont_text)#打印数据,用于查看是否爬取成功

上述代码即表示爬取了豆瓣电影那一页的网页源码

2、下面将去找想爬取的数据所在标签的位置

因为要爬取一整页面所有的电影而不是单个电影信息,所以需要找到该组电影标签的主标签,如下部分即可发现,将鼠标移到每个li标签下,都会对应左边的每个单独的电影

所以我们就可以通过for循环定位到每个li标签下然后在爬取每个li标签内的电影数据,

找到所有的li标签后在上一级去找有没有单独的属性class或者id,如果找到一个class内容,复制class对应属性的内容,长按Ctrl+F打开查找,看看是否是在总标签下是否是唯一的,这样可以避免去数每一个标签在什么位置,

如上图可发现上述的class对应的属性“grid_view”是独一无二的,那么可以直接通过多层地址直接到达这个标签

3、实操代码        

        通过以下代码即可获取到所有的电影名称,其中的div[2]表示这个div标签是在当前的上一级标签下是第2个标签,//表示属性定位直接定位到当前目录,./表示在当前目录下,/表示下一级目录,

import requests
from lxml import etree
if __name__ == '__main__':#UA伪装head={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0'}#获取url# url='https://img3.doubanio.com/cuphead/movie-static/charts/top_movies.b4c3a.css'url = 'https://movie.douban.com/top250'#发送请求response=requests.get(url,headers=head)#返回数据类型cont_text=response.text# print(cont_text)#打印数据,用于查看是否爬取成功#解析数据tree=etree.HTML(cont_text)#获取单个电影所对应标签的主标签# lst=tree.xpath('//ol[@class="grid_view"]/li')#即打印所有li标签下的内容ls1 = tree.xpath('//ol[@class="grid_view"]/li')# print(ls1)for li in ls1:  #通过循环遍历所有的li标签,即所有的电影数据name_book=li.xpath('./div/div[2]/div[1]/a/span[]/text()')  #通过text()打印数据print(name_book)

其打印结果为

4、返回结果处理

xpath返回的是列表,里面有很多不需要的符号,所以需要再对name_book=li.xpath('./div/div[2]/div[1]/a/span[1]/text()')这段代码在做处理,首先通过join函数去除括号,name_book="".join(li.xpath('./div/div[2]/div[1]/a/span[1]/text()'))

打印结果为

这就是我们需要的电影名字内容,下面将获取导演、、数据,通过下列代码获取这些信息

strs = ''.join(li.xpath(".//div[@class='bd']/p[1]/text()"))print(strs)

其输出结果为下列内容

但是有很多空格,同样需要对它进行处理,可以使用strip函数去除左右两边的空格

strs = ''.join(li.xpath(".//div[@class='bd']/p[1]/text()")).strip()print(strs)

但是我们需要的是单独的导演、主演、时间、国家、、,这些是一个完整的字符串,所以需要额外把这些字符串取出来进行额外处理,得到分开的单独数据:

比如取出第一段字符,那么首先可以发现有很多空格,所以使用strip去除,然后调用正则化去处理这段数据,代码如下,其中分别取出时间、国家、导演、主演、剧情

import re
strs="""导演: 弗兰克·德拉邦特 Frank Darabont   主演: 蒂姆·罗宾斯 Tim Robbins /...1994 / 美国 / 犯罪 剧情"""
#中文的正则取值:[\u4e00-\u9fa5]
a=strs.strip() #去除左右空格
time_film=re.match(r'([\s\S]+?)(\d+)([\s\S]+?)',a).group(2) #利用正则的分组关系去除第二组内容,即(\d+)数字的内容,即时间
country=''.join(a.split('/')[-2].split()) #利用/符号切割这个完整字符串,然后取出倒数第二个数据,即国家的数据
juqing=''.join(a.split('/')[-1].split())#利用/符号切割这个完整字符串,然后取出倒数第一个数据,即剧情的数据
daoyan=re.match(r'导演: ([A-Za-z\u4e00-\u9fa5·]+)(\s\S*?)',a).group(1) #使用中文的正则表达式得到导演主演的数据
zhuyan=re.match(r'([\s\S]+?)主演: ([A-Za-z\u4e00-\u9fa5·]+)([\s\S]+?)',a).group(2)
print(time_film)
print(country)
print(juqing)
print(daoyan)
print(zhuyan)

其输出结果如下:

即将那一大串字符串全部处理成了独立的我们需要的数据,然后只要把这些代码放入爬虫的那一部分即可,

import re
import requests
from lxml import etree
if __name__ == '__main__':#UA伪装head={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0'}#获取url# url='https://img3.doubanio.com/cuphead/movie-static/charts/top_movies.b4c3a.css'url = 'https://movie.douban.com/top250'#发送请求response=requests.get(url,headers=head)#返回数据类型cont_text=response.text# print(cont_text)#打印数据,用于查看是否爬取成功#解析数据tree=etree.HTML(cont_text)#获取单个电影所对应标签的主标签# lst=tree.xpath('//ol[@class="grid_view"]/li')#即打印所有li标签下的内容ls1 = tree.xpath('//ol[@class="grid_view"]/li')# print(ls1)for li in ls1:  #通过循环遍历所有的li标签,即所有的电影数据name_book="".join(li.xpath('./div/div[2]/div[1]/a/span[1]/text()')) #通过text()打印数据# print(name_book)strs = ''.join(li.xpath(".//div[@class='bd']/p[1]/text()")).strip()# print(strs)a = strs.strip()time_film = re.match(r'([\s\S]+?)(\d+)([\s\S]+?)', a).group(2)country = ''.join(a.split('/')[-2].split())juqing = ''.join(a.split('/')[-1].split())daoyan = re.match(r'导演: ([A-Za-z\u4e00-\u9fa5·]+)(\s\S*?)', a).group(1)zhuyan = re.match(r'([\s\S]+?)主演: ([A-Za-z\u4e00-\u9fa5·]+)([\s\S]+?)', a).group(2)print(time_film)print(country)print(juqing)print(daoyan)print(zhuyan)

其得到的结果如下,可以发现其结果有错误,

如下图可以发现这部电影没有主演,只有一个主字,那么就说明我们的正则有缺陷,但是我们也可以跳过这一个电影,因为在大批量的电影中总会有那么一个两个不一样的区别,不能将所有的数据都拿出来额外在做正则,这样也不切实际,所以我们可以使用try语句去判断一下,然后跳过这一步电影的数据

5、完整代码如下

import re
import requests
from lxml import etree
if __name__ == '__main__':fp=open('./douban_film.txt','w',encoding='utf-8') #创建一个文件用来存放电影数据#UA伪装head={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0'}#获取url# url='https://img3.doubanio.com/cuphead/movie-static/charts/top_movies.b4c3a.css'url = 'https://movie.douban.com/top250'#发送请求response=requests.get(url,headers=head)#返回数据类型cont_text=response.text# print(cont_text)#打印数据,用于查看是否爬取成功#解析数据tree=etree.HTML(cont_text)#获取单个电影所对应标签的主标签# lst=tree.xpath('//ol[@class="grid_view"]/li')#即打印所有li标签下的内容ls1 = tree.xpath('//ol[@class="grid_view"]/li')# print(ls1)for li in ls1:  #通过循环遍历所有的li标签,即所有的电影数据name_book="".join(li.xpath('./div/div[2]/div[1]/a/span[1]/text()')) #通过text()打印数据# print(name_book)strs = ''.join(li.xpath(".//div[@class='bd']/p[1]/text()")).strip()# print(strs)a = strs.strip()time_film = re.match(r'([\s\S]+?)(\d+)([\s\S]+?)', a).group(2)try:country = ''.join(a.split('/')[-2].split())juqing = ''.join(a.split('/')[-1].split())daoyan = re.match(r'导演: ([A-Za-z\u4e00-\u9fa5·]+)(\s\S*?)', a).group(1)zhuyan = re.match(r'([\s\S]+?)主演: ([A-Za-z\u4e00-\u9fa5·]+)([\s\S]+?)', a).group(2)except Exception as e:passprint(name_book+"#"+time_film+"#"+daoyan+"#"+zhuyan+"#"+country+"#"+juqing+"\n")#讲捕获的数据全部写入文件内fp.write(  name_book + "#" + time_film + "#" + daoyan + "#" + zhuyan + "#" + country + "#" + juqing + "\n")fp.close()

左侧发现存放所创建的文本文件,打开后可得到存进去的数据:

相关文章:

《0基础》学习Python——第二十一讲__网络爬虫/<4>爬取豆瓣电影电影信息

爬取网页数据(获取网页信息全过程) 1、爬取豆瓣电影的电影名称、导演、主演、年份、国家、评价 2、首先我们先爬取页面然后再获取信息 1、爬取网页源码 import requests from lxml import etree if __name__ __main__:#UA伪装head{User-Agent:Mozilla/…...

【C++初阶】string类

【C初阶】string类 🥕个人主页:开敲🍉 🔥所属专栏:C🥭 🌼文章目录🌼 1. 为什么学习string类? 1.1 C语言中的字符串 1.2 实际中 2. 标准库中的string类 2.1 string类 2.…...

RAS--APEI 报错解析流程(2)

RAS--APEI 报错解析流程(1) 除了APEI 中除了GHES会记录错误,在Post过程中的错误通常是通过BERT Table汇报 1.BERT Boot Error Record Table is used to report unhandled errors that occurred in a previous boot,it is reported as a ‘one-time polle…...

微软蓝屏事件对企业数字化转型有什么影响?

引言:从北京时间2024年7月19日(周五)下午2点多开始,全球大量Windows用户出现电脑崩溃、蓝屏死机、无法重启等情况。事发后,网络安全公司CrowdStrike称,收到大量关于Windows电脑出现蓝屏报告,公司…...

【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(上)

【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(上) 大家好 我是寸铁👊 【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(上)✨ 喜欢的小伙伴可以点点关注 💝 前言 本次文章分为上下两部分&…...

浅谈Devops

1.什么是Devops DevopsDev(Development)Ops(Operation) DevOps(Development和Operations的混合词)是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”…...

大文件分片上传(前端TS实现)

大文件分片上传 内容 一般情况下,前端上传文件就是new FormData,然后把文件 append 进去,然后post发送给后端就完事了,但是文件越大,上传的文件也就越长,如果在上传过程中,突然网络故障,又或者…...

unity2D游戏开发02添加组件移动玩家

添加组件 给PlayGame和EnemyObject添加组件BoxCollider 2D碰撞器,不用修改参数 给PlayGame添加组件Rigibody 2D 设置数据 添加EnemyObject,属性如下 Edit->project setting->Physics 2D 将 y的值改为0 给playerObject添加标签 新建层 将PlayerObj…...

设计模式 之 —— 单例模式

目录 什么是单例模式? 定义 单例模式的主要特点 单例模式的几种设计模式 1.懒汉式:线程不安全 2.懒汉式:线程安全 3.饿汉式 4.双重校验锁 单例模式的优缺点 优点: 缺点: 适用场景: 什么是单例模…...

深入浅出WebRTC—ULPFEC

FEC 通过在发送端添加额外的冗余信息,使接收端即使在部分数据包丢失的情况下也能恢复原始数据,从而减轻网络丢包的影响。在 WebRTC 中,FEC 主要有两种实现方式:ULPFEC 和 FlexFEC,FlexFEC 是 ULPFEC 的扩展和升级&…...

Python从0到100(四十三):数据库与Django ORM 精讲

前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…...

Redis-主从模式

目录 前言 一.主从节点介绍 二.配置redis主从结构 二.主从复制 四.拓扑结构 五.数据同步 全量复制(Full Sync Replication) 局部复制(Partial Replication) Redis的学习专栏:http://t.csdnimg.cn/a8cvV 前言 …...

加速决策过程:企业级爬虫平台的实时数据分析

摘要 在当今数据驱动的商业环境中,企业如何才能在海量信息中迅速做出精准决策?本文将探讨企业级爬虫平台如何通过实时数据分析加速决策过程,实现数据到决策的无缝衔接。我们聚焦于技术如何赋能企业,提升数据处理效率,…...

字典树(前缀树)数组实现(只能查26个单词)

这段代码实现了一个基于 Trie 树的字典树(Trie)数据结构,用于存储和检索字符串。其中包含以下几个方法. insert(String word): 向 Trie 树中插入一个单词。首先将单词转换为字符数组,然后遍历字符数组,逐个字符在 Trie…...

CTF-pwn-虚拟化-vmmware 前置

文章目录 参考vmware逃逸简介虚拟机和主机通信机制(guest to host)共享内存(弃用)backdoor机制Message_Send和Message_RecvGuestRPC实例RpcOutSendOneRawWork实例 vmware-rpctool info-get guestinfo.ip各个步骤对应的backdoor操作Open RPC channelSend …...

thinkphp8结合layui2.9 图片上传验证

<?php declare (strict_types 1);namespace app\index\validate;use think\Validate;class Upload extends Validate {/*** 定义验证规则* 格式&#xff1a;字段名 > [规则1,规则2...]** var array*/protected $rule [image > fileExt:jpg,png|fileSize:204800|fi…...

农村污水处理难题:探索低成本高效解决方案

农村污水处理难题&#xff1a;探索低成本高效解决方案 农村污水处理作为国家生态文明建设的重要一环&#xff0c;面临着诸多挑战&#xff0c;尤其是技术落后、管理分散、资源匮乏等问题。物联网技术的引入&#xff0c;为解决这些痛点提供了创新途径&#xff0c;实现了对污水处…...

lightningcss介绍及使用

lightningcss介绍及使用 一款使用 rust 编写的 css 解析器&#xff0c;转换器、及压缩器。 特性 特别快&#xff1a;可以在毫秒级别解析、压缩大量的 css 文件&#xff0c;而且比其他工具的打包结果更小给值添加类型&#xff1a;许多其他css解析器会将值解析成一个无类型的 …...

HTTP服务的应用

1、编辑json请求参数&#xff1b; 2、把json发送到服务url&#xff0c;接收服务的返回参数&#xff1b; 3、解析返回参数。 procedure TfrmCustomQuery.btnFullUpdateClick(Sender: TObject); varfrm: TfrmInputQueryConditionEX;b_OK: Boolean;sBeginDate, sEndDate, sJSON…...

uni-app:踩坑路---scroll-view内使用fixed定位,无效的问题

前言&#xff1a; emmm&#xff0c;说起来这个问题整得还挺好笑的&#xff0c;本人在公司内&#xff0c;奋笔疾书写代码&#xff0c;愉快的提交测试的时候&#xff0c;测试跟我说&#xff0c;在苹果手机上你这个样式有bug&#xff0c;我倒是要看看&#xff0c;是什么bug。 安卓…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...

Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践

前言&#xff1a;本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中&#xff0c;跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南&#xff0c;你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案&#xff0c;并结合内网…...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...