自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 收藏
  • 关注

原创 多进程多协程gevent高并发飞速下载m3u8视频文件

m3u8就不多介绍了,对一个m3u8链接发起请求,得到的结果大概就是下面这样,得到一串下载视频链接。m3u8视频文件有加密的,也有没加密的,下面这个就是加密的,图中右侧第6行显示通过AES加密,大多都采用这种加密方法,后面跟着的是密钥链接,可以获取密钥key。解密的另一个重要参数是iv值,也是从m3u8文件中获取,如果没有,比如下面的这张图,就没有iv字段,就用EXT-X-MEDIA-SEQUENCE的值作为iv值,也下图中其值为‘0’,使用大端字节序,如果长度不足,就往左填充 0 直到序列号满足128位,

2021-08-08 16:52:04 1546

原创 利用神经网络识别12306验证码—(六)模型应用以及12306实战测试

模型训练好之后,就可以应用于新图片的预测了。比如现在有下面这么一张12306的验证码,预测工作也分为两部分:上半部分的文字预测、下半部分的图片预测,将两部分划分开之后分别加载各自的模型进行预测。首先进行文字预测,需要把文字部分从整个验证码图片中截取下来,截取函数在前面的文章中已介绍过,可以把截取函数保存为一个python文件,在这里直接导入即可,代码如下。import jsonimport numpy as npimport tensorflow as tffrom tensorflow.ker

2021-04-15 16:26:01 646

原创 利用神经网络识别12306验证码——(五)训练模型

需要训练的有两个模型,一个是文本识别模型,一个是图像识别模型。在训练的时候,尝试了ResNet50、ResNet101、MobileNetV2,三种模型,前两个残差神经网络模型的参数比较大,训练比较耗时,精度上也逊色于第三个模型。尝试了RTX 2080、RTX 2070、Tesla K80三种GPU,三者的训练速度差不多。训练平台在篇尾再进行介绍。两个模型的训练基本上可以共用一套代码,只有一些细微的差异。首先介绍共用的代码部分,其中加载数据的函数,数据的根目录根据自己的情况,需要自行修改。#导入必要的

2021-03-30 20:42:22 785 9

原创 利用神经网络识别12306验证码——(四)数据增广以及训练集、验证集的划分

经过前面的工作,两部分的数据集都已经准备好了,接下来就将原始的数据集划分为训练集和验证集两部分。在这里,每一类图片的验证集数量都相同,等于总数最少的那一类图片的10%,比如说在80类图片中,数量最少的那类图片为100张,那么每类图片的验证集数量都等于10张。先处理文字部分的验证码图片,程序如下。import osimport shutilimport collectionsimport math#创建文件夹的函数,路径参数为列表形式def mkdir_if_not_exist(dir_lst

2021-03-30 15:32:10 704

原创 利用神经网络识别12306验证码——(三)一些预处理工作

之前第一篇博客爬取的验证码图片,对应的文件夹名字是中文,但是目前诸如tensorflow之类的训练框架对中文路径读取有很多问题,所以在这里把文件夹的名字转换成英文,当然你也可以转换成其他非中文的形式,只要保存好相应的转换对应文件,以输出正确的结果。在这里利用百度翻译来获取相应的英文名字,还是采用selenium来实现,练习练习爬虫,程序如下。from selenium import webdriverimport timeimport jsonimport os#读取中文名字with ope

2021-03-28 23:59:15 218

原创 利用神经网络识别12306验证码——(二)收集文字验证码图片

惊喜.jpg——给大家准备了一份我整理的粗糙的数据集,自行提取。12306验证码图片包含两部分,一部分是上边的文字,一部分是下面的图片对于文字部分,可以直接从上面的验证码图片抠出来。所以,先爬个几千张验证码图片,程序如下。import requestsimport base64import timeimport randomimport ospath = 'D:/captcha/'os.mkdir(path) #创建文件夹sleep_lst = [0.5, 0.8, 0.7, 0.6

2021-03-28 21:50:52 668 18

原创 利用神经网络识别12306验证码——(一)收集和清洗数据

12306验证码图片一共有80类,名字如下茶几雨靴护腕本子锦旗烛台海苔中国结龙舟日历红枣药片高压锅锣薯条调色板路灯口哨菠萝挂钟冰箱蜥蜴电线航母手掌印热水袋鞭炮茶盅海报电子秤蜡烛珊瑚蚂蚁话梅毛线网球拍沙拉拖把开瓶器棉棒风铃黑板盘子金字塔蜜蜂文具盒公交卡打字机啤酒漏斗印章铃铛绿豆老虎樱桃档案袋订书机苍蝇拍辣椒酱沙包卷尺钟表狮子跑步机锅铲红酒牌坊刺绣安全帽红豆剪纸电饭煲

2021-03-28 20:27:42 373

原创 回溯算法-括号生成

22.括号生成思路:先用回溯算法生成所有可能的括号,再判断生成的括号是否为有效括号。对于有效括号的判断,leetcode也有一道专门的题,用栈辅助就可以很简单的解决。整体代码也没啥,就是回溯+有效括号的判断class Solution: def generateParenthesis(self, n: int) -> List[str]: res = [] arr = ['(', ')'] length = 2 * n d

2020-06-04 22:42:41 434

原创 回溯算法-复原IP地址

leetcode 93 复原IP地址首先一个正确有效的IP地址,由4个整数构成,介于0-255,也就是说每个整数长度介于1-3,那么整个IP的有效长度(不包含’.’)就介于4-12,这就是对于给出的字符串长度不再这个范围之内,就不用回溯了。第二点,字符串中有0的情况,比如’010010’,在回溯的时候,就可能出现’001’这样的选择,显然这种情况是不正确的,不能以0开头,除非就只有一个0,这里就是剪枝操作了,也就是一旦出现这样的选择,后面就不用再进行回溯。第三,递归终止条件:形成4个整数,并且这4个

2020-06-04 11:20:50 603

原创 回溯算法-子集

一个集合的所有子集从空集开始,一直到自己本身,都是其子集leetcode 78子集没有重复元素集合的子集同样的,套回溯模板class Solution: def subsets(self, nums: List[int]) -> List[List[int]]: if not nums: return [[]] n = len(nums) res = [] def backtrace(start,

2020-06-04 10:34:56 479

原创 回溯算法-全排列

回溯的核心框架#参考fucking-algorithmdef backtrace(路径, 选择列表): if 满足递归终止条件: 保存结果 返回 for 选择 in 选择列表: #做选择 将当前选择从选择列表中移除 路径.append(选择) #递归 backtrace(路径, 选择列表) #撤销选择 路径.pop() 将该选择再

2020-06-04 10:07:29 672

原创 leetcode 120. 三角形最小路径和

动态规划定义dp[i][j]为走到第i层,第j列的最短路径,每一层记录所有可能的最小值,然后去更新下一层,最后取底部的最小值即为最终答案二维dp的写法class Solution: def minimumTotal(self, triangle: List[List[int]]) -> int: n = len(triangle) dp = [[0] * n for _ in range(n)] dp[0][0] = triangle[0]

2020-05-15 00:34:24 154

原创 爬虫-网易云音乐视频下载链接

查看网络请求,如下图,在左边箭头输入框输入mp4,右边链接即为真实的下载链接,不过这个链接有时效性。问题是怎么自己构造这样完整的链接或者能否在网页中找到?往下拉,发现这个链接有两个参数,一个看起来是经过加密的,另一个参数则是时间戳。用第一个参数名在源码页面搜索试试,发现在页面里出现了两次,第一次如下图,把这个链接提出来解析看看是不是就是视频真实下载链接import urllib.parse as parseurl = 'http%3A%2F%2Fvodkgeyttp8.vod.126.net%2

2020-05-10 21:32:27 2684

原创 Python + selenium + requests实现12306全自动买票

Python + selenium + requests实现12306全自动抢票,验证码破解加自动点击!!!!!测试结果: 整个买票流程可以再快一点,不过为了稳定起见,有些地方等待了一些时间完整程序,拿去可用 整个程序分了三个模块:购票模块(主体)、验证码识别模块、余票查询模块 购票模块:from selenium import webdriverfrom selenium...

2020-05-10 16:02:58 17242 80

原创 LeetCode 二叉搜索树中第k小的数

中序遍历 + 一个计数变量即可解决class Solution: def kthSmallest(self, root: TreeNode, k: int) -> int: count = 0 res = float('inf') def helper(root, k): nonlocal count ...

2020-03-13 23:53:03 200

原创 将二叉搜索树原地转换成排序的双向链表

双向链表的每一个节点有next和pre两个指针,二叉树的每个节点则有right和left两个指针,其中next,right指针都指向的是比当前节点大的下一个节点,pre和left指针则指向的是比当前节点小的前一个节点,所以我们把二叉搜索树中的right指针当做双向链表的next指针,left则与pre对应,这样通过中序遍历改变指针的指向,就可得到一个从小到大有序的双向链表。这里可以有两种写法,一...

2020-03-13 13:49:41 312

原创 LeetCode 二叉树的右视图

层序遍历即可解决。二叉树的层序遍历是每一层从左到右这样一个顺序进行遍历,所以我们在遍历每一层时,取出最右的一个节点即可。这里用一个队列来进行层序遍历,保存每一层的所有节点,那么每一次取的就是队列中的最后一个元素,就是从右边可以看到的元素。代码基本和层序遍历相同。from collections import dequeclass Solution: def rightSideView...

2020-03-13 13:15:25 163

原创 LeetCode 跳跃游戏1&2 贪心算法

这两道题是比较典型的贪心算法题。从局部最优最终得出全局最优解。第一题如果每次都从当前位置跳到最远,有可能导致最终能到终点却跳不到终点,比如[3,2,2,0,4],如果直接从3跳到0,0就没法跳了,到不了终点,但是其实可以从3->2,再从2->4这样就可以跳到终点。这是局部最远跳所以这里的贪心思想,我觉得应该是这样:从i + 1 <=j<= i + nums[i]这个区...

2020-03-03 16:01:58 334

原创 LeetCode 删除链表中的重复元素

删除单向链表的节点,需要记录前驱节点。链表的操作就是改变指针的指向。第一种情况,删除所有的重复元素,使得最终每个元素只出现一次。比如输入:1->1->2,输出:1->2。因为需要比较相邻节点,而且需要保留一个重复的节点,所以用两个指针即可,一个指针记录前驱节点,一个指针记录下一个节点。class Solution: def deleteDuplicates(self...

2020-03-03 00:08:30 445

原创 LeetCode 反转链表

链表反转,就是头节点的移动。反转链表头节点的后继节点就是反转链表上一步的头节点,反转链表当前的头节点则为原链表的当前头节点,然后将原链表当前的头节点向后移动一个位置,一直重复这个过程。递归写法class Solution: def reverseList(self, head: ListNode) -> ListNode: if not head: ...

2020-03-02 19:55:44 182

原创 LeetCode 寻找两个有序数组的中位数

题目时间复杂度要求不高于O(log(m+n)),m,n分别是两个数组的长度。对数级的时间复杂度就应该用二分查找来做了。整体思路就是:先分别找到两个数组的中位数a,b,如果a<b,说明整体的中位数位于a的后半段或b的前半段;如果a>b,说明整体中位数位于a的前半段或b的后半段。不断这样二分下去即可。其实,这道题可以转换为寻找有序数组中的第k个数,对应于中位数的话,k=(m+n)/2。寻...

2020-03-01 03:46:37 393

原创 LeetCode 按层序列化&反序列化二叉树

如果二叉树用数组从下标0开始存储,则某个节点的索引为i的话,那么其左右子节点的索引分别为2i+1, 2i+2,反序列化时用得上,感觉这样更直观一些。时间复杂度一般般。from collections import dequeclass Codec: def serialize(self, root): #序列化 if not root: ...

2020-02-25 21:09:58 240

原创 LeetCode33 搜索旋转排序数组

题目时间复杂度要求是O(logn)级,所以得用二分查找来做。原有序数组经过旋转,虽然整个数组已经是无序的了,但是在最大值或最小值前后两部分的数据依然是有序的,比如[0,1,2,4,5,6,7]旋转变成[4,5,6,7,0,1,2],7前后两部分依然有序,可以二分查找。 所以最直接的想法就是找到经过旋转后的最大值或最小值的索引,然后判断要找的目标target位于哪个区间,这个问题就变成了...

2020-02-24 21:14:35 83

原创 LeetCode Z字形遍历二叉树

利用队列,从前向后在队列中取数据时,此时向队列中插入数据,插在队列尾部;从后向前在队列中取数据时,此时若插入数据,插在队列头部from collections import dequeclass Solution: def zigzagLevelOrder(self, root: TreeNode) -> List[List[int]]: res = [] ...

2020-02-24 20:29:36 844

原创 Python3 获取B站经blob处理后的真实视频下载地址

查看源代码,可看到现在B站的视频地址经过blob处理,而且在去掉blob之后,也是没有办法访问的,不能直接下载,那就只能去分析请求了发现网页发送了这样一个请求,我们都知道B站的视频格式是 .flv的,仔细看一下这个地址的前面一小段,有…acgvideo.com…xxx.flv,大致就可以判定这就是真实的视频地址,但是直接复制这个地址去网页访问或者requests,是禁止访问的,因为B站加了反爬...

2019-04-17 21:19:42 23995 5

原创 基于pyppeteer实现最新版知乎模拟登陆

现在还在爬知乎的同学,想必已经被知乎这个登陆搞得头大了吧,哈哈哈哈哈!!用selenium吧,不行,会被检测出来,用requests构造表单吧,提交的加密参数复杂,而且还不给出那些参数名,知乎的攻城狮为了反爬,很牛B好吧!!!我还试过用selenium结合mitmproxy去修改其中对webdriver检测的那部分js代码参数,以失败告终,可能是我没找对js代码。。。没关系,现在有新方法可以搞定...

2018-11-15 18:55:17 5433 6

原创 记一次Python3爬虫利用pyppeteer得到网站js加密后的密文

分析的是一个航空网站,其实是我再找python执行js代码的资料的时候,发现了一个博主分析了这个网站的加密过程,然后我去跟着操作的时候,发现网站的加密部分代码发生了变化,不过在我不小心把网页关了之后,我实在找不到那篇文章了。。。。。所以我再说一下整个的分析过程,不然我就可以只说一下后面不同的部分了需要安装pyppeteer、asynciopyppeteer中文教程:https://zhaoqi...

2018-11-14 19:37:36 6397 10

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除