共计 3382 个字符,预计需要花费 9 分钟才能阅读完成。
先自己吹一波
鄙人,Python 爱好者一枚,准备花半个学期搞一搞opencv
,之前玩的时候多有涉及,这次准备认真搞搞
- 鄙人尽量少说废话,说的有意思一点
- 尽量将出处,参考文献标上
前奏
这准备搞,得有点儿资料吧,正好老师给了个链接 …… 不过,那个某度网盘的链接是照片版的
开始我也没在意,多次输入链接发现,总是页面不存在,后来想起,我和同学发生过 I 1 l
尴尬,就是 数字 1,小写 L 和大写 i 傻傻分不清
行吧,I、l 和 1 一共出现了 4 次而已,写个爬虫搞搞
import requests as r
headers={"User-Agent" : "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.6)",
"Accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Connection" : "keep-alive",
"Accept-Charset" : "GB2312,utf-8;q=0.7,*;q=0.7"}
link = 'xxxxxxx' # 这是个错误的网址
respon = r.get(link, headers=headers)
respon.encoding = 'utf-8' # 改下编码
print(respon.text[:500])
简单在 spyder
中尝试代码,我发现:
这只小黄鸡返回的页面中有一个字符串:页面不存在
这我就太高兴了,正常的链接页面一般不会有这个 8,随便找了一个正常的某度网盘下载链接试了一下没有(大家可以自己试试)
于是,思路是,将 I、l 和 1 在某度网盘链接中不断更换位置,并持续请求返回 text,若字符串 ’ 页面不存在 ’ 不存在,那就是这个连接了
代码如下:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Mon Sep 16 16:01:41 2019
@author: Ryan
"""
import requests as r
import numpy as np
headers={"User-Agent" : "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.6)",
"Connection" : "keep-alive",
}
raw_link = 'https://pan.baidu.com/s/1GvlYt6aFtXXXXXXDX1OQ'
iL1 = ['I', 'l', '1']
def get_iL1_index(link, iL1_list):
# 得到连接中 1iL 的位置
# iL1 list
# iL1 = ['I', 'L', '1'] 只为解耦合
iL1 = iL1_list
# iL1 在 link 字符串中的位置
index_list = []
# 用一个技巧
raw_link_array = np.array(list(link)) # 转换为 np.array
for x in iL1:
# 找寻 iL1 的位置, 并添加到 index_list
index_list.append(np.where(raw_link_array == x)[0] )
# 转换
index_array = np.concatenate(index_list, axis=0)
return index_array
def decimal_return(num_len, candidates):
'''
某进制候选产生函数
num_len : 进制位数
candidates : 候选列表, 元素类别为 str
返回所有 str 列表
'''
counter_array = np.zeros(shape=(num_len), dtype=np.int64) # 注意此处必须为 int 类型
candidates_copy = candidates.copy() # 克隆候选列表
str_need = ''
candidates_len = len(candidates)
str_need_list = []
while(1):
for index in range(num_len):
str_need += candidates_copy[counter_array[index] ]
counter_array[0] += 1
if counter_array[0] == candidates_len:
for x in range(num_len):
if counter_array[x] == candidates_len:
counter_array[x+1] += 1
counter_array[counter_array == candidates_len] = 0 # 整体清零
counter_array[0] = 0
str_need_list.append(str_need)
str_need = ''
if np.sum(counter_array) == num_len * (len(candidates) - 1):
# 此处手动添加, 差一次(此处可能有)str_need_list.append(num_len*candidates[-1] )
break
return str_need_list
raw_link_list = np.array(list(raw_link)) # 将链接字符串转化为 list
iL1_index = get_iL1_index(raw_link, iL1) # 找到链接中 iL1 中的位置
replace_list = decimal_return(len(iL1_index), iL1)
for index, replace_str in enumerate(replace_list):
raw_link_list[iL1_index] = list(replace_str)
link = ''.join(raw_link_list)
link_respo = r.get(link, headers=headers)
link_respo.encoding = 'utf-8'
if '页面不存在' in link_respo.text:
print(index, link, '文件不存在 \n')
elif '你来晚了' in link_respo.text:
print(index, link, '文件被取消 \n')
else:
print(index, link,'成功 \n')
行吧,这才找到了下载链接,下就完事了……
环境搭建
一说环境搭建,咱都知道 anaconda
全家桶,今儿常常新鲜事物 miniconda
,要说几个conda
的区别,我参考了这篇博客
conda 是一种通用包管理系统,旨在构建和管理任何语言和任何类型的软件。举个例子:包管理与 pip 的使用类似,环境管理则允许用户方便地安装不同版本的 python 并可以快速切换。
Anaconda 则是一个打包的集合,里面预装好了 conda、某个版本的 python、众多 packages、科学计算工具等等,就是把很多常用的不常用的库都给你装好了。
Miniconda,顾名思义,它只包含最基本的内容——python 与 conda,以及相关的必须依赖项,对于空间要求严格的用户,Miniconda 是一种选择。就只包含最基本的东西,其他的库得自己装。
这儿有关于三者更深的讨论
miniconda
官方下载链接:https://docs.conda.io/en/late…
清华大学官方开源镜像站下载链接:https://mirrors.tuna.tsinghua…
一顿傻瓜式默认操作,装完了 …..
接下来装包吧:
什么 numpy
、scipy
、matplotlib
统统装上,推荐用 conda
装
咱重点不在环境搭建哈,简单操作就不多说了
这里有一个关于安装 openCV 的坑:
安装 openCV contrib 指北
顺便放几条指令:
conda update --all # 更新 miniconda
conda list # 列出安装的所有应用包
conda install <pkg name> # 安装应用包
conda update <pkg name> # 升级应用包
conda create -n venv python=3.7 # 创建新环境 Python 版本为 3.7,名字为 venv
conda activate venv # 进入 conda 虚拟环境
conda deactivate # 退出 conda 虚拟环境
conda remove -n yourenvname --all # 删除你这个环境
知道这么几条应该够使了