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

news2025/3/10 13:24:41

一、电影天堂的网址(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 解析 HTML
        html = etree.HTML(text)
        # 提取电影详情页的链接
        detail_urls = html.xpath("//div[@class='co_content8']//table//a/@href")
        # 将相对路径转换为完整 URL
        detail_urls = [BASE_DOMAIN + url if url.startswith("/") else BASE_DOMAIN + "/" + url for url in detail_urls]
        return detail_urls
    except 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 解析 HTML
        html = 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 None


def spider():
    """
    主爬虫函数
    """
    # 基础 URL(电影列表页)
    base_url = "https://dydytt.net/index.htm"
    movies = []

    # 获取电影详情页的 URL
    print("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 "未知标题" 处理电影标题缺失的情况。

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

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

相关文章

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

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

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

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

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

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

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;也就是说…

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

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

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

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

【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位&…

为什么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…

认识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 三大特性继承性层叠性优先级 背景属性背景色背景图背景图平铺方式背景图位置背景图缩放背景图固定背景复合属性 显示模式显示模式块级元素行内元素行内块元素 转换显示模式 结构伪类选择器结构伪类选择器…

React:类组件(上)

kerwin老师我来了 类组件的创建 class组件&#xff0c;js里的类命名首字符大写&#xff0c;类里面包括构造函数&#xff0c;方法 组件类要继承React.Component才有效 必须包含render方法 import React from react class App extends React.Component{render() {return <…

Spring Cloud之注册中心之Nacos的使用

目录 Naacos 服务注册/服务发现 引⼊Spring Cloud Alibaba依赖 引入Nacos依赖 引入Load Balance依赖 配置Nacos地址 服务端调用 启动服务 Naacos Nacos是Spring Cloud Alibaba的组件, Spring Cloud Alibaba遵循Spring Cloud中定义的服务注册, 服务发现规范. 因此使⽤Na…

字符串相乘——力扣

给定两个以字符串形式表示的非负整数 num1 和 num2&#xff0c;返回 num1 和 num2 的乘积&#xff0c;它们的乘积也表示为字符串形式。 注意&#xff1a;不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 输入: num1 "2", num2 "3" …

基于OpenCV的车牌识别系统(源码+论文+部署教程)

运行环境 基于OpenCV的车牌识别系统运行环境如下&#xff1a; • Python: ≥ 3.5 • OpenCV: ≥ 4.0 • IDE工具&#xff1a;Visual Studio Code&#xff08;可自行选择&#xff09; • 技术栈&#xff1a;Python OpenCV Tkinte 主要功能 基于OpenCV的车牌识别系统主要…