批量抓取某电影网站的下载链接

devtools/2024/9/24 11:26:56/

思路:

  1. 进入电影天堂首页,提取到主页面中的每一个电影的背后的那个urL地址
    a. 拿到“2024必看热片”那一块的HTML代码
    b. 从刚才拿到的HTML代码中提取到href的值
  2. 访问子页面,提取到电影的名称以及下载地址
    a. 拿到子页面的页面源代码
    b. 数据提取

代码实现:

python">from tqdm import tqdm
import requests
import re
from selenium import webdriver
from selenium.webdriver.edge.options import Optionsclass MovieScraper:"""MovieScraper类用于从网站抓取电影信息。属性----------edge_options : Options用于配置webdriver的selenium Options对象web_driver : webdriver用于与网站交互的selenium webdriverrequest_headers : dict包含请求头的字典方法-------get_response(url)向指定的URL发送GET请求并返回响应。get_movie_list_html(response)从响应中提取电影列表的HTML。get_sub_url_list(movie_list_html)从电影列表HTML中提取子URL。get_movie_info(child_response)从子URL的响应中提取电影信息。scrape(target_url)从指定的URL抓取电影信息并写入文件。"""def __init__(self):"""初始化MovieScraper,配置webdriver和请求头。"""self.edge_options = Options()self.edge_options.add_argument("headless")self.web_driver = webdriver.Edge(options=self.edge_options)self.request_headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"}def get_response(self, url):"""向指定的URL发送GET请求并返回响应。参数----------url : str要发送请求的URL。返回-------response : ResponseGET请求的响应。"""response = requests.get(url, headers=self.request_headers)response.encoding = "gbk"return responsedef get_movie_list_html(self, response):"""从响应中提取电影列表的HTML。参数----------response : Response要提取HTML的响应。返回-------movie_list_html : str电影列表的HTML。"""movie_list_pattern = re.compile(r'2024必看热片.*?<ul>(?P<html>.*?)</ul>', re.S)movie_list_result = movie_list_pattern.search(response.text)return movie_list_result.group("html")def get_sub_url_list(self, movie_list_html):"""从电影列表HTML中提取子URL。参数----------movie_list_html : str电影列表的HTML。返回-------sub_url_list : iterator子URL的迭代器。"""sub_url_pattern = re.compile(r"<li><a href='(?P<sub_url>.*?)'", re.S)return sub_url_pattern.finditer(movie_list_html)def get_movie_info(self, child_response):"""从子URL的响应中提取电影信息。参数----------child_response : Response要提取电影信息的响应。返回-------movie_info_result : Match包含电影信息的匹配对象。"""movie_info_pattern = re.compile(r'◎片  名 (?P<movie>.*?)<br.*?<td style="WORD-WRAP: break-word" bgcolor="#fdfddf"><a href="(?P<download>.*?)"', re.S)return movie_info_pattern.search(child_response.text)def scrape(self, target_url):"""从指定的URL抓取电影信息并写入文件。参数----------target_url : str要抓取电影信息的URL。"""self.web_driver.get(target_url)response = self.get_response(target_url)movie_list_html = self.get_movie_list_html(response)sub_url_list = self.get_sub_url_list(movie_list_html)with open("电影天堂.txt", "w", encoding="utf-8") as file:for sub_url in tqdm(sub_url_list, desc="处理URL中", unit="URL"):child_url = target_url + sub_url.group("sub_url")child_response = self.get_response(child_url)movie_info_result = self.get_movie_info(child_response)download_link = movie_info_result.group("download")file.write(download_link + "\n")self.web_driver.quit()print("爬取完毕")if __name__ == "__main__":scraper = MovieScraper()scraper.scrape("https://www.dy2018.com/")

效果:

在这里插入图片描述


http://www.ppmy.cn/devtools/32990.html

相关文章

【阿里云服务器】ubuntu 22.04.1安装docker以及部署java环境

我的服务器配置是2GB CPU 2GB 内存 Ubuntu22.04 目录 一、阿里云 ubuntu 22.04.1安装docker 二、docker基础命令 三、Windows电脑访问云服务器 四、安装java环境 安装OpenJDK 8&#xff08;可以根据需要安装其他版本的JDK&#xff09; 安装java的依赖管理工具maven 一、…

IP 寻址与地址解析

目录 前言 1.IP 分类地址 2.IP 子网与超网 3.组成 IP 超网 4.无类地址与 CIDR 5.配置管理 6.地址解析 总结 前言 在互联网协议 (IP) 的世界中&#xff0c;寻址和地址解析是关键概念。它们使设备能够在互联网上唯一地标识和相互通信。让我们深入了解 IP 寻址、子网、超网…

消息队列 RabbitMQ python实战

企业面临着信息爆炸、实时数据处理、高效通信等诸多挑战。如何确保系统稳定运行、信息快速传递、应用程序高效通信?答案在于消息队列!异步通信: 不必等待!系统解耦: 消息队列将应用程序的通信解耦,降低彼此之间的依赖,让开发、部署、扩展更加灵活。数据持久化: 确保重要…

怎么让电脑耳机和音响都有声音

电脑耳机音响不能同时用没声音怎么办 一般来说&#xff0c;重新开机后问题能够得到解决。右击“我的电脑”---“属性”---“硬件”---“设备管理器”&#xff0c;打开“声音、视频和游戏控制器”有无问题&#xff0c;即看前面有没有出现黄色的“”。 如果您的 电脑 耳机能正常…

【LeetCode刷题记录】98. 验证二叉搜索树

98 验证二叉搜索树 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 示例…

JVM笔记2--垃圾收集算法

1、如何确认哪些对象“已死” 在上一篇文章中介绍到Java内存运行时的各个区域。其中程序计数器、虚拟机栈、本地方法栈3个区域随着线程而生&#xff0c;随线程而灭&#xff0c;栈中的栈帧随着方法的进入和退出而有条不紊的执行着入栈和出栈操作。每个栈帧中分配多少内存基本上…

【数据库】Elasticsearch的操作

在关系数据库和Elasticsearch之间&#xff0c;对基本概念和数据结构的理解对于使用两者进行有效的数据操作非常关键。下面是关系数据库和Elasticsearch之间的基本概念比较&#xff0c;包括实际的应用例子&#xff1a; 对比数据库的概念 数据库与索引 关系数据库 在关系数据…

【k8s】利用Kubeadm搭建k8s1.29.x版本+containerd

文章目录 前言1.准备的三台虚拟机2.安装 kubeadm 前的准备工作3.安装containerd1.解压安装包2.生成默认配置文件3.使用systemd托管containerd4.修改默认配置文件 4.安装runc5.安装 CNI plugins5.1 安装nerdctl 6.安装 kubeadm、kubelet 和 kubectl6.1 配置crictl 7.初始化集群1…