吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3134|回复: 25
收起左侧

[Python 原创] 爬虫练习传智一键下载

  [复制链接]
忧伤_ 发表于 2020-2-16 17:11
本帖最后由 忧伤_ 于 2020-2-16 17:21 编辑

【起因】
我们有门专业课的作业就是观看传智播客上的视频,但在它那个网站观看视频体验极差,不能快进之类的,因为视频的src是在F12中直接可见的,当时就直接复制链接放到IDM下载,但还要手动打名字,一两个视频还好,多了就有点烦(因为最后也没怎么看),当时就想要是能自动一键下载多好,刚好最近学了一点python,了解一些简单的爬虫,发现可以用爬虫可以实现我当初的想法,src可见 只是一个简单的爬虫 做下笔记跟大家分享一下 还请多多指教
【找Url】
1.png
我们需要获取每一个章节对应的url,先找一下他们的不同,点了几个链接发现不同的章节detail后面跟的字符不一样
2.png

返回主页面 F12 打开Network
3.png
按下一页 发现xhr下多了一个文件 应该是一些Ajax技术(我是看了一些资料才知道可以这样找的,挺管用的)
4.png
点进去可以找到区分不同章节的id数据
5.png
在headers找到url
6.png
【代码部分】
一开始用request.get()我是没加请求头的,看不到内容,用浏览器打开可以看到数据,就直接把浏览器里请求头复制过去了,刚开始是没问题都,第二天就报错了,发现是cookies问题 获取cookies搞了一早上 后面再写一下了
导入的包

import urllib
import requests
import time
import json
from urllib.request import urlretrieve  # 视频下载的包
        def get_html(url):
            response = requests.get(url=url, headers=hd)
            if response.status_code == 200:
                print('已连接')
                return response.text
        now_time = int(time.time() * 1000)
        # 获取id的url
        page_url = f'http://stu.ityxb.com/back/bxg/preview/list?name=&isEnd=&pageNumber=1&pageSize=20&type=1&courseId=52aed3802e6e40cca38a21935254906c&t={now_time}'
        data = get_html(page_url)
        # 拿到了每一章的id 可用http://stu.ityxb.com/preview/detail/ +id 将进入特定章节
        data = json.loads(data)  # 字符串转string 用load()不行
        if data['resultObject'] == 'needLogin':
            print('cookie已失效,请更换')
        else:
            data = data['resultObject']['items'] #包含id的一个列表
              # 需求 输入name 返回id
               def get_id():  # 英文的括号打在这里看不见是为什么啊
                      count = input('请按序号输入你要查看的章节:')
                       return data[-counts]['id']

再写这个函数的时候发现基础有多么重要 列表是倒序的 可用负数的下标 一开始折腾了好久

下面就是对每一章的数据做一个获取,对get请求回来的一个数据筛选

                chapter_id = get_id()
                # 发现更好的url
                chapter_url = f'http://stu.ityxb.com/back/bxg/preview/info?previewId={chapter_id}&t=1581508416923'
                # 获取到章节里得页面 get_html会返回text
                chapter_page = get_html(chapter_url)
                # 字符串转json
                chapter_data = json.loads(chapter_page)
                chapter_num = chapter_data['resultObject']['preview']['previewName']
                chapter_data = chapter_data['resultObject']['chapters'][0]  # ['points']
                title = chapter_data['chapter']['point_name']
                title = f'{chapter_num}\t{title}'  # 找标题
                content = chapter_data['points']  # 特定章节中所有的数据 有视频名称和链接 是一个列表
                print(f'\t\t\t{title}')

下面对视频数据的一个遍历 并将 名称和链接放到一个新的列表中 方便使用

                                gather = []
                for content_index in content:
                    # 用列表存起来
                    name = content_index['point_name']
                    video_url = content_index['video_url']
                    a = {
                        'name': name,
                        'video': video_url
                    }
                    gather.append(a)

下载视频代码

            menu = (input('你要从第几节下载(将从该节开始自动往后下载)'))
            path = input('请输入下载路径:(请确保文件夹存在 防止出错)')
            for download_index in range(menus - 1, len(gather)):
                h = download_index + 1                                                        
                names = gather[download_index]['name']
                v_url = gather[download_index]['video']
                file_name = f'{h}.{names}'
                urlretrieve(v_url, r'{}\{}.mp4'.format(path, file_name)) # 下载函数

【模拟登录】
主要代码就在上面了,还有一个就是开始提到的cookies问题 在程序报错后我就上网站复制了新的cookies过来 程序可以运行 然后就去百度怎么获取cookies找了蛮久的(一个小坑:获取到的cookies跟网站看到的不一样,但都可以用。)

    user = input('请输入你的用户名:')
    psw = input('请输入你的密码:')
    url_ = 'http://stu.ityxb.com/back/bxg_anon/login'  # 这里可以验证用户名密码
    from_data = {
        'automaticLogon': 'false',
        'username': user,
        'password': psw
    }
        #get 和 post都可以发送数据 不同的是post 用 data get 用params
    response = requests.post(url_, data=from_data)
    cookies = requests.utils.dict_from_cookiejar(response.cookies)
    #获取到的cookies是字典格式的 用户名或密码错误的获得的cookies是一个空字典,所以可以有一个判断
    if cookies:
        js_id = cookies['JSESSIONID']
        uc_t = cookies['_uc_t_']
        print('成功登录')
        new_url = 'http://stu.ityxb.com/back/bxg/preview/list?name=&isEnd=&pageNumber=1&pageSize=20&type=1&courseId=52aed3802e6e40cca38a21935254906c&t=1581574348194'
        new_cookies = f'JSESSIONID={js_id}; _uc_t_={uc_t};'
        hd = {
            'Accept': 'application/json, text/plain, */*',
            'Accept-Encoding': 'gzip, deflate',
            'Accept-Language': 'zh-CN,zh;q=0.9',
            'Connection': 'keep-alive',
            'Cookie': new_cookies,
            'Host': 'stu.ityxb.com',
            'Referer': 'http://stu.ityxb.com/learning/52aed3802e6e40cca38a21935254906c/preview/list',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                          'Chrome/78.0.3904.70 Safari/537.36 '
        }
    else:
        print('用户名或密码错误')

下载效果:
8.png
上面的代码里我删除了一些可有无的代码,主要是为了代码尽可能的简洁 第一次发帖 文中不当之处还请多多指正 打完了不小心删了一部分 心态崩了

7.png

免费评分

参与人数 4吾爱币 +8 热心值 +3 收起 理由
Tandgers + 1 + 1 谢谢@Thanks!
chmod700 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
ai酸的博文 + 1 我很赞同!
苏紫方璇 + 5 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 忧伤_ 发表于 2020-2-17 16:01
stefaniema 发表于 2020-2-17 14:23
很好的练手爬虫,谢谢

确实,都把数据打包好了他们网站有个视频资源栏目也跟这个差不多,有兴趣的话可以试下手
 楼主| 忧伤_ 发表于 2020-2-16 17:23
s466692282 发表于 2020-2-16 21:07
 楼主| 忧伤_ 发表于 2020-2-16 21:52

哈哈哈,虽然改bug的时间比手动下载的时间多得多,但那自动下载的感觉真的很爽
Norton 发表于 2020-2-16 22:57
楼主给力,多谢分享。
TomRoosevelt 发表于 2020-2-17 06:46
谢谢分享
w92vv 发表于 2020-2-17 08:21
多谢分享 学习了!
laohu2277 发表于 2020-2-17 10:23
非常感谢
stefaniema 发表于 2020-2-17 14:23
很好的练手爬虫,谢谢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 21:23

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表