打开爆米花的网站,然后打开其中一个视频: 打开F12,然后刷新,可以看到: 这个URL为视频的真实地址: http://59.56.28.122/vm48002.baomihua.com/d1b3a2d4195a6e40629c68a03f564af6/59DF39B1/3707/37061900_9_b5948e40ae8611e79ee1003048cc668a.mp4?start=0&end=60&wsiphost=local 其中的start和end参数与下载后播放的时间长度有关,我就将URL简化为: http://59.56.28.122/vm48002.baomihua.com/d1b3a2d4195a6e40629c68a03f564af6/59DF39B1/3707/37061900_9_b5948e40ae8611e79ee1003048cc668a.mp4 接着继续利用Chrome浏览器进行抓包: 个人习惯放在txt文件中看一下: 真实地址的第一部分利用抓到的包中的host_480参数可以拿到,真实地址中的第二部分利用参数dir拿到(虽然ishls参数现在看着好像也能拿到,但有些URL就不行了) 真实地址的第三部分,主要还是参考了一些思路,利用移动端进行抓包,也就是手机APP,我使用的还是Fiddle4进行抓包,下面是我抓到的结果,放在txt中: 图中现在看到的这个URL是简化后的: http://play.baomihua.com/getvideourl.aspx?flvid=37061900&devicetype=phone_app_Android 要想得到response,其中的flvid参数是要先拿到的,所以写代码就先拿到这个参数。可以看到视频的真实地址的第三部分可以在这个response中的stream_name参数中拿到。 下图是利用Fiddle抓的PC端: 思路有了,就可以写代码了,贴一下我的代码,感觉还是要改改: import requests from requests.exceptions import RequestException import re import os from hashlib import md5 headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36', 'Accept-Encoding':'gzip, deflate, sdch', 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Language':'zh-CN,zh;q=0.8', } def get_part(url): try: response=requests.get(url,headers=headers) if response.status_code==200: return response.text return None except RequestException as e: print(e) return None def parse_part_1(html): try: pattern=re.compile('.*?var flvid = (.*?);.*?',re.S) result_1=re.search(pattern,html).group(1) print('flvid为:'+result_1) return result_1 except Exception: print('flvid解析失败') def parse_part_2(html): try: pattern=re.compile('.*?&host_480=(.*?)&.*?&dir=(.*?)&.*?',re.S) result_2=re.search(pattern,html).group(1) result_3=re.search(pattern,html).group(2) result=result_2+'/'+result_3 print('第一部分URL:'+result) return result except Exception: print('解析第一部分URL失败') def parse_part_3(html): try: pattern=re.compile('.*?&stream_name=(.*?)&.*?',re.S) result_4=re.search(pattern,html).group(1) print('第二部分URL:'+'/'+result_4+'.mp4') return result_4 except Exception: print('解析第二部分URL失败') def download_video(url): try: print('准备下载视频:'+url) response=requests.get(url,headers=headers) data=response.content if data: file_path='{}/{}.{}'.format(os.getcwd(),md5(data).hexdigest(),'mp4') print('文件为:'+file_path) if not os.path.exists(file_path): with open(file_path,'wb')as f: f.write(data) f.close() print('视频下载成功:'+url) except Exception: print('视频下载失败') def main(url): try: print('视频初始URL:'+url) html=get_part(url) if html: flvid=parse_part_1(html) if flvid: url='http://play.baomihua.com/getvideourl.aspx?qudaoid=42&devicetype=pc%5Fplayer&flvid={}&Resolution=1'.format(flvid) html=get_part(url) if html: base_url_1=parse_part_2(html) url='http://play.baomihua.com/getvideourl.aspx?flvid={}&devicetype=phone_app_Android'.format(flvid) html=get_part(url) if html: base_url_2=parse_part_3(html) url='http://'+base_url_1+'/'+base_url_2+'.mp4' print('视频下载URL:'+url) download_video(url) except Exception: print('解析视频地址失败') if __name__=='__main__': print('温馨提醒:e.g. http://www.baomihua.com/xxx/xxx'+'、'+'http://video.baomihua.com/v/xxx'+'...') url=input('请输入爆米花视频网址:') main(url) 运行的结果是这样的: 测试了一些URL,并将视频下载了下来: