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

embedded/2024/9/23 13:53:28/

思路:

  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/embedded/33074.html

相关文章

分割回文串(力扣131)

解题思路&#xff1a;仍就是上递归三部曲&#xff0c;但于此同时要明白此时的index就可以作为切割回文串的线了 具体代码如下&#xff1a; class Solution { private: vector<vector<string>> result; vector<string> path; // 放已经回文的子串 void back…

深入浅出 BERT

Transformer 用于学习句子中的长距离依赖关系&#xff0c;同时执行序列到序列的建模。 它通过解决可变长度输入、并行化、梯度消失或爆炸、数据规模巨大等问题&#xff0c;比其他模型表现更好。使用的注意力机制是神经架构的一部分&#xff0c;使其能够动态突出显示输入数据的…

C语言数据结构之队列

目录 1.队列的概念及结构2.队列的实现逻辑3.队列的代码实现4.相关例题选择题 •͈ᴗ•͈ 个人主页&#xff1a;御翮 •͈ᴗ•͈ 个人专栏&#xff1a;C语言数据结构 •͈ᴗ•͈ 欢迎大家关注和订阅!!! 1.队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#x…

php中常用的数据类型汇总

在 PHP 中&#xff0c;常用的数据类型主要有以下几种&#xff1a; 标量类型&#xff08;Scalar Types&#xff09; integer&#xff08;整型&#xff09;&#xff1a;用于存储整数&#xff0c;可以是正数或负数。float&#xff08;浮点型/双精度型&#xff09;&#xff1a;用于…

Qt 配置 OpenCV

MinGW CMake 下载 OpenCV 源代码 使用 CMake 生成 OpenCV 的 Makefile // 设置源码 Where is the source code: C:\Program Files\OpenCV\source // 生成路径 C:\Program Files\OpenCV\build点击 Configure&#xff0c;设置编译器 Specify the generator for this project:…

JVM-02

字节码文件是一种特殊的文件格式&#xff0c;它包含了将源代码转换为机器可执行代码所需的指令集。字节码文件通常是由编译器将源代码编译为字节码的中间表示形式。 在Java中&#xff0c;字节码文件的扩展名为.class&#xff0c;它存储了编译后的Java代码。这些字节码文件可以在…

vue设置必填项

表单&#xff1a; <el-form-item label"标题" prop"title" ><el-input placeholder"标题" v-model"form.title"></el-input></el-form-item> 在data中添加一个rules来规定 rules: {title: [{ required: t…

Golang日志管理精讲:`log`库的高级用法与性能优化

Golang日志管理精讲&#xff1a;log库的高级用法与性能优化 引言log库概览核心组件介绍日志级别的设置标准Logger与自定义Logger 基础用法创建基础日志实例日志级别的设置标准Logger与自定义Logger 高级技巧日志格式自定义多日志文件分流集成系统服务中的日志管理 并发与性能优…