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

静态网页的爬虫(以电影天堂为例)

一、电影天堂的网址(url)

电影天堂_免费电影_迅雷电影下载_电影天堂网最好的迅雷电影下载网,分享最新电影,高清电影、综艺、动漫、电视剧等下载!https://dydytt.net/index.htm

我们要爬取这个页面上的内容

二、代码详情解释和介绍功能中所用到的知识点

这个代码涵盖了以下主要知识点:

  1. HTTP 请求与响应处理。

  2. HTML 解析与 XPath 使用。

  3. 字符串处理与数据格式化。

  4. 异常处理与程序健壮性。

  5. 列表、字典与数据结构操作。

  6. 编码处理与国际化支持。

  7. 请求间隔与反爬虫策略。

  8. 函数定义与模块化编程。

  9. 日志输出与调试技巧。

import requests
from lxml import etree
import time
import warnings# 禁用 SSL 警告
warnings.filterwarnings("ignore", category=requests.packages.urllib3.exceptions.InsecureRequestWarning)# 请求头,模拟浏览器访问
HEADERS = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36','Referer': 'https://dydytt.net/','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8','Accept-Language': 'zh-CN,zh;q=0.9','Connection': 'keep-alive',
}# 基础域名
BASE_DOMAIN = "https://dydytt.net"def get_detail_urls(url):"""获取电影详情页的 URL"""try:# 发送 HTTP 请求response = requests.get(url, headers=HEADERS, verify=False)response.raise_for_status()  # 检查请求是否成功# 解码响应内容(电影天堂使用 gbk 编码)text = response.content.decode("gbk", "ignore")# 使用 lxml 解析 HTMLhtml = etree.HTML(text)# 提取电影详情页的链接detail_urls = html.xpath("//div[@class='co_content8']//table//a/@href")# 将相对路径转换为完整 URLdetail_urls = [BASE_DOMAIN + url if url.startswith("/") else BASE_DOMAIN + "/" + url for url in detail_urls]return detail_urlsexcept Exception as e:print(f"Error fetching detail URLs: {e}")return []def parse_detail(url):"""解析电影详情页,提取电影信息"""try:# 发送 HTTP 请求response = requests.get(url, headers=HEADERS, verify=False)response.raise_for_status()  # 检查请求是否成功# 解码响应内容text = response.content.decode("gbk", "ignore")# 使用 lxml 解析 HTMLhtml = etree.HTML(text)# 提取电影标题title_elements = html.xpath("//div[@class='title_all']//font[@color='#07519a']/text()")title = title_elements[0] if title_elements else "未知标题"# 提取电影图片image_elements = html.xpath("//div[@id='Zoom']//img/@src")image = image_elements[0] if image_elements else "未知图片"# 提取电影信息(年份、评分、导演、主演、简介等)infos = html.xpath("//div[@id='Zoom']//text()")movie_info = {}for info in infos:info = info.strip()if info.startswith("◎年 代"):movie_info["year"] = info.replace("◎年 代", "").strip()elif info.startswith("◎豆瓣评分"):movie_info["score"] = info.replace("◎豆瓣评分", "").strip()elif info.startswith("◎片 长"):movie_info["duration"] = info.replace("◎片 长", "").strip()elif info.startswith("◎导 演"):movie_info["director"] = info.replace("◎导 演", "").strip()elif info.startswith("◎主 演"):movie_info["actors"] = info.replace("◎主 演", "").strip()elif info.startswith("◎简 介"):movie_info["profile"] = info.replace("◎简 介", "").strip()# 提取下载链接downurl_elements = html.xpath("//td[@bgcolor='#fdfddf']/a/@href")downurl = downurl_elements[0] if downurl_elements else "未知下载链接"# 返回电影信息return {"title": title,"image": image,**movie_info,"downurl": downurl,}except Exception as e:print(f"Error parsing detail page: {e}")return Nonedef spider():"""主爬虫函数"""# 基础 URL(电影列表页)base_url = "https://dydytt.net/index.htm"movies = []# 获取电影详情页的 URLprint("Fetching movie list from:", base_url)detail_urls = get_detail_urls(base_url)# 遍历每个详情页,提取电影信息for detail_url in detail_urls:print("Fetching movie details from:", detail_url)time.sleep(5)  # 增加请求间隔,避免被封禁movie = parse_detail(detail_url)if movie:movies.append(movie)# 打印所有电影信息for movie in movies:print(movie)if __name__ == '__main__':spider()

代码爬虫成功标志:

这个代码涉及多个 Python 编程和网络爬虫的知识点。以下是代码中用到的关键知识点及其作用:


1. HTTP 请求 (requests 库)

  • 作用:发送 HTTP 请求,获取网页内容。

  • 知识点

    • requests.get(url, headers=headers, verify=False):发送 GET 请求,获取网页内容。

    • response.content:获取响应的二进制内容。

    • response.text:获取响应的文本内容(自动解码)。

    • response.raise_for_status():检查请求是否成功,失败时抛出异常。


2. HTML 解析 (lxml 和 etree)

  • 作用:解析 HTML 文档,提取所需的数据。

  • 知识点

    • etree.HTML(text):将 HTML 文本转换为可解析的 etree 对象。

    • html.xpath("XPath表达式"):使用 XPath 表达式定位 HTML 元素。

    • 示例:html.xpath("//div[@class='title_all']//font[@color='#07519a']/text()") 提取电影标题。


3. XPath 表达式

  • 作用:用于定位 HTML 文档中的特定元素。

  • 知识点

    • //:从根节点开始查找。

    • [@属性名='值']:根据属性值筛选元素。

    • /text():提取元素的文本内容。

    • /@属性名:提取元素的属性值。

    • 示例://div[@class='co_content8']//table//a/@href 提取电影详情页的链接。


4. 字符串处理

  • 作用:清理和格式化提取的数据。

  • 知识点

    • str.strip():去除字符串两端的空白字符。

    • str.replace(old, new):替换字符串中的部分内容。

    • 示例:info.replace("◎年 代", "").strip() 提取电影年份。


5. 异常处理 (try-except)

  • 作用:捕获和处理程序运行中的异常,避免程序崩溃。

  • 知识点

    • try:尝试执行可能出错的代码。

    • except:捕获异常并处理。

    • 示例:捕获 requests.get 的异常,防止网络请求失败导致程序崩溃。


6. 列表和字典操作

  • 作用:存储和处理提取的数据。

  • 知识点

    • list.append(item):向列表中添加元素。

    • dict[key] = value:向字典中添加键值对。

    • 示例:movies.append({"title": title, "href": href}) 将电影信息存储到列表中。


7. 编码处理

  • 作用:正确处理网页的编码问题。

  • 知识点

    • response.content.decode("gbk", "ignore"):将二进制内容解码为文本,忽略无法解码的字符。

    • 电影天堂使用 gbk 编码,必须正确解码才能获取可读的文本内容。


8. 请求间隔 (time.sleep)

  • 作用:避免频繁请求导致被封禁。

  • 知识点

    • time.sleep(seconds):暂停程序执行指定的秒数。

    • 示例:time.sleep(5) 每次请求后暂停 5 秒。


9. 禁用 SSL 验证

  • 作用:忽略 SSL 证书验证,避免 HTTPS 请求失败。

  • 知识点

    • requests.get(verify=False):禁用 SSL 验证。

    • warnings.filterwarnings("ignore", category=InsecureRequestWarning):禁用 SSL 警告。


10. 函数定义与调用

  • 作用:将代码模块化,提高可读性和复用性。

  • 知识点

    • def function_name(parameters)::定义函数。

    • function_name(arguments):调用函数。

    • 示例:get_detail_urls(url) 获取电影详情页的 URL。


11. 循环与条件判断

  • 作用:遍历数据并根据条件执行不同的操作。

  • 知识点

    • for item in list::遍历列表中的每个元素。

    • if condition::根据条件执行代码。

    • 示例:遍历电影详情页的 URL 并解析每个页面。


12. 日志输出 (print)

  • 作用:打印程序运行状态和结果,便于调试。

  • 知识点

    • print(message):输出信息到控制台。

    • 示例:print("Fetching movie list from:", base_url) 打印当前正在处理的 URL。


13. 模块导入 (import)

  • 作用:引入外部库或模块,扩展 Python 的功能。

  • 知识点

    • import requests:导入 requests 库。

    • from lxml import etree:从 lxml 库中导入 etree 模块。

    • import time:导入 time 模块。


14. URL 拼接

  • 作用:将相对路径转换为完整 URL。

  • 知识点

    • BASE_DOMAIN + url:拼接基础域名和相对路径。

    • 示例:BASE_DOMAIN + "/" + url 处理相对路径。


15. 默认值处理

  • 作用:在数据缺失时提供默认值,避免程序崩溃。

  • 知识点

    • list[0] if list else "默认值":如果列表不为空,返回第一个元素,否则返回默认值。

    • 示例:title_elements[0] if title_elements else "未知标题" 处理电影标题缺失的情况。

相关文章:

静态网页的爬虫(以电影天堂为例)

一、电影天堂的网址(url) 电影天堂_免费电影_迅雷电影下载_电影天堂网最好的迅雷电影下载网,分享最新电影,高清电影、综艺、动漫、电视剧等下载!https://dydytt.net/index.htm 我们要爬取这个页面上的内容 二、代码…...

将图片存储至阿里云 OSS

将图片存储至阿里云 OSS 一、概述 在项目开发中,我们常常需要处理用户上传的图片。本文将介绍如何使用前端的 el-upload 组件将照片上传到后端,后端再将照片存储到阿里云 OSS,并最终返回图片的 URL 给前端。 二、前端实现 1. 安装依赖 确…...

Android设备是如何进入休眠的呢?

首先我们手机灭屏后,一般需要等一段时间CPU才真正进入休眠。即Android设备屏幕暗下来的时候,并不是立即就进入了休眠模式;当所有唤醒源都处于de-avtive状态后,系统才会进入休眠。在手机功耗中从灭屏开始到CPU进入休眠时间越短&…...

ctfshow做题笔记—栈溢出—pwn65~pwn68

目录 前言 一、pwn65(你是一个好人) 二、pwn66(简单的shellcode?不对劲,十分得有十二分的不对劲) 三、pwn67(32bit nop sled)(确实不会) 四、pwn68(64bit nop sled) 前言 做起来比较吃力哈哈,自己还是太菜了&…...

高效处理 List<T> 集合:更新、查找与优化技巧

引言 在日常开发中,List<T> 是我们最常用的数据结构之一。无论是批量更新数据、查找特定项还是进行复杂的集合操作,掌握 List<T> 的高级用法可以显著提高代码的效率和可读性。本文将详细介绍如何使用 List<T> 进行批量更新、查找匹配项以及优化性能的方法…...

Java基础系列:深入解析final与static关键字的奥秘与避坑指南

目录 一、final关键字的四重境界 1. 修饰常量&#xff08;成员变量/局部变量&#xff09; 2. 修饰方法&#xff08;禁止重写&#xff09; 3. 修饰类&#xff08;禁止继承&#xff09; 4. 并发控制&#xff08;内存屏障&#xff09; 二、static关键字的四维空间 1. 静态变…...

django各种mixin用法

在 Django 中,Mixin 是一种用于扩展类功能的设计模式。通过 Mixin,可以在不修改原有类的情况下,为其添加新的方法或属性。Django 中的 Mixin 广泛应用于视图(View)、表单(Form)、模型(Model)等组件中。以下是 Django 中常见 Mixin 的用法和示例: 一、视图(View)中的…...

JS中的闭包(closures)一种强大但易混淆的概念

JavaScript 中的闭包&#xff08;closures&#xff09;被认为是一种既强大又易混淆的概念。闭包允许函数访问其外部作用域的变量&#xff0c;即使外部函数已执行完毕&#xff0c;这在状态维护和回调函数中非常有用。但其复杂性可能导致开发者的误解&#xff0c;尤其在变量捕获和…...

Element使用

Element(美化网页&#xff09; ElementUI的使用注意事项&#xff1a; Element.ui的使用基于Vue环境&#xff0c;于是Element相关组件的使用必须放在Vue对象绑定的视图中去 ElementUI的JS库的引入必须放在vue.js库的后面 <!-- 引入样式 --><link rel"styleshee…...

基于YOLO11深度学习的电瓶车进电梯检测与语音提示系统【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...

R语言的基础命令及实例操作

> T & F [1] FALSE > T & T [1] TRUE > T | F [1] TRUE > F | F [1] FALSE > a <- c(T,F,T) > b <- c(F,F,T) > a & b [1] FALSE FALSE TRUE > a | b [1] TRUE FALSE TRUE 在 R 中&#xff0c;大小写是敏感的&#xff0c;也就是说…...

AI视频生成工具清单(附网址与免费说明)

以下是一份详细的AI视频制作网站总结清单&#xff0c;包含免费/付费信息及核心功能说明&#xff1a; AI视频生成工具清单&#xff08;附网址与免费说明&#xff09; 1. Synthesia 网址&#xff1a;https://www.synthesia.io是否免费&#xff1a;免费试用&#xff08;生成视频…...

知识蒸馏综述Knowledge Distillation: A Survey解读

论文链接&#xff1a;Knowledge Distillation: A Survey 摘要&#xff1a;近年来&#xff0c;深度神经网络在工业界和学术界都取得了成功&#xff0c;尤其是在计算机视觉任务方面。深度学习的巨大成功主要归功于它能够扩展以对大规模数据进行编码&#xff0c;并且能够处理数十…...

第十五届蓝桥杯省赛电子类单片机学习过程记录(客观题)

客观试题: 01.典型的BUCK电源电路包含哪些关键器件(ABCD) A. 电容 B. 二极管 C. 电感 D. MOSFET 解析: 典型的 BUCK 电源电路是一种降压型的直流-直流转换电路,它包含以下关键器件: A.电容:电容在电路中起到滤波的作用。输入电容用于平滑输入电压的波动,减少电源噪声对…...

【C++】:STL详解 —— 红黑树封装map和set

目录 红黑树的源代码 正向迭代器的代码 反向迭代器的代码 set的模拟实现 map的模拟实现 红黑树的源代码 #pragma once #include <iostream>using namespace std; // set ->key // map ->key/value// set ->key // map ->key/valueenum Colour {RED,BLAC…...

【QWEN】机器人控制器的控制周期越短精度越高吗

好的&#xff0c;用户问的是“机器人控制器的控制周期越短精度越高吗”。我需要根据提供的知识库内容来回答这个问题。首先&#xff0c;我得回忆一下知识库里的相关信息。 知识库里有几篇相关的文章。比如&#xff0c;[3]提到控制周期越短&#xff0c;控制性能的上限越高&…...

使用数据库和缓存的时候,是如何解决数据不一致的问题的?

1.缓存更新策略 1.1. 缓存旁路模式&#xff08;Cache Aside&#xff09; 在应用里负责管理缓存&#xff0c;读取时先查缓存&#xff0c;如果命中了则返回缓存&#xff0c;如果未命中就查询数据库&#xff0c;然后返回缓存&#xff0c;返回缓存的同时把数据给写入缓存中。更新…...

【c++】平移字符串

说明 实现字符串的左移与右移 示例代码 #include <iostream> #include <string> using namespace std;int main() {string str1 "12345";//左移2位string str2 str1.substr(2) str1.substr(0, 2);cout << str2 << endl;//右移2位&…...

基于Spring Boot的多级缓存架构实现

基于Spring Boot的多级缓存架构实现 以下是一个基于Spring Boot的多级缓存架构实现示例 多级缓存架构实现方案 1. 依赖配置&#xff08;pom.xml&#xff09; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-star…...

为什么DDPG需要目标网络而A2C不需要?

在强化学习中&#xff0c;DDPG需要目标网络而A2C不需要的主要原因在于算法架构、更新方式和目标稳定性需求的差异&#xff1a; Q值估计的稳定性需求不同 DDPG的Critic网络需要估计状态-动作值函数 Q ( s , a ) Q(s,a) Q(s,a)&#xff0c;其目标值的计算涉及下一个状态的最大Q值…...

蓝桥杯 C++ b组 统计子矩阵深度解析

题目大意&#xff1a;给定一个 NM 的矩阵 A&#xff0c;请你统计有多少个子矩阵 (最小11&#xff0c;最大NM) 满足子矩阵中所有数的和不超过给定的整数 K&#xff1f; 前言&#xff1a;这题很容易想到二维前缀和优化&#xff0c;然后枚举子矩阵&#xff0c;但这样时间复杂度为…...

YOLOv12本地部署教程——42%速度提升,让高效目标检测触手可及

YOLOv12 是“你只看一次”&#xff08;You Only Look Once, YOLO&#xff09;系列的最新版本&#xff0c;于 2025 年 2 月发布。它引入了注意力机制&#xff0c;提升了检测精度&#xff0c;同时保持了高效的实时性能。在保持速度的同时&#xff0c;显著提升了检测精度。例如&am…...

每天五分钟深度学习PyTorch:向更深的卷积神经网络挑战的ResNet

本文重点 ResNet大名鼎鼎,它是由何恺明团队设计的,它获取了2015年ImageNet冠军,它很好的解决了当神经网络层数过多出现的难以训练的问题,它创造性的设计了跳跃连接的方式,使得卷积神经网络的层数出现了大幅度提升,设置可以达到上千层,可以说resnet对于网络模型的设计具…...

C++11新特性 11.基于范围的for循环

一.简介 基本概念&#xff1a; 在 C 中&#xff0c;基于范围的 for 循环&#xff08;Range-based for loop&#xff09;是一种简化容器遍历的语法糖&#xff0c;适用于所有支持 begin() 和 end() 的容器&#xff08;如 vector、map、array 等&#xff09;。以下是其核心用法和…...

Linux搜索---locate

locate locate 是 Linux 系统中用于快速查找文件和目录的命令。它并非实时遍历文件系统&#xff0c;而是通过搜索预先建立的文件数据库来定位文件。该数据库由 updatedb 程序定期&#xff08;通常是每天&#xff09;更新&#xff0c;收录了系统中所有文件的路径信息&#xff0…...

c语言笔记 一维数组与二维数组

1.一维数组和二维数组名加1代表什么意思&#xff0c;偏移多少单位&#xff1f; 方法&#xff1a;1就是以数组的元素类型的字节为单位去偏移。 先看结论再代码验证&#xff1a; 一维数组名&#xff0b;1表示加一个整型单位的偏移量&#xff0c;也可以这么理解1就是以数组的元…...

认识Event Loop【1】

前言 这应该是一个系列文章&#xff0c;因为我觉得Event Loop&#xff08;事件循环&#xff09;是一件很抽象也很重要的一个机制。eventloop这个知识点处于非常杂糅的位置&#xff0c;和很多其他知识&#xff0c;如运行时、浏览器、渲染流程、数据结构、线程等等&#xff0c;也…...

《Linux栈破坏了,如何还原》

【栈破坏导读】栈破坏有了解过吗&#xff1f;何为栈破坏&#xff0c;栈破坏了&#xff0c;程序会立刻引发崩溃&#xff0c;我们通过gdb去调试coredump&#xff0c;栈被破坏的栈帧是没法被恢复的&#xff0c;这也给我们调试程序带来很大的困难&#xff0c;那如何还原栈破坏的第一…...

环形链表问题的探究与代码实现

在数据结构与算法的学习中&#xff0c;环形链表是一个经典的问题。它不仅考察对链表这种数据结构的理解&#xff0c;还涉及到指针操作和逻辑推理。本文将结合代码和图文&#xff0c;深入分析如何判断链表中是否有环以及如何找到环的入口点。 目录 一、判断链表中是否有环 …...

【CSS3】筑基篇

目录 复合选择器后代选择器子选择器并集选择器交集选择器伪类选择器 CSS 三大特性继承性层叠性优先级 背景属性背景色背景图背景图平铺方式背景图位置背景图缩放背景图固定背景复合属性 显示模式显示模式块级元素行内元素行内块元素 转换显示模式 结构伪类选择器结构伪类选择器…...