《0基础》学习Python——第二十四讲__爬虫/<7>深度爬取
一、深度爬取
深度爬取是指在网络爬虫中,获取网页上的所有链接并递归地访问这些链接,以获取更深层次的页面数据。
通常,一个简单的爬虫只会获取到初始页面上的链接,并不会进一步访问这些链接上的其他页面。而深度爬取则会不断地获取链接,并继续访问这些链接上的页面,直到达到设定的深度限制或者没有更多的链接可供访问为止。这样可以更全面地获取网页上的数据,并且可以发现更多的链接。但是需要注意的是,深度爬取需要谨慎操作,以免对目标网站造成过大的负载。
二、爬取豆瓣电影的电影链接中的数据
比如点开下列页面中的链接得到另一个页面,而另一个页面就有很多新的数据,就可以爬取更多的东西,当然了,点开后的链接也可以下次爬取,只需要对爬到的URL再次进行发送get请求即可。
点开蓝色选中的链接得到关于这个电影的全部信息:
上图中所有的数据都可以爬取,下面我们就演示一下对电影目录一整页的数据进行深度爬取
三、实战爬取整页电影目录的数据
1、获取这一整页电影的所有URL:
经过前面几节课,我们也都学习了怎么样去获取网页信息,因为这些电影都是存放在一个列表里的(在点击网络-元素-在网页中选择一个元素检查的标识,当选中网页中可以看到各个板块的排列位置),或者也可以在‘元素’里看到当前页面电影信息都存放在li标签下,所以可以通过下列图片得到单个电影的URL,下面代码部分就是爬取到了所有电影的URL了:
import requests
from lxml import etree
import fake_useragentif __name__ == '__main__':head={'User-Agent':fake_useragent.UserAgent().random #随机生成一个UA标识}#获取当前页面的URLurl='https://movie.douban.com/top250'#发送get请求response=requests.get(url,headers=head)#返回获取到的页面源码lxml_info=response.text#解析获取到的信息tree=etree.HTML(lxml_info)#利用xpath定位到所有电影存放的标签下film=tree.xpath('//ol[@class="grid_view"]/li')#对获取到的所有li标签进行遍历循环for li in film:#当前位置在li标签,用xpath读取到电影链接,再通过join去除括号film_url="".join(li.xpath('./div/div[2]/div[1]/a/@href'))print(film_url)
2、爬取链接内的页面信息
通过上一步我们已经得到所有电影的URL了,那么下一步则是对这些URL继续进行get请求:
for li in film:#当前位置在li标签,用xpath读取到电影链接,再通过join去除括号film_url="".join(li.xpath('./div/div[2]/div[1]/a/@href'))#对获取到的URL发送get请求res=requests.get(film_url,headers=head)#打印请求到的信息res_t=res.text
获取到电影页面信息后我们继续像上部一样对这段数据进行处理,即以下代码:
res_t=res.text# print(res_t)#解析获取到的信息tree_url=etree.HTML(res_t)#定位到所需要信息的位置,比如我们要爬取他的剧情简介#首先是电影名称fil_name="".join(tree_url.xpath('//body/div[3]/div[1]/h1/span[1]/text()'))#其次是电影的简介内容#因为此处有两种类型的电影简介标签位置span[1]和span[2],所以做一个判断,如果电影1有内容那么打印电影1,反之打印电影2if "".join(tree_url.xpath('//div[@class="related-info"]/div[1]/span[2]/text()')):print(fil_name)print("".join(tree_url.xpath('//div[@class="related-info"]/div[1]/span[2]/text()')).strip())else:film_jianjie = "".join(tree_url.xpath('//div[@class="related-info"]/div[1]/span[1]/text()'))print(fil_name)print(film_jianjie.strip())
注意:此处做了一个判断,因为其中电影的标签存放位置略有不同,即span[1]和span[2]
如下图肖申克的救赎,其简介存放在标签span[2]下,而霸王别姬存放在span[1]下:
霸王别姬如下:
3、完整代码如下:
import requests
from lxml import etree
import fake_useragentif __name__ == '__main__':head={'User-Agent':fake_useragent.UserAgent().random #随机生成一个UA标识}#获取当前页面的URLurl='https://movie.douban.com/top250'#发送get请求response=requests.get(url,headers=head)#返回获取到的页面源码lxml_info=response.text#解析获取到的信息tree=etree.HTML(lxml_info)#利用xpath定位到所有电影存放的标签下film=tree.xpath('//ol[@class="grid_view"]/li')#对获取到的所有li标签进行遍历循环for li in film:#当前位置在li标签,用xpath读取到电影链接,再通过join去除括号film_url="".join(li.xpath('./div/div[2]/div[1]/a/@href'))#对获取到的URL发送get请求res=requests.get(film_url,headers=head)#打印请求到的信息res_t=res.text# print(res_t)#解析获取到的信息tree_url=etree.HTML(res_t)#定位到所需要信息的位置,比如我们要爬取他的剧情简介#首先是电影名称fil_name="".join(tree_url.xpath('//body/div[3]/div[1]/h1/span[1]/text()'))#其次是电影的简介内容#因为此处有两种类型的电影简介标签位置span[1]和span[2],所以做一个判断,如果电影1有内容那么打印电影1,反之打印电影2if "".join(tree_url.xpath('//div[@class="related-info"]/div[1]/span[2]/text()')):print(fil_name)print("".join(tree_url.xpath('//div[@class="related-info"]/div[1]/span[2]/text()')).strip())else:film_jianjie = "".join(tree_url.xpath('//div[@class="related-info"]/div[1]/span[1]/text()'))print(fil_name)print(film_jianjie.strip())
另外可以在后面加一条创建新文件的代码用来存放这些数据,已达到获取信息存放到本地保存的目的。
相关文章:

《0基础》学习Python——第二十四讲__爬虫/<7>深度爬取
一、深度爬取 深度爬取是指在网络爬虫中,获取网页上的所有链接并递归地访问这些链接,以获取更深层次的页面数据。 通常,一个简单的爬虫只会获取到初始页面上的链接,并不会进一步访问这些链接上的其他页面。而深度爬取则会不断地获…...
Python Pygame制作简单五子棋游戏
代码参考自:https://blog.csdn.net/weixin_43918046/article/details/119521845 新增功能:1任意棋盘大小;2.任意棋子连线 # 棋盘大小 [670, 670] # 棋盘行列 15*15 import pygame from pygame.locals import QUIT, KEYDOWN import numpy as…...

JS+H5在线文心AI聊天(第三方接口)
源码在最后面 调用的不是文心官方接口 可以正常聊天 有打字动画 效果图 源代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-s…...

kafka源码阅读-ReplicaStateMachine(副本状态机)解析
概述 Kafka源码包含多个模块,每个模块负责不同的功能。以下是一些核心模块及其功能的概述: 服务端源码 :实现Kafka Broker的核心功能,包括日志存储、控制器、协调器、元数据管理及状态机管理、延迟机制、消费者组管理、高并发网络…...

【MetaGPT系列】【MetaGPT完全实践宝典——如何定义单一行为多行为Agent】
目录 前言一、智能体1-1、Agent概述1-2、Agent与ChatGPT的区别 二、多智能体框架MetaGPT2-1、安装&配置2-2、使用已有的Agent(ProductManager)2-3、拥有单一行为的Agent(SimpleCoder)2-3-1、定义写代码行为2-3-2、角色定义2-3…...

Kolla-Ansible的确是不支持CentOS-Stream系列产品了
看着OpenStack最新的 C 版本出来一段时间了,想尝个鲜、用Kolla-Ansible进行容器化部署,结果嘛。。。 根据实验结果,自OpenStack Bobcat版本开始,Kolla-Ansible就适合在CentOS系列产品上部署了,通过对 Bobcat和Caracal…...

IDEA启动C:\Users\badboy\.jdks\corretto-17.0.7\bin\java.exe -Xmx700m报错
这篇文章写的就很详细了(IDEA启动C:\Users\badboy\.jdks\corretto-17.0.7\bin\java.exe -Xmx700m报错_error occurred during initialization of vm failed -CSDN博客)...

ctfshow298-300(java信息泄露,代码审计)
Web298 代码审计 这里看到getVipStatus方法,获得了获取flag的条件就是user等于admin,password等于ctfshow Poc: https://d036a90d-ac1c-4de1-9b0b-86f52d2586b9.challenge.ctf.show/ctfshow/login?usernameadmin&passwordctfshow Web299 打开页面…...

Java 基础 and 进阶面试知识点(超详细)
一个 Java 文件中是否可以存在多个类(修饰类除外)? 一个 Java 文件中是可以存在多个类的,但是一个 Java 文件中只能存在一个 public 所修饰的类,而且这个 Java 文件的文件名还必须和 public 所修饰类的类名保持一致&a…...

【LabVIEW作业篇 - 5】:水仙花数、数组与for循环的连接
文章目录 水仙花数数组与for循环的连接 水仙花数 水仙花数,是指一个3位数,它的每个位上的数字的3次幂之和等于它本身。如371 3^3 7^3 1^3,则371是一个水仙花数。 思路:水仙花数是一个三位数,通过使用for循环…...
Kafka系列之如何提高消费者消费速度
前言 在实际开发过程中,如果使用Kafka处理超大数据量(千万级、亿级)的场景,Kafka消费者的消费速度可能决定系统性能瓶颈。 实现方案 为了提高消费者的消费速度,我们可以采取以下措施: 将主题的分区数量增大,如 20&…...
mac安装Whisper
Whisper 官方git https://github.com/openai/whisper?tabreadme-ov-file 基本上参考官方的安装流程 pip3 install -U openai-whisper pip3 install githttps://github.com/openai/whisper.git pip3 install --upgrade --no-deps --force-reinstall githttps://github.com/…...

Linux:进程概述(什么是进程、进程控制块PCB、并发与并行、进程的状态、进程的相关命令)
进程概述 (1)What(什么是进程) 程序:磁盘上的可执行文件,它占用磁盘、是一个静态概念 进程:程序执行之后的状态,占用CPU和内存,是一个动态概念;每一个进程都有一个对应的进程控制块…...

Unity UGUI 之 坐标转换
本文仅作学习笔记与交流,不作任何商业用途 本文包括但不限于unity官方手册,唐老狮,麦扣教程知识,引用会标记,如有不足还请斧正 本文在发布时间选用unity 2022.3.8稳定版本,请注意分别 前置知识:…...

使用 uPlot 在 Vue 中创建交互式图表
本文由ScriptEcho平台提供技术支持 项目地址:传送门 使用 uPlot 在 Vue 中创建交互式图表 应用场景介绍 uPlot 是一个轻量级、高性能的图表库,适用于创建各种交互式图表。它具有丰富的功能,包括可自定义的轴、网格、刻度和交互性。本篇博…...

SpringBoot 项目配置文件注释乱码的问题解决方案
一、问题描述 在项目的配置文件中,我们写了一些注释,如下所示: 但是再次打开注释会变成乱码,如下所示: 那么如何解决呢? 二、解决方案 1. 点击” File→Setting" 2. 搜索“File Encodings”, 将框…...
TTS如何正确读AI缩写、金额和数字
案例:Tell me whats AI(a i), you need pay $186.30, your card Number is 1 2 3, your work Number is 5 6 7 8...
python基础知识点(蓝桥杯python科目个人复习计划75)
第一题:ip补充 题目描述: 小蓝的ip地址为192.168.*.21,其中*是一个数字,请问这个数字最大可能是多少? import os import sys# 请在此输入您的代码 print("255") 第二题:出现最多的字符 题目描…...

小技巧:如何在已知PDF密码情况下去掉PDF的密码保护
第一步,用Edge打开你的pdf,输入密码进去 第二步,点击打印 第三步,选择导出PDF,选择彩印 第四步,选择导出位置,导出成功后打开发现没有密码限制了!...

Java泛型的介绍和基本使用
什么是泛型 泛型就是将类型参数化,比如定义了一个栈,你必须在定义之前声明这个栈中存放的数据的类型,是int也好是double或者其他的引用数据类型也好,定义好了之后这个栈就无法用来存放其他类型的数据。如果这时候我们想要使用这…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...
Qt Quick Controls模块功能及架构
Qt Quick Controls是Qt Quick的一个附加模块,提供了一套用于构建完整用户界面的UI控件。在Qt 6.0中,这个模块经历了重大重构和改进。 一、主要功能和特点 1. 架构重构 完全重写了底层架构,与Qt Quick更紧密集成 移除了对Qt Widgets的依赖&…...

Linux入门课的思维导图
耗时两周,终于把慕课网上的Linux的基础入门课实操、总结完了! 第一次以Blog的形式做学习记录,过程很有意思,但也很耗时。 课程时长5h,涉及到很多专有名词,要去逐个查找,以前接触过的概念因为时…...