25~30K的学员面试考题,10分钟就写完?

2022-03-30 20:35:03 浏览数 (1)

前言

今天的这个案例,是一位同学的面试题,人在国外,月薪25~30K 本来以为是难度很大的反爬、逆向或者算法之类的,谁知道,就是一个很简单的爬虫

划重点,10分钟就写出来了

案例介绍

是一个看美剧的网站,从电影界面这里就可以知道视频内容是m3u8的视频格式

什么是m3u8?

m3u8是苹果公司推出的视频播放标准,是m3u8的一种,只是编码格式采用的是UTF-8。 现在的视频网站采用的是流媒体传输协议,就是将一段视频切成无数个小段,这几个小段就是ts格式的视频文件,一段一段的网站上播放。这样做的好处是观看更加流畅,因为他会根据网络状况自动切换视频的清晰度,在网络状况不稳定的情况下,对保障流畅播放非常有帮助。

网站分析

通过开发者工具抓包分析找寻数据来源
可以通过开发者工具搜索ts文件 找到m3u8的url地址, 或者直接搜索m3u8也可以找到相应的数据包
如果想要批量爬取电影内容的话, 还需要继续找寻这个m3u8的url地址是从哪里可以获取的
和上面的方法一样, 在开发者工具里面进行搜索,找寻相应的数据内容, 找到数据来源之后, 还需要去分析headers里面的请求url地址 以及请求方式 请求头...
  • 确定请求url地址
  • 确定请求方式
  • 请求头参数
以上是爬取一个视频内容的分析, 如果想要爬取多个视频内容, 还要继续分析 这个请求参数里面URL地址可以从哪里获取

代码

实现的基本步骤

  1. 发送请求, 对于视频播放详情页面发送请求
  2. 获取数据, 获取响应体文本数据
  3. 解析数据, 提取视频标题以及数据包的参数url
  4. 发送请求, 对于找寻的数据包发送请求
  5. 获取数据, 获取响应体文本数据
  6. 解析数据, 提取m3u8的url地址
  7. 发送请求, 对于m3u8的url地址发送请求
  8. 获取数据, 获取响应体文本数据
  9. 解析数据, 提取所有ts文件
  10. 保存数据, 把视频内容保存本地

完整代码

代码语言:javascript复制
link_url = 'https://www.imeiju.pro/Play/7483-0-0.html'
headers = {
    'Host': 'www.imeiju.pro',
    'Referer': 'https://www.imeiju.pro/js/player/baiduyun.html',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'
}
response = requests.get(url=link_url, headers=headers)
response.encoding = response.apparent_encoding  #  自动识别编码
# print(response.text)
title = re.findall("var playn = '(.*?)'", response.text)[0]  # 标题
video_info = re.findall('第(d )集$(.*?)$', response.text)
print(title)
print(video_info)
for num, index in video_info:
    print(title, num, index)

    url = 'https://www.imeiju.pro/ckplayerx/m3u8.php'  # 请求网址
    # 请求参数 字典数据类型
    data = {
        'url': index,
        'f': 'ck_m3u8'
    }
 
    # 最后用response变量接收返回数据
    response = requests.get(url=url, params=data, headers=headers)

    # url: '(.*?)'  (.*?) 表示你想要数据内容
    m3u8_url = re.findall("url: '(.*?)'", response.text)[0]
    print(m3u8_url)

    m3u8_data = requests.get(url=m3u8_url).text

    # ? 非贪婪匹配模式  split() 分割 返回列表
    m3u8_data = re.sub('#E.*', '', m3u8_data).split()
    print(m3u8_data)
    for link in m3u8_data:  # for 遍历 把列表元素一个一个提取出来
        ts_url = 'https://fangao.stboda.com/concat/20210609/fb22f65d884d47238f75ea8aed8cf249/cloudv-transfer/'   link
        ts_content = requests.get(url=ts_url).content
        # b二进制 w写入(会覆盖的) a追加写入(不会覆盖)
        with open(title   num   '.mp4', mode='ab') as f:
            f.write(ts_content)
        print(ts_url)

0 人点赞