怎么抓包网站源码分享?抓包工具源码

大家好,怎么抓包网站源码分享相信很多的网友都不是很明白,包括抓包工具源码也是一样,不过没有关系,接下来就来为大家分享关于怎么抓包网站源码分享和抓包工具源码的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!

今天和大家分享下我近段时间get的新技能,用单线程、多线程和协程三种方式爬取并下载梨视频的小视频,话不多说,我们开始叭。冲鸭冲鸭!

目标

将梨视频上的科技相关的视频资源下载保存到电脑本地

工具

Python3.9Pycharm2020

需要用到的第三方库

1)requests解析数据(支持re,xpath,css)3)fake_useragent生成随机数5)os处理json数据7)concurrent处理协程

分析并使用单线程下载视频

我们需要将梨视频网站上的视频资源下载到电脑本地,那必不可少的两个元素必然是视频名称视频资源url。获取视频资源url后,针对视频资源的url发起请求,得到响应,再将响应内容以视频名称为名保存到电脑本地即可。

起始页:科技热点资讯短视频_科技热点新闻-梨视频官网-PearVideo

URL地址:https://www.pearvideo.com/category_8

1.分析起始页

F12对起始页刷新抓包,拿到数据请求接口

梨视频(科技)主页

对比观察抓包获取到的url:

https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=8&start=12&mrd=0.6312621497255415&filterIds=1745912,1745729,1745750,1745761,1745809,1745640,1745278,1745506,1745193,1606956,1745335,1745147

https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=8&start=24&mrd=0.9021185727219558&filterIds=1745912,1745729,1745750,1745254,1745034,1744996,1744970,1744646,1744743,1744838,1744567,1744308,1744225,1744727,1744649

https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=8&start=36&mrd=0.6598737970838424&filterIds=1745912,1745729,1745750,1744642,1744353,1744377,1744291,1744127,1744055,1744106,1744126,1744040,1743939,1743997,1744012

对比上方三个url可见,除了其中的start,mrd以及filterIds不同之外,其余部分均为https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=8&start=。其中start每次增长为12,即每次加载12段视频;mrd为一个随机数,filterIds即为视频资源的cid号。

2.发送起始页请求

我们可以根据抓包获取到的信息构建请求,获取响应内容。全文将模仿scrapy框架的写法,将代码封装在一个类之中,再定义不同的函数实现各个阶段的功能。

34;User-Agent&构建谷歌请求头\n}\nself.page=page34;https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=8&start=&拼接起始页url\nres=requests.get(start_url,headers=self.headers)\nifres.status_code==200:\n类似scrapy框架中的response对象,可直接调用re(),xpath()和css()方法。\nselector=Selector(res.text)\nself.parse(selector)

获取到响应之后就可以解析响应文本了,在响应文本中我们可以提取到视频的详情页url及视频名称,代码如下:

3.解析起始页响应获取视频名称、视频详情页url

defparse(self,response):\nvideos=response.xpath(&39;vervideo-bd&34;)\nforvideoinvideos:\n34;https://www.pearvideo.com/&34;./a/@href&提取视频名称\nvideo_name=video.xpath(&39;vervideo-title&34;).get()\n34;//div[@id=&39;]/@data-cid&提取网页中data-cid的属性值(初始cid)\nmrd=random.random()34;https://www.pearvideo.com/videoStatus.jsp?contId={init_cid}&mrd={mrd}&将ajax_header设置为全局变量,以便在后续的函数中调用\najax_header={&34;:f&34;}\nself.parse_ajax(ajax_url,init_cid,video_name)

5.对视频详情页抓包,获取假的视频资源url

defparse_ajax(self,ajax_url,init_cid,video_name):\najax_res=requests.get(ajax_url,headers=ajax_header)\nfake_video_url=json.loads(ajax_res.text)[&34;][&34;][&34;]34;/&34;-&从假的视频资源url中抽取假的cid\nreal_cid=&34;+init_cid将假的视频资源url中假的cid(fake_cid)替换为真的cid(real_cid)即可得到真正的视频资源url啦!!!\n34;单线程视频下载&如果不存在则创建视频文件夹存放视频\nifnotos.path.exists(video_path):\nos.mkdir(video_path)\nwithopen(f&34;,&34;)asvideo_file:\nvideo_file.write(video_res.content)\nprint(f&34;)

最后,定义一个run()方法作为整个类的入口,调用最开始的start_request()函数即可!(套娃,一个函数套另一个函数)

defrun(self):\nself.start_request()\n\nif__name__==&39;:\npear_video=PearVideo(3)34;User-Agent&34;https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=8&start=&新增了video_list为全局变量,用来保存视频名称和视频资源url

1.获取真正的视频资源url代码

defparse_ajax(self,ajax_url,init_cid,video_name):\najax_res=requests.get(ajax_url,headers=ajax_header)\nfake_video_url=json.loads(ajax_res.text)[&34;][&34;][&34;]\nfake_cid=fake_video_url.split(&34;)[-1].split(&34;)[0]\nreal_cid=&34;+init_cid\nreal_video_url=fake_video_url.replace(fake_cid,real_cid)\n34;video_url&34;video_name&此处传递的是一个字典而非video_list这个列表\nvideo_res=requests.get(video_dict[&34;],headers=ajax_header)\nvideo_path=os.path.join(os.getcwd(),&34;)\nifnotos.path.exists(video_path):\nos.mkdir(video_path)\nwithopen(f&39;video_name&34;,&34;)asvideo_file:\nvideo_file.write(video_res.content)\nprint(f&39;video_name&34;)

3.启动多线程

if__name__==&39;:\npear_video=PearVideo(2)\npear_video.run()\npool=ThreadPoolExecutor(4)此处的map方法和Python自带的map(x,y)含义类似,即将可迭代对象y中的每一个元素执行函数x。\npool.map(pear_video.download_video,pear_video.video_list)

使用协程下载视频

使用协程下载视频资源中最为重要的三个库为asyncio(创建协程对象),aiohttp(发送异步请求),aiofiles(异步保存文件)。

重点:

1)在函数前加上async关键字,函数即被创建为一个协程对象;2)协程对象中所有需要io耗时操作的部分均需使用await将任务挂起;3)协程对象不能直接运行,需要创建一个事件循环(类似无限循环),然后再运行协程对象。

注意:

1)不能使用requests发送异步请求,需要使用aiohttphttpx;2)不能直接使用open()保存文件,需要使用aiofiles进行异步操作保存。

主要代码如下

下载视频信息\nasyncdefdownload_videos(self,session,video_url,video_name,video_path):\n获取异步响应,前面必须加上await,表示挂起\ncontent=awaitres.content.read()\n34;{video_path}/{video_name}.mp4&34;wb&34;下载完毕…&34;协程视频下载&创建session,保持会话\n等待所有的任务完成\ndone,pending=awaitasyncio.wait(tasks)

3.调用整个类并运行协程对象

if__name__==&39;:\npear_video=PearVideo(3)\npear_video.run()\nloop=asyncio.get_event_loop()运行协程对象

在保存视频的时候,如果视频名称中含有&34;,&34;,&34;,&34;,&34;,&34;,&34;在内的非法字符,视频将无法保存,程序将报错,可用如下代码过滤视频名称:

defrename(self,name):\nstop=[&34;,&34;,&34;,&34;,&34;,&34;,&34;]\nnew_name=&34;\nforiinname:\nifinotinstop:\nnew_name+=i\nreturnnew_name

在使用多线程和协程下载视频资源这部分代码中都是使用单线程和线程池/协程结合,均是在获取到视频名称和视频资源url后再针对视频资源发送请求,获取响应,此部分代码仍有待优化,如使用生产者/消费者模式一边生产视频资源url,一边根据url下载视频;而协程部分也可将其它需要发送网络请求的部分修改为协程模式,从而提高下载速度。

总结

下载梨视频的视频资源难点在于破解真正的视频资源url,先后需要对视频起始页(主页)发送请求,再对视频详情页发送请求,然后再对视频详情页抓包获取真正的视频资源url,最后再针对视频资源url发送请求,下载视频资源。其中线程池和协程的部分仍有待优化,以便更好地提高下载效率!

关于怎么抓包网站源码分享,抓包工具源码的介绍到此结束,希望对大家有所帮助。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平