Python爬虫(二)——爬取电影天堂,保存下载地址

2023-05-16

首先我们开始要分析一下,下载种子我们需要哪几步:

  1. 获取所有电影页的访问地址
  2. 获取电影页源码
  3. 提取出下载地址
  4. 将下载地址保存

首先第一步,我们来分析一下电影天堂网站的结构,发现他跟我们的古诗文网还是非常类似的,全站静网结构,不需要登录,页面有全新的地址,这对于初学来讲是非常容易上手的;接下来我们以国内电影(https://www.ygdy8.net/html/gndy/china/index.html)为例,先把所有电影详情页的地址获取到:

我们发现我们需要的地址<a href="***" class="ulink">以链接的形式存在,且所有的地址都是这种形式,那么我们可以用正则表达式直接匹配所有符合这种样式的文本,最后把地址做一个拼接就好了;

我们发现乱码了,这是因为什么,我们之前在爬取古诗文网的时候是没有这种问题的,这是因为网站的文字编码不一样,在我们python3里面默认使用的是utf-8,我们看下古诗文网和电影天堂的编码格式分别是什么:


我们发现古诗文网的编码格式就是“utf-8”,而电影天堂的编码格式是“gb2312”,编码格式不一样,当然会乱码了,所以我们需要设置一下编码格式:

这下就正常了,总结一下:如果发现获取的源码乱码了,到网页源码中搜索一下“charset”,看一下网页的编码是什么
ok,现在源码我们已经有了,接下来就是获取详情页的地址了:

import requests
import re    # 导入正则表达式库

url = 'https://www.ygdy8.net/html/gndy/china/index.html'
result = requests.get(url)
result.encoding = 'gb2312'
html = result.text
reg = '<a href="(.*?)" class="ulink">'    # 匹配的规则
href = re.findall(reg,html)    # 在源码中匹配所有满足其规则的文本
print(href)

# 输出结果:
# ['/html/gndy/dyzz/20191204/59430.html', '/html/gndy/jddy/20191203/59421.html', '/html/gndy/jddy/20191203/59420.html', '/html/gndy/dyzz/20191129/59405.html', '/html/gndy/dyzz/20191127/59402.html', '/html/gndy/dyzz/20191126/59401.html', '/html/gndy/dyzz/20191125/59398.html', '/html/gndy/dyzz/20191124/59394.html', '/html/gndy/jddy/20191118/59382.html', '/html/gndy/dyzz/20191115/59376.html', '/html/gndy/dyzz/20191113/59363.html', '/html/gndy/jddy/20191110/59357.html', '/html/gndy/jddy/20191110/59356.html', '/html/gndy/jddy/20191109/59352.html', '/html/gndy/jddy/20191109/59351.html', '/html/gndy/dyzz/20191107/59345.html', '/html/gndy/dyzz/20191101/59301.html', '/html/gndy/dyzz/20191027/59287.html', '/html/gndy/jddy/20191027/59282.html', '/html/gndy/dyzz/20191026/59279.html', '/html/gndy/dyzz/20191024/59273.html', '/html/gndy/jddy/20191019/59253.html', '/html/gndy/dyzz/20191017/59249.html', '/html/gndy/dyzz/20191016/59241.html', '/html/gndy/jddy/20191015/59236.html']

那么就有两个问题出现了:

  1. 为什么匹配的规则是<a href="(.*?)" class="ulink">?
    我们回顾一下上面我们需要的地址的那部分字段是怎么样的
    我们发现,非常相似,就是中间的网址被替换成了 (.*?)
  2. 其中的 (.*?) 是什么意思?
    那这个 (.*?) 就是未知字符了,他的准确意思是,任意长度的任意字符,这个是正则部分的内容,可以自行百度,这个基本可以说是万能用法,可以先把这个掌握,后面再慢慢学习其他的

我们现在已经把详情页的地址获取到了,下一步就是访问详情页,然后把磁力链接地址获取到了:


其实就是一样的操作,这边就不赘述了,我们发现上面的代码几乎有一半都是重复的,获取源码、正则匹配的部分可以直接写成方法:

我们现在已经把一个页面所有电影的磁力链接获取到了,接下来我们就需要将这些信息存储起来,当然不要忘记片名,不然哪个是哪个就傻傻分不清了:

 从上面的代码我们可以看到,已经将一个页面的磁力链接和片名对应,并且保存了起来,这里如果对zip()和csv读写相关有疑问的话,可以自行百度,也可以查看Python3基础篇——读写csv文件和python3基础篇——列表的高级用法两篇文章;

接下来我们就需要把所有的页面都处理了,通过网址我们可以发现就是最后的数字变化,那么我们只需要将网址进行一个拼接就好了

SOS:惊奇的发现,当我们爬取到24页之后,后面没有磁力链接地址了,那么我们只好转战下载ftp的地址,同样也是可以下载的:

import requests
import re
import csv

def get_html(url):    # 获取页面源码
    url = url
    result = requests.get(url)    # 发出访问请求
    result.encoding = 'gb2312'    # 设置编码格式,搜索页面源码charset
    html = result.text            # 获取源码
    return html

title = []    # 存储标题
data = []     # 存储下载地址

n = 1        # 页码
status = 0   # 重新访问次数

while n < 123:    # 这里我们使用while循环,处理访问出错的页面
    try:    # 异常处理很重要,不然可能最后一页前破功了
        # 直接简单粗暴,拼接地址
        url = 'https://www.ygdy8.net/html/gndy/china/list_4_{}.html'.format(str(n))
        html = get_html(url)
        print(url)    # 将地址打印出来,可以知道现在搜索到哪一页了
        reg = '<a href="(.*?)" class="ulink">'    # 匹配详情页地址规则
        href = re.findall(reg,html)

        for h in href:    # 遍历页面所有电影详情页
            info_url = 'https://www.ygdy8.net/' + h
            info_html = get_html(info_url)
            try:
                data_reg = '<a href="(.*?)">ftp://'
                title_reg = '<font color=#07519a>(.*?)</font>'
                title_tmp = re.findall(title_reg, info_html)[0]
                data.append(re.findall(data_reg,info_html)[0])    # 将下载地址添加到列表
                title.append(title_tmp)    # 注意,先地址再标题,不然如果页面没有下载地址,标题添加进去就不对应了
            except:
                print('{}获取失败'.format(title_tmp))    # 打印那部电影出错了
        n += 1        # 翻页
        status = 0    # 重新访问次数情况
    except:    # 如果页面访问出错
        if status < 4:    # 重新访问三次
            status += 1   # 次数加1
            print('访问出错,重新访问第{}遍'.format(status))    # 输出错误次数信息
        else:
            n += 1        # 如果重新访问三次还是访问不到,那么直接翻页
            status = 0

all_data = list(zip(title, data))    # 将标题和地址打包
with open('国内电影.csv', 'w', newline='', encoding='utf-8-sig') as f:    # 写入文件
    writer = csv.writer(f)
    writer.writerows(all_data)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python爬虫(二)——爬取电影天堂,保存下载地址 的相关文章

随机推荐

  • 【AI视野·今日CV 计算机视觉论文速览 第225期】Wed, 23 Jun 2021

    AI视野 今日CS CV 计算机视觉论文速览 Wed 23 Jun 2021 Totally 73 papers x1f449 上期速览 更多精彩请移步主页 Daily Computer Vision Papers Tracking Ins
  • 【AI视野·今日Robot 机器人论文速览 第十二期】Tue, 22 Jun 2021

    AI视野 今日CS Robotics 机器人学论文速览 Tue 22 Jun 2021 Totally 17 papers x1f449 上期速览 更多精彩请移步主页 Daily Robotics Papers PHYSFRAME Type
  • 【今日CV 计算机视觉论文速览 第96期】 8 Apr 2019

    今日CS CV 计算机视觉论文速览 Mon 8 Apr 2019 Totally 49 papers 上期速览 更多精彩请移步主页 Interesting 单图像修饰去除 通过估计图像中含有干扰的像素 xff08 水印 涂鸦和变形 xff0
  • gitee及github有什么区别?

    前言 xff1a 1 目前的最常用的版本控制中心有两种 xff1a SVN和Git xff1b 2 SVN xff1a 集中式版本控制中心 xff0c svn就像是一对多的关系 xff0c 一个仓库供多个人使用 xff0c 而且必须联网才能
  • 软体和软件的区别

    作者 xff1a 朱金灿 来源 xff1a http blog csdn net clever101 我们这边把Software翻译为软件 xff0c 台湾同胞把它翻译为软体 最近生发一点思考 xff0c 觉得把Software翻译为软体
  • Docker入门

    Docker简介 Docker是开发人员和系统管理员构建 发布和运行分布式应用程序的开放平台 是应用容器 xff08 Application Container xff09 xff0c 是可以为应用提供可运行容器的一个平台 Docker看作
  • js 中 set 与 数组 相互转换

    1 定义set span class token keyword let span manage ip span class token operator 61 span span class token keyword new span
  • mybatis多条件批量删除整理

    批量增加 span class token operator lt span insert id span class token operator 61 span span class token string 34 batchSaveU
  • vscode设置打开多个标签页

    首先进入路径C Users admin AppData Roaming Code User xff1b 然后打开settings json文件 xff0c 并添加一条配置 xff1a 34 workbench editor enablePr
  • Java Date 关于before和after 的使用

    1 date1 after date 当date1大于date2时 xff0c 返回true xff0c 当小于等于时 xff0c 返回false xff1b 2 date1 before date xff0c 当date1小于date2时
  • js正则表达式判断密码满足大写字母,小写字母,数字和特殊字符,其中任意三种组合,且长度在8到15之间

    一 判断密码满足大写字母 xff0c 小写字母 xff0c 数字和特殊字符 xff0c 其中任意三种组合 xff0c 且长度在8到15之间 在js中的代码 xff0c 如下 var testPassword 61 a zA Z 43 A Z
  • Java 获取两个时间的时间差(时、分、秒)

    前言 在平时的工作中 xff0c 难免会遇到获取两个时间相差多少天 小时 分钟 秒 毫秒 xff0c 现在我将自己获取的方法总结如下 xff1a 注明 xff1a 原文章转载链接出自 xff1a https www cnblogs com
  • HeidiSQL工具导出导入MySQL数据

    有时候 为了数据方便导出导入SQL 我们可以借助一定的工具 方便我们队数据库的移植 可以达到事半功倍的效果 在这里 就给大家简单的介绍一款能方便导出或者导入MySQL的数据 首先 选择你要导出的数据库 点击鼠标右键 如下图所示 这里是进行对
  • Navicat相关注册码

    Navicat相关注册码 用户名和组织随便起 注册码如下 Navicat for SQL Server V10 0 10 NAVD 3CG2 6KRN IEPM NAVL NIGY 6MYY XWQE NAVI C3UU AAGI 57FW
  • 我心目中的好的技术教程

    作者 xff1a 朱金灿 来源 xff1a http blog csdn net clever101 当人类进入互联网时代 xff0c 便宣告一个新的学习模式 网上学习的诞生 现在各种网上教程之多可以用恒河沙数来形容 xff08 这里暂时除
  • TCP的建立

    大家好呀 xff0c 我是请假君 xff0c 今天又来和大家一起学习数通了 xff0c 今天要分享的知识是TCP的建立 TCP是一个面向连接的可靠的传输控制协议 xff0c 在每次数据传输之前首先需要建立连接 xff0c 连接建立成功后才开
  • Java根据数字金额生成大写金额

    要求 根据用户输入金额数字转换成相对应大写金额例如 xff1a 430 65 xff0c 转换成肆佰叁拾元陆角伍分代码如下 xff1a public class MoneyFormatUtils private static final S
  • POI 设置Excel单元格背景色(参考颜色代码)

    创建一个 workbook 对象 Workbook workbook 61 new XSSFWorkbook 创建一个 sheet Sheet sheet 61 workbook createSheet 创建一行 Row row 61 sh
  • RedisTemplate之opsForValue使用说明

    转载链接出自 xff1a https blog csdn net qq 25135655 article details 80357137 Redis中opsForValue 方法的使用介绍 xff1a 1 set K key V valu
  • Python爬虫(二)——爬取电影天堂,保存下载地址

    首先我们开始要分析一下 xff0c 下载种子我们需要哪几步 xff1a 获取所有电影页的访问地址获取电影页源码提取出下载地址将下载地址保存 首先第一步 xff0c 我们来分析一下电影天堂网站的结构 xff0c 发现他跟我们的古诗文网还是非常