首页 编程教程正文

爬虫练习传智一键下载

piaodoo 编程教程 2020-02-22 22:16:19 1363 0 python教程

本文来源吾爱破解论坛

本帖最后由 忧伤_ 于 2020-2-16 17:21 编辑

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

1.png (48.94 KB, 下载次数: 1)

下载附件  保存到相册

2020-2-16 17:07 上传


我们需要获取每一个章节对应的url,先找一下他们的不同,点了几个链接发现不同的章节detail后面跟的字符不一样

2.png (4.1 KB, 下载次数: 1)

下载附件  保存到相册

2020-2-16 17:07 上传

返回主页面 F12 打开Network

3.png (82.28 KB, 下载次数: 0)

下载附件  保存到相册

2020-2-16 17:07 上传


按下一页 发现xhr下多了一个文件 应该是一些Ajax技术(我是看了一些资料才知道可以这样找的,挺管用的)

4.png (70.56 KB, 下载次数: 1)

下载附件  保存到相册

2020-2-16 17:07 上传


点进去可以找到区分不同章节的id数据

5.png (114.12 KB, 下载次数: 1)

下载附件  保存到相册

2020-2-16 17:07 上传


在headers找到url

6.png (35.42 KB, 下载次数: 0)

下载附件  保存到相册

2020-2-16 17:07 上传


【代码部分】
一开始用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 (52.87 KB, 下载次数: 1)

下载附件  保存到相册

2020-2-16 17:07 上传


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

7.png (41.71 KB, 下载次数: 0)

下载附件  保存到相册

2020-2-16 17:07 上传

7.png

版权声明:

本站所有资源均为站长或网友整理自互联网或站长购买自互联网,站长无法分辨资源版权出自何处,所以不承担任何版权以及其他问题带来的法律责任,如有侵权或者其他问题请联系站长删除!站长QQ754403226 谢谢。

有关影视版权:本站只供百度云网盘资源,版权均属于影片公司所有,请在下载后24小时删除,切勿用于商业用途。本站所有资源信息均从互联网搜索而来,本站不对显示的内容承担责任,如您认为本站页面信息侵犯了您的权益,请附上版权证明邮件告知【754403226@qq.com】,在收到邮件后72小时内删除。本文链接:https://www.piaodoo.com/8053.html

搜索