还没开始·····················
]]>真不戳!!!🙄
ZY.Zhang
本文档基于B站视频教程
**什么是爬虫:**通过编写程序,模拟浏览器上网,然后让其去互联网上抓取数据的过程。
爬虫究竟是合法还是违法的?
爬虫带来的风险可以体现在如下两个方面:
如何在编写使用的过程中避免进入局子的厄运?
爬虫在使用场景中的分类:
**通用爬虫:**抓取系统的重要组成部分。抓取的是一整张页面数据。
**聚焦爬虫:**是建立在通用爬虫的基础之上。抓取的是页面中特定的局部内容。
**增量式爬虫:**监测网站中数据更新的情况。只会抓取网站中最新更新出来的数据。
爬虫的矛与盾:
**反爬机制:**门户网站,可以通过制定相应的策略或者技术手段,防止爬虫程序进行网站数据的爬取。
**反反爬策略:**爬虫程序,可以通过制定相关的策略或者技术手段,破解门户网站中具备的反爬机制,从而可以获取门户网站中相关的数据。
**robots.txt协议:**君子协议。规定了网站中那些数据可以被爬虫爬取,那些数据不允许被爬取。
**概念:**就是服务器和客户端进行数据交互的一种形式。
常用请求头信息:
常用响应头信息:
**概念:**安全的超文本传输协议
对称秘钥加密
非对称秘钥加密
存在缺点:第一个是如何保证接收端向发送端发出公开秘钥的时候,发送端确保收到的是预先要发送的,而不会被挟持,只要是发送秘钥,就有可能有被挟持的风险;第二个是非对称秘钥加密方式效率比较低,处理起来更为复杂,通信过程中使用就有一定的效率问题而影响通信速度。
证书秘钥加密:
**requests模块:**Python中原生的一款基于网络请求的模块,功能非常强大,简单便捷,效率极高。
**作用:**模拟浏览器发请求。
如何使用:(requests模块的编码流程)
环境的安装:pip install requests
实战编码:
1 | import requests |
1 | #UA:User-Agent请求载体的身份标识 |
1 | import requests |
1 | import requests |
1 | import requests |
爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据(http://scxk.nmpa.gov.cn:81/xk/)
**动态加载数据:**首页中对应的企业信息是通过 ajax
动态请求到的
通过对详情页url的观察发现:
ajax
请求到的 json
串中获取详情页的企业详情数据也是动态加载出来的!!!
post
请求的url都是一样的,只有参数id值不同ajax
请求的url1 | import requests |
bs4
解析xpath
解析(重点)操作符 | 说明 | 实例 |
---|---|---|
. | 表示任意单个字符 | |
[ ] | 字符集,对单个字符给出取值范围 | [abc]表示a,b,c,[a-z]表示a-z的 |
[^ ] | 非字符集,对单个字符给出排除范围 | [^abc]表示非a或b或c的单个字符 |
***** | 前一个字符0次或无限次扩展 | abc* 表示ab、abc、abcc、abccc等 |
+ | 前一个字符1次或无限次扩展 | abc+ 表示abc、abcc、abccc等 |
? | 前一个字符0次或1次扩展 | abc? 表示ab、abc |
| | 左右表达式任意一个 | abc|def 表示abc、def |
{m} | 扩展前一个字符m次 | ab{2}c表示abbc |
---|---|---|
{m,n} | 扩展前一个字符m至n次(含n) | ab{1,2}c表示abc、abbc |
^ | 匹配字符串开头 | ^abc表示abc且在一个字符串的开头 |
$ | 匹配字符串结尾 | abc$表示abc且在一个字符串的结尾 |
( ) | 分组标记,内部只能使用|操作符 | (abc)表示abc,(abc|def)表示abc、def |
\d | 数字,等价于[0-9] | |
\w | 单词字符,等价于[A-Za-z0-9_] |
函数 | 说明 |
---|---|
re.search() | 在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象 |
re.match() | 从字符串的开始位置起匹配正则表达式,返回match对象 |
re.findall() | 搜搜字符串,以列表类型返回全部能匹配的子串 |
re.split() | 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型 |
re.finditer() | 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象 |
re.sub() | 在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串 |
修饰符 | 描述 |
---|---|
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别匹配 |
re.M | 多行匹配,影响^和$ |
re.S | 使.匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符,这个标志影响\w,\W,\b,\B |
re.X | 该标志通过给予你跟灵活的格式以便你将正则表达式写得更易于理解 |
1 | 常用的正则表达式 |
1 | '''正则练习''' |
1 | import requests |
1 | # 需求:爬取糗事百科中糗图板块下所有的糗图图片 |
1 | # 对上述代码进行进一步处理,使得能够分页爬取图片 |
数据解析的原理:
bs4数据解析的原理:
BeautifulSoup
对象,并且将页面源码数据加载到该对象中BeautifulSoup
对象中相关的属性或者方法进行标签定位和数据提取环境安装:pip install bs4
pip install lxml
from bs4 import BeautifulSoup
soup.tagName
:返回的是文档中第一次出现的 tagName
标签;soup.find(tagName)
:可以等同于soup.tagName
;也可以进行属性定位;soup.find_all( )
:返回符合要求的所有标签;select('某种选择器(id,class,标签...选择器)')
返回的是一个列表;层级选择器soup.a.text/string/get_text( )
text/get_text( )
:可以获取某一个标签中所有的文本内容string
:只可以获取该标签下面直系的文本内容soup.a['href']
1 | <html lang="en"> |
1 | from bs4 import BeautifulSoup |
1 | # 需求:爬取三国演义小说所有的章节标题和章节内容 |
pip install lxml
(lxml解析器)from lxml import etree
etree.parse(filePath)
etree.HTML('page_text')
tag[@attrName="attrValue"]
;tag[@attrName="attrValue"]/p[3]
,注意索引从1开始/text( )
:获取的是标签中直系的文本内容;//text( )
:标签中非直系的文本内容(所有的文本内容)/@attrName ==> img/@src
1 | from lxml import etree |
1 | #需求:爬取58二手房中的房源信息 |
1 | #需求:解析下载图片数据 http://pic.netbian.com/4kmeinv/ |
1 | # 需求:解析出所有城市名称 https://www.aqistudy.cn/historydata/ |
1 | # 爬取站长素材中免费的简历模板 https://sc.chinaz.com/jianli/free.html |
验证码和爬虫之间的爱恨情仇:
识别验证码的操作:
1 | #!/usr/bin/env python |
1 | ####将本部分代码复制到上一节代码之后,因为要调用上述封装的tranformImgCode方法 |
在请求参数中如果看到了一组乱序的请求参数,最好去验证这组请求参数是否为动态变化
基于百度AI实现的爬虫给功能:
使用流程:
点击控制台进行登录
选择想要实现的功能
实现功能下创建一个app
选择对应的 pythonSDK 文档进行代码实现
讲段子王中的段子内容爬取到本地,然后基于语音合成为mp3的音频文件,然后自己搭建一个web服务器,线上实时播放音频文件。
**模拟登录:**爬取基于某些用户的用户信息。
**需求:**对人人网进行模拟登录
1 | #1. 验证码的识别,获取验证码图片的文字数据 |
1 | '''视频UP主的源代码''' |
**需求:**爬取当前用户的相关用户信息(个人主页中显示的用户信息)
**http/https协议:**无状态。
没有请求到对应页面数据的原因:发起的第二次基于个人主页页面请求的时候,服务器并不知道该次请求是基于登录状态下的请求。
**cookie:**用来让服务器端记录客户端的相关状态
手动处理:抓包工具获取 Cookie
值,将值封装到 headers
中(不推荐)
自动处理:
Cookie
值的来源是哪里?模拟登录 post
请求后,由服务器端创建的。
session
会话对象:1. 可以进行请求的发送;2. 如果请求过程中产生了Cookie,则该Cookie会被自动存储/携带在该session对象中。
创建一个session对象:session = requests.Session( )
使用session对象进行模拟登录post
请求的发送(Cookie会被存储在session中)
session对象对个人主页对应的get请求进行发送(携带了Cookie)
1 | #####基于前一节代码之上#### |
1 | import requests |
**同步:**不同程序单元为了完成某个任务,在执行过程中需靠某种通信方式以协调一致,称这些程序单元是同步执行的。 例如购物系统中更新商品库存,需要用 “行锁” 作为通信信号,让不同的更新请求强制排队顺序执行,那更新库存的操作是同步的。 简言之,同步意味着有序。
**异步:**为完成某个任务,不同程序单元之间过程中无需通信协调,也能完成任务的方式,不相关的程序单元之间可以是异步的。 例如,爬虫下载网页。调度程序调用下载程序后,即可调度其他任务,而无需与该下载任务保持通信以协调行为。不同网页的下载、保存等操作都是无关的,也无需相互通知协调。这些异步操作的完成时刻并不确定。 简言之,异步意味着无序。
**目的:**在爬虫中使用异步实现高性能的数据爬取操作。
1 | import requests |
异步爬虫的方式:
1 | import time |
1 | #导入线程池模块对应的类 |
1 | # 需求:爬取梨视频视频数据 |
**协程:**英文叫做 Coroutine,又称微线程,纤程,协程是一种用户态的轻量级线程。 协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此协程能保留上一次调用时的状态,即所有局部状态的一个特定组合,每次过程重入时,就相当于进入上一次调用的状态。 协程本质上是个单进程,协程相对于多进程来说,无需线程上下文切换的开销,无需原子操作锁定及同步的开销,编程模型也非常简单。 我们可以使用协程来实现异步操作,比如在网络爬虫场景下,我们发出一个请求之后,需要等待一定的时间才能得到响应,但其实在这个等待过程中,程序可以干许多其他的事情,等到响应得到之后才切换回来继续处理,这样可以充分利用 CPU 和其他资源,这就是异步协程的优势。
单线程+异步协程:(推荐)
event_loop:
事件循环,相当于一个无限循环,我们可以把一些函数注册到这个事件循环上,当满足某些条件的时候,函数就会被循环执行。coroutine:
协程对象,我们可以将协程对象注册到事件循环中,它会被事件循环调用,我们可以使用 async 关键字来定义一个方法,这个方法在调用时不会立即执行,而是返回一个协程对象。task:
任务,他是对协程对象的进一步封装,包含了任务的各个状态。future:
代表将来执行或还没有执行的任务,实际上和 task 没有本质区别。async:
定义一个协程。await:
用来挂起阻塞方法的执行。1 | import asyncio |
1 | import time |
1 | ######未能实现异步进程,还是同步操作 |
1 | #环境的安装 pip install aiohttp |
问题:selenium
模块和爬虫之间具有怎样的关联?
便捷实现模拟登录
什么是selenium
模块?
基于浏览器自动化的一个模块。
selenium使用流程:
pip install selenium
get(url)
find系列方法
send_keys('xxxxxx')
excute_script('jsCode')
forward( )、back( )
quit( )
1 | # selenium操纵浏览器 |
1 | from selenium import webdriver |
**selenium
处理iframe
:**
switch_to.frame(id)
from selenium.webdriver import ActionChains
action = ActionChains(bro)
click_and_hold(div)
:长按且点击move_by_offset(x,y)
perform( )
:让动作链立即执行action.release( )
:释放动作链对象1 | from selenium import webdriver |
1 | #模拟登录QQ空间,运行前需要将代码中“QQ号码”和“QQ密码”改写 |
1 | from selenium import webdriver |
**超级鹰:**https://www.chaojiying.com/about.html
编码流程:
selenium
打开登录界面selenium
打开的这张界面进行截图1 | #!/usr/bin/env python |
什么是框架?
就是一个集成了很多功能并且具有很强通用性的一个项目模板。
如何学习框架?
专门学习框架封装的各种功能的详细用法。
什么是scrapy
?
爬虫中封装好的一个明星框架。
**功能:**高性能的持久化存储,异步的数据下载,高性能的数据解析,分布式
scrapy框架的基本使用:
pip install scrapy
pip install wheel
pip install Twisted-20.3.0-cp39-cp39-win_amd64.whl
pip install pywin32
pip install scrapy
scrapy startproject xxxPro
cd xxxPro
scrapy genspider spiderName www.xxx.com
scrapy crawl spiderName
1 | ###firstBlood__first |
1 | import scrapy |
scrapy持久化存储:
scrapy crawl xxx -o filePath
基于管道:
面试题:将爬取到的数据一份存储到本地,一份存储到数据库,如何实现?
process_item
中的return item
表示将item传递给下一个即将被执行的管道类**基于spider的全站数据爬取:**就是将网站中某板块下的全部页码对应的页面数据进行爬取。
url
添加到start_urls
列表(不推荐)1 | '''------------校花网xiaohua.py----------------''' |
五大核心组件:
1 | #### 我尝试着并未有啥结果.......等大佬 |
图片数据爬取之ImagesPipline:
基于scrapy爬取字符串类型的数据和爬取图片类型的数据区别?
ImagesPipeline:
**需求:**爬取站长素材的高清图片
使用流程:
get_media_request( )
file_path
item_completed
IMAGES_STORE = './imgs_ZYZhang'
1 | '''----------------爬取站长素材高清图片 img.py-----------------------''' |
process_request
process_exception:return request
**需求:**爬取网易新闻的新闻数据(标题和内容)
1 | '''-------------------------------网易新闻 wangyi.py------------------------''' |
**CrawlSpider:**基于Spider的一个子类
scrapy genspider -t crawl xxx www.xxxx.com
1 | '''---------------------阳光问政 sun.py---------------------------''' |
分布式爬虫:
如何实现分布式?
为什么原生的scrapy不可以实现分布式?
scrapy-redis组件作用:
scrapy-redis实现流程:
创建一个工程
创建一个基于CrawlSpider的爬虫文件
修改当前的爬虫文件:
from scrapy_redis.spiders import RedisCrawlSpider
修改配置文件settings
指定使用可以被共享的管道:
ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline': 400 }
指定调度器:
增加了一个去重容器类的配置,作用是用Redis的set集合来存储请求的指纹数据,从而实现请求去重的持久化
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
使用scrapy-redis组件自己的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
配置调度器是否要持久化,也就是当爬虫结束了,要不要清空Redis中请求队列和去重指纹的set。如果是True,就表示要持久化存储,就不清数据,否则清空数据
SCHEDULER_PERSIST = True
指定redis服务器
redis相关操作配置:
redis.conf
redis.windows.conf
bind 127.0.0.1
进行注释或删除protected-mode yes
改为no执行工程:
scrapy runspider xxx.py
向调度器的队列中放入一个起始的url:
lpush xxx www.xxx.com
爬取到的数据存储在了 redis 的 proName:items
这个数据结构中
为什么要讲?
如何讲解?
协程不是计算机提供,程序员人为创造。
协程( Coroutine),也可以被称为微线程,是一种用户态内的上下文切换技术。简而言之,其实就是通过一个线程实现代码块相互切换执行。
1 | def func1(): |
实现协程的集中方法:
pip install greenlet
1 | from greenlet import greenlet |
1 | def func1(): |
==遇到IO阻塞自动切换==
1 | import asyncio |
1 | import asyncio |
在一个线程中,如果遇到IO等待的时间,线程不会等待,利用空闲的时间去做其他的事情。
需求:下载三张图片(网络IO)
1 | '''普通的request方式''' |
1 | '''使用aiohttp模块下载 协程方式''' |
**概念:**理解为一个死循环,去检测并执行某些代码。
1 | # 伪代码 |
1 | import asyncio |
**协程函数:**定义函数时 async def 函数名
**协程对象:**执行 协程函数 得到的对象
1 | async def func(): |
1 | import asyncio |
await 可等待的对象(协程对象、Future对象、Task对象)
1 | '''示例一''' |
1 | '''示例二''' |
1 | '''示例三''' |
主要就是在事件循环中添加多个任务。
Task 用于并发调度协程,通过asyncio.create_task(协程对象)
的方式创建 Task 对象,这样可以让协程加入事件循环中等待被调度执行。除了使用 asyncio.create_task()
函数之外,还可以使用低层级的 loop.create_task()
或者 ensure_future()
函数,不建议手动实例化 Task 对象
1 | '''示例1''' |
1 | '''示例2''' |
1 | '''示例3''' |
Task 对象继承 Future,Task 对象内部 await 结果的处理是基于 Future 对象来的。
1 | '''示例1''' |
1 | '''示例2''' |
使用进程池或者线程池实现异步操作时用到的对象。
1 | import time |
以后写代码或许还有交叉使用。例如:crm项目80%都是属于基于协程异步编程 + MySQL(不支持)【线程或者进程做异步编程】
1 | import time |
1 | # 跟前一节代码一样的效果,但是更耗费资源 |
什么是异步迭代器?
实现了 __aiter__()
和 __anext__()
方法的对象。__anext__()
必须返回一个 awaitable
对象。async for
会处理异步迭代器的 __anext__()
方法所返回的可等待对象,直到其引发一个 StopAsyncIteration
异常。由 PEP 492
引入。
什么是异步可迭代对象?
可在 async for
语句中被使用的对象。必须通过它的 __aiter__()
方法返回一个 asynchronous iterator
。由 PEP 492
引入。
1 | import asyncio |
此种对象通过定义 __aenter__()
和 __aexit__()
方法来对 async with
语句中的环境进行控制。
1 | import asyncio |
uvloop 是 asyncio 的事件循环的替代方案。事件循环 > 默认 asyncio 的事件循环。
pip install uvloop
1 | import asyncio |
在使用 python 代码操作 redis 时,链接/操作/断开都是网络IO。
pip install aioredis
1 | #作者未设置 redis,故此代码未测试 |
1 | '''示例2''' |
pip3 install aiomysql
1 | '''示例1''' |
1 | '''示例2''' |
pip3 install fastapi
pip3 install uvicorn
1 | '''示例''' |
1 | '''示例2''' |
pip3 install aiohttp
1 | '''使用aiohttp模块下载 协程方式''' |
在 Node 生态系统中,依赖通常安装在项目的 node_modules
文件夹中。然而,这个文件的结构和实际依赖树可能有所区别,因为重复的依赖可以合并到一起。npm
客户端把依赖安装到 node_modules
目录的过程具有不确定性。这意味着当依赖的安装顺序不同时,node_modules
目录的结构可能会发生变化。这种差异可能会导致类似“我的电脑上可以运行,别的电脑上不行”的情况,并且通常需要花费大量时间定为与解决。
有时候就会遇到这种情况,完整可运行的项目上传到 git 上,别人 pull 下来以后,npm install 会报错。
Yarn 一开始的主要目标是解决由于语义版本控制而导致的 npm 安装的不确定性问题。虽然可以用 npm shrinkwrap
来实现可预测的依赖关系树,但它并不是默认选项,而是取决于所有的开发人员指导并启用这个选项。
npm 5+ 以后的版本加入了 package-lock.json 可以用来锁版本,package-lock.json 的名字,一看就懂,更清楚,但是不向后兼容。
npm-shrinkwrap.json 向后兼容 npm 2-4。
举个例子:
npm 对包引入顺序也十分的敏感,比如在一个空项目里执行以下命令:
1 | npm init -y |
我们这里安装了 3 个包都依赖于 lodash,不过 globule 依赖 lodash@1.0.3,另外另个依赖 lodash@4.x。
现在目录依赖结构如下:
这是假设我们在项目里使用 lodash,但是忘记重新安装 lodash
1 | var lodash = require('lodash') |
另一个同事获取项目代码,执行 npm install
,这时的目录依赖结构里面,第一层依赖的 lodash 变成了 4.x 版本,这样就造成了依赖版本不一致的问题。而 yarn 则会保证无论怎样引入的顺序,目录依赖结构都是一致的,确保不会发生这样的BUG。
Yarn 就是一个类似于 npm 的包管理工具,它是由 facebook 推出并开源。
与 npm 相比,yarn 有着众多的优势,主要的优势在于:速度快、离线模式、版本控制。
npm 会等一个包完全安装完才跳到下一个包,但 yarn 会并行执行包,因此速度会快很多。
Yarn 会缓存它下载的每个包,所以无需重复下载。它还能并行化操作以最大化资源利用率,安装速度之快前所未有。
之前安装过的包会被保存进缓存目录,以后安装就直接从缓存中复制过来,这样做的本质还是会提高安装下载的速度,避免不必要的网络请求。
保证各平台依赖的一致性
力求网络资源最大利用化,让资源下载完美队列执行,避免大量的无用请求,下载失败会自动重新请求,避免整个安装过程失败
对于不匹配的依赖版本的包创立一个独立的包,避免创建重复的。
对于多个包依赖同一个子包的情况,yarn 会尽量提取为同一个包,防止出现多处副本,浪费空间。
npm 用下来比较强的一个痛点就是:当包的依赖层次比较深时,版本控制不够精确。会出现相同 package.json,但不同人的电脑上安装出不同版本的依赖包,出现类似“我的电脑上可以运行,别的电脑上不行”的 bug 很难查找。你可以使用 npm-shrinkwrap 来实现版本固化,版本信息会写入 npm-shrinkwrap.json 文件中,但它毕竟不是 npm 的标准配置。
而 yarn 天生就能实现版本固化。会生成一个类似 npm-shrinkwrap.json 的 yarn.lock 文件,而文件内会描述包自身的版本号,还会锁定所有它依赖的包的版本号:
1 | "@babel/code-frame@7.0.0-beta.47": |
yarn.lock 存储着你的每个包的确切依赖版本,能确保从本地开发到生产环境,所有机器上都有精确相同的依赖版本。
我们在使用 Yarn 时,依然要访问 npm 仓库,但 Yarn 能够更快速地安装软件包和管理依赖关系,并且可以在跨机器或者无网络的安全环境中保持代码的一致性。
在 Yarn 中文网可以找到 window 下的三种安装方法:
[
不过我觉得这三种方法都不好用,快速好用的安装方法应该还是使用 npm 来安装:
1 | npm install -g yarn |
关于为什么使用 -g
,以及 -g
会带来哪来影响,这个可以看我的这篇文章:npm详细介绍,里面详细介绍了为什么要使用 -g
,以及 -g
的作用。
1 | npm install -g yarn |
如果有报: Please try running this command again as root/Administrator.
,可能就是权限不足,因此你需要切换到最高权限去执行命令
1 | sudo -s |
使用另一种初始化脚本的方法,可能就会比较简单一些:
1 | curl -o- -L https://yarnpkg.com/install.sh | bash |
如果你的电脑上面已经安装了 Homebrew 的话,你可以通过 Homebrew 包管理器安装 Yarn
1 | brew install yarn |
Yarn 源仓库包下载不稳定
1 | // 查看 yarn 配置 |
1 | 安装淘宝镜像 |
npm install
=== yarn
—— install安装是默认行为npm install taco --save
=== yarn add taco
—— taco包立即被保存到 package.json
中。npm uninstall taco --save
=== yarn remove taco
npm install taco --save-dev
=== yarn add taco --dev
npm update --save
=== yarn upgrade
-
npm install taco@latest --save
=== yarn add taco
npm install taco --global
=== yarn global add taco
—— 一如既往,请谨慎使用 global 标记。注意:使用yarn或yarn install安装全部依赖时是根据package.json里的”dependencies”字段来决定的
-
npm init
=== yarn init
npm init --yes/-y
=== yarn init --yes/-y
npm link
=== yarn link
npm outdated
=== yarn outdated
npm publish
=== yarn publish
npm run
=== yarn run
npm cache clean
=== yarn cache clean
npm login
=== yarn login
npm test
=== yarn test
yarn licenses ls
—— 允许你检查依赖的许可信息yarn licenses generate
—— 自动创建依赖免责声明 licenseyarn why taco
—— 检查为什么会安装 taco,详细列出依赖它的其他包yarn why vuepress
—— 检查为什么会安装 vuepress,详细列出依赖它的其他包Yarn 除了让安装过程变得更快与更可靠,还添加了一些额外的特性,从而进一步简化依赖管理的工作流。
npm
与 bower
工作流,并支持两种软件仓库混合使用Termux 高级终端安装使用配置教程,刚写这篇文章的时候,当时国内 Termux 相关的文章和资料相对来说还是比较少的,就花了几天写了这一篇文章,没想到居然火了,受宠若惊。所以这篇文章国光就打算定期更新了,想打造成 termux 的中文文档,希望本文可以帮助到更多对 Termux 感兴趣的朋友,发挥 Android 平台更大的 DIY 空间。
17 年开始接触到 Termux,就发现它有很多值得挖掘的潜力,于是抽空在 18 年的某一个法定的整整花了三天假期开才写完第一版文章,然后文章陆陆续续更新到现在,期间有一次误操作不小心把博客所有的评论都删了,否则这篇文章的评论数会更多。现在本文的截图数量达到了150张左右了,文字数目已经数万多了。自己花了很长时间写出来的原创文章,抄袭白嫖党直接Ctrl+C Ctrl+V只要几秒钟。原创很辛苦,抄袭的成本却很低,维权的成本又很高,虽然国内目前的抄袭风气很严重,但是我相信尊重原创,保护原创从现在做起从大家做起,tomorrow is another day! 如果大面转载引用的话 希望标明文章出处:
Termux 高级终端安装使用配置教程
https://www.sqlsec.com/2018/05/termux.html
考虑到手机用户体验和离线观看教程的需求,国光打包了几种风格的 PDF版本,并且已经插入好目录,阅读体验会比较友好。
黑色背景的 PDF : Termux入门指南(Vue 黑)
白色背景的 PDF : Termux入门指南(Github 白)
macOS light风格 : Termux入门指南(macOS 白)
Gothic风格 : Termux入门指南(简约线条)
早期我的信息安全交流群里面陆陆续续加了很多 Temux 玩家,然而那是一个信息安全交流群,Termux 的提问经常没有人回答,所以后来我就把博客所有的加群链接给去了。现在国光我单独建立了 1 个Temux 群,加群链接藏在本文当中,是一个彩蛋,缘妙不可言,随缘入群吧。好了话不多说,教程开始了,希望本文可以帮助到大家。
文档相关
下载地址
Google Play 下载的版本比酷安要新,而且插件这块安装也很方便,有能力的朋友建议首先考虑下载Google PLay版本的,然后考虑 F-Droid版本,最后再考虑可怜兮兮的酷安版本。
Termux 是一个 Android 下一个高级的终端模拟器,开源且不需要 root,支持 apt 管理软件包,十分方便安装软件包,完美支持 Python、 PHP、 Ruby、 Nodejs、 MySQL等。随着智能设备的普及和性能的不断提升,如今的手机、平板等的硬件标准已达到了初级桌面计算机的硬件标准,用心去打造 DIY 的话完全可以把手机变成一个强大的极客工具。
初始化
第一次启动Termux的时候需要从远程服务器加载数据,然而可能会遇到这种问题:
Verilog
1 | Ubable to install |
这里的Termux官方远程的服务器地址是: http://termux.net/bootstrap/
目前解决方法有两种:
基本操作还是要学习一下的,可以事半功倍。
可以使用缩放手势来调整其字体大小。 对就是 双指放大缩小照片那样操作。
长按屏幕会调出显示菜单项(包括复制、粘贴、更多),方便我们进行复制或者粘贴
More
菜单的说明如下:
Bash
1 | 长按屏幕 |
显示隐藏式导航栏,可以新建、切换、重命名会话session和调用弹出输入法
同时在Android的通知栏中也可以看到当前Termux运行的会话数:
常用键是PC端常用的按键如: ESC键、Tab键、CTR键、ALT键,有了这些按键后可以提高我们日常操作的效率,所以Termux后面的版本默认都是显示这个扩展功能按键的。 (18年的时候默认是不显示的)
打开和隐藏这个扩展功能按键目前有下面两种方法:
方法一
从左向右滑动,显示隐藏式导航栏,长按左下角的KEYBOARD
方法二
使用Termux
快捷键:音量+
+Q
键 或者 音量+
+K
键
当然这个常用按键在 Termux 后面的版本也支持自定义的,详情见本文的「进阶配置」-「定制常用按键」这一小节。
这些基础知识简单了解一下就可以了,Linux 用的多了 就会慢慢熟悉理解了。
Ctrl
键是终端用户常用的按键,但大多数触摸键盘都没有这个按键,因此 Termux 使用音量减小按钮
来模拟Ctrl
键。
例如,在触摸键盘上按音量减小
+ L
就相当于是键盘上按Ctrl + L
的效果一样,达到清屏的效果。
Ctrl + A
-> 将光标移动到行首Ctrl + C
-> 中止当前进程Ctrl + D
-> 注销终端会话Ctrl + E
-> 将光标移动到行尾Ctrl + K
-> 从光标删除到行尾Ctrl + U
-> 从光标删除到行首Ctrl + L
-> 清除终端Ctrl + Z
-> 挂起(发送SIGTSTP到)当前进程Ctrl + alt + C
-> 打开新会话(仅适用于 黑客键盘)音量加键
也可以作为产生特定输入的特殊键
.
音量加 + E
-> Esc键音量加 + T
-> Tab键音量加 + 1
-> F1(音量增加 + 2
→ F2…以此类推)音量加 + 0
-> F10音量加 + B
-> Alt + B,使用readline时返回一个单词音量加 + F
-> Alt + F,使用readline时转发一个单词音量加 + X
-> Alt+X音量加 + W
-> 向上箭头键音量加 + A
-> 向左箭头键音量加 + S
-> 向下箭头键音量加 + D
-> 向右箭头键音量加 + L
-> | (管道字符)音量加 + H
-> 〜(波浪号字符)音量加 + U
-> _ (下划线字符)音量加 + P
-> 上一页音量加 + N
-> 下一页音量加 + .
-> Ctrl + \(SIGQUIT)音量加 + V
-> 显示音量控制音量加 + Q
-> 切换显示的功能键视音量加 + K
-> 切换显示的功能键视图快捷键用的熟悉的话也可以极大提高操作的效率。
Termux 除了支持 apt
命令外,还在此基础上封装了pkg
命令,pkg
命令向下兼容 apt
命令。apt
命令大家应该都比较熟悉了,这里直接简单的介绍下pkg
命令:
Bash
1 | pkg search <query> # 搜索包 |
国光建议大家使用 pkg 命令,因为 pkg 命令每次安装的时候自动执行 apt update 命令,很是方便
除了通过上述的 pkg
命令安装软件以外,如果我们有 .deb
软件包文件,也可以使用 dpkg
进行安装。
Bash
1 | dpkg -i ./package.de # 安装 deb 包 |
Bash
1 | echo $HOME |
长期使用 Linux 的朋友可能会发现,这个HOME路径看上去和我们电脑端的不太一样,这是为了方便 Termux 提供的特殊的环境变量。
Andorid 10 以下的版本是可以正常使用netstat 命令的,这样可以方便的查看端口开放信息
Bash
1 | # 查看所有端口 |
Andorid 10 版本的Termux 下无法正常使用 netstat -an 命令,国光的解决方法是安装一个 nmap,然后扫描本地端口(弯道超车):
Bash
1 | # 安装nmap端口扫描神器 |
使用 nmap 操作 纯属无奈之举,但是又不是不能用(源于:罗永浩名言 :-))
要想使用体验好,进阶配置少不了。(单押)
使用pkg update
更新一下的时候发现默认的官方源网速有点慢,在这个喧嚣浮躁的时代,我们难以静下心等待,这个时候就得更换成国内的Termux
清华大学源了,加快软件包下载速度。
可以使用如下命令自动替换官方源为 TUNA 镜像源
pkg update
卡住的话多按几次回车 不要傻乎乎的等
Bash
1 | sed -i 's@^\(deb.*stable main\)$@#\1\ndeb https://mirrors.tuna.tsinghua.edu.cn/termux/termux-packages-24 stable main@' $PREFIX/etc/apt/sources.list |
更换源几秒钟就可以执行完pkg update
了,心里顿时乐开了花。
请使用内置或安装在 Termux 里的文本编辑器,例如 vi
/ vim
/ nano
等直接编辑源文件,不要使用 RE 管理器等其他具有 ROOT 权限的外部 APP 来修改 Termux 的文件
编辑 $PREFIX/etc/apt/sources.list
修改为如下内容
Bash
1 | # The termux repository mirror from TUNA: |
编辑 $PREFIX/etc/apt/sources.list.d/science.list
修改为如下内容
Bash
1 | # The termux repository mirror from TUNA: |
编辑 $PREFIX/etc/apt/sources.list.d/game.list
修改为如下内容
Bash
1 | # The termux repository mirror from TUNA: |
安装基础工具
更换源之后来赶紧来下载安装一些基本工具吧,这些工具基本上是 Linux 系统自带的,因为 Termux 为了体积不过大,默认是没有带这些工具的,执行下面的命令来安装:
Bash
1 | pkg update |
脚本项目地址:https://github.com/Cabbagec/termux-ohmyzsh/
该脚本主要使用了zsh
来替代bash
作为默认 shell,并且支持色彩和字体样式,同时也激活了外置存储,可以直接访问SD卡下的目录。主题默认为 agnoster,颜色样式默认为 Tango,字体默认为 Ubuntu。
执行下面这个命令确保已经安装好了 curl 命令
Bash
1 | sh -c "$(curl -fsSL https://github.com/Cabbagec/termux-ohmyzsh/raw/master/install.sh)" |
如果因为不可抗力的原因,出现port 443: Connection refused
网络超时的情况,那么执行下面国光迁移到国内的地址的命令即可:
Bash
1 | sh -c "$(curl -fsSL https://html.sqlsec.com/termux-install.sh)" |
Android6.0 以上会弹框确认是否授权访问文件,点击始终允许
授权后 Termux 可以方便的访问SD卡文件。
手机 App 默认只能访问自己的数据,如果要访问手机的存储,需要请求权限,如果你刚刚不小心点了拒绝的话,那么可以执行以下命令来重新获取访问权限:
Bash
1 | termux-setup-storage |
脚本允许后先后有如下两个选项:
Bash
1 | Enter a number, leave blank to not to change: 14 |
分别选择色彩样式
和字体样式
,重启Termux app后生效配置。不满意刚刚的效果,想要继续更改配色方案的话,可以根据下面命令来更改对应的色彩配色方案:
设置色彩样式:
输入chcolor
命令更换色彩样式,或者:~/.termux/colors.sh
命令
设置字体
运行chfont
更换字体,或者:~/.termux/fonts.sh
命令
执行过上面的一键配置脚本后,并且授予 Termux 文件访问权限的话,会在家目录生成storage
目录,并且生成若干目录,软连接都指向外置存储卡的相应目录:
创建QQ文件夹软连接
手机上一般经常使用手机QQ来接收文件,这里为了方便文件传输,直接在storage
目录下创建软链接.
QQ
Bash
1 | ln -s /data/data/com.termux/files/home/storage/shared/tencent/QQfile_recv QQ |
TIM
Bash
1 | ln -s /data/data/com.termux/files/home/storage/shared/tencent/TIMfile_recv TIM |
这样可以直接在home
目录下去访问QQ文件夹,大大提升了工作效率。
在 Termux v0.66 的版本之后我们可以通过 ~/.termux/termux.properties
文件来定制我们的常用功能按键,默认是不存在这个文件的,我们得自己配置创建一下这个文件。
下面做尝试简单配置一下这个文件:
Bash
1 | # 新建并编辑配置文件 |
内容为:
Bash
1 | extra-keys = [ \ |
如果无法创建这个文件,那么得首先新建一下这个目录 mkdir ~/.termux
修改完成保存文件后,重启 Termux app生效配置:
可以直接输入特殊的字符串,例如上面的例子中的|
就是一个字符串,此外 Termux 还有封装了一些特殊按键,入上面例子中的ESC
就是 Termux 自带的按键,完整的特殊按键表如下:
按键 | 说明 |
---|---|
CTRL | 特殊按键 |
ALT | 特殊按键 |
FN | 特殊按键 |
ESC | 退出键 |
TAB | 表格键 |
HOME | 原位键 |
END | 结尾键 |
PGUP | 上翻页键 |
PGDN | 下翻页键 |
INS | 插入键 |
DEL | 删除键 |
BKSP | 退格键 |
UP | 方向键 上 |
LEFT | 方向键 左 |
RIGHT | 方向键 右 |
DOWN | 方向键 下 |
ENTER | 回车键 |
BACKSLASH | 反斜杠 \ |
QUOTE | 双引号键 |
APOSTROPHE | 单引号键 |
F1~F12 | F1-F12按键 |
上面列出的三个特殊键中的每一个最多只能在附加键定义中列出一次,超过次数将会报错。
下面是国光我自用的按键表:
Bash
1 | extra-keys = [ \ |
编辑家目录下的.zshrc
配置文件
Bash
1 | $ vim .zshrc |
第一行可以看到,默认的主题是agnoster
主题:
实际上这个主题也蛮酷的,如果你还想更换其他主题的话,那么在.oh-my-zsh/themes
目录下放着oh-my-zsh
所有的主题配置文件,只要将默认的 agnoster 更换为其他的主题文件名即可。
下面是国光认为还不错的几款主题
agnoster
ys
robbyrussell
主题比较多,国光这里就不列举了,感兴趣大家可以一个个尝试去看看。 当然如果你是个变态的话,可以尝试random
主题,每打开一个会话配色主题都是随机的.
1 | ZSH_THEME="random" |
zsh 之所以受欢迎除了好看的配色以为,另一个原因就是强大的插件了。下面国光列举一款比较实用的插件的安装方法,更多强大的插件等待大家自己去探索。
根据用户的平时使用习惯,终端会自动提示接下来可能要输入的命令,这个实际使用效率还是比较高的:
Bash
1 | # 拷贝到 plugins 目录下 |
在 ~/.zshrc
中配置:
Ini
1 | plugins=(其他的插件 zsh-autosuggestions) |
输入zsh
命令生效配置:
效果图
可以看到国光我只敲了一个v
后面的命令就自动提示补全了,这时候只要按右方向键
,在 Termux 里面的快捷键是 音量加 + D
,就可以直接补全命令了。
默认的启动问候语如下:
这个启动问候语在前期对于初学者有一定的帮助,但是随着你们 Termux 的熟悉,这个默认的问候语就会显得比较臃肿。编辑问候语文件可以直接修改启动显示的问候语:
Bash
1 | vim $PREFIX/etc/motd |
修改完的效果如下:
本文版本归国光所有 转载注明出处哦
这样启动新的会话的时候看上去就会简洁很多。什么你也想要这个效果? 呐 下面是国光自己生成的,可以直接复制粘贴:
Ini
1 | _____ |
首先你得了解 Jsdeliver,他只加载 20MB 以内的资源,如果你的视频正好控制这一范围的话,你就可以使用默认的内容了
但是由于 Jsdeliver 对视频资源的解析不友好,所以我们就得对视频资源做一定的处理。
用过 QQ 浏览器的都知道下载网页上的视频下来都是 M3U8 的视频格式,即使你不下载,只是看视频都会产生 M3U8 文件和 TS 文件。
M3U 文件是一个记录索引的纯文本文件,打开它时播放软件并不会播放它
而是根据它的索引找到对应的音视频文件的网络地址进行在线播放
将一个视频文件 (MP4) 切片分为很多个 TS 文件,一个 TS 文件的视频时常可以自定义,比如切片为 5 秒
那么其他 ts 文件也是 5 秒,但是这个不是完全准确,也就是说会有误差,会产生 4-7 秒左右的 ts 视频文件
那他是这么工作的呢?(以下图片是本地运行过程)
什么是 ffmpeg 在这里我就不再赘述了,感兴趣的可以自行搜索
了解了 M3U8 和 TS,我该怎么把视频切片呢?
使用 ffmpeg 工具进行切片
官网:https://ffmpeg.org/download.html
下载解压后打开 bin 目录,在里面找到 ffmpeg.exe 复制到自己新建的一个文件夹里,再把想要切片的视频 Copy 进来
当前目录下有
00.mp4
ffmpeg.exe
打开 cmd,cd 进入到刚刚新建的文件夹,关于怎么操作我就不多 bb 了
既然都用上 Github,用 Jsdeliver 加速了,你电脑里一定装了 Git 工具
在当前目录打开 Git Bash 命令行
(cmd 不需要 ./ )
1 | ./ffmpeg.exe -y -i 00.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 00.ts |
按时间隔分片,1 对 N,下面的 5 即每个分片5秒,自行修改
1 | ./ffmpeg -i 00.ts -c copy -map 0 -f segment -segment_list 00.m3u8 -segment_time 5 00%03d.ts |
这时你的文件了会有如下图文件
那么将剩下的东西 push 到自己的仓库吧
现在访问是 m3u8 是不可以播放视频的 (会自动下载对吧)
访问文件也是不行的 (乱码对吧)
什么是 HLS 技术?
HLS (HTTP Live Streaming) 是 Apple 的动态码率自适应技术。主要用于 PC 和 Apple 终端的音视频服务。
包括一个 m3u (8) 的索引文件,TS 媒体分片文件和 key 加密串文件。(摘抄自百度百科)
CDN:https://cdn.jsdelivr.net/npm/hls.js
属性 | 值 | 说明 |
---|---|---|
autoplay | autoplay | 如果出现该属性,则视频在就绪后马上播放 |
controls | controls | 如果出现该属性,则向用户显示控件,比如播放按钮 |
height | pixels | 设置视频播放器的高度 |
loop | loop | 如果出现该属性,则当媒介文件完成播放后再次开始播放 |
muted | muted | 规定视频的音频输出应该被静音. |
poster | URL | 规定视频下载时显示的图像,或者在用户点击播放按钮前显示的图像。 |
preload | preload | 如果出现该属性,则视频在页面加载时进行加载,并预备播放。如果使用 “autoplay”,则忽略该属性。 |
src | url | 要播放的视频的 URL |
width | pixels | 设置视频播放器的宽度 |
1 | <script src="https://cdn.jsdelivr.net/npm/hls.js"></script> |
效果图
]]>
下载回放到本地(针对管理员设置不能下载的视频回放)
代理类型:HTTP 代理
代理地址:127.0.0.1
代理端口:8888
修改自 Spoience https://spoience.com/ddzhibo.html
]]>下载完的视频正好可以分享给我的那三个室友看😁
Github 作为全球最大的开源代码托管平台,在其 Github Education 官网有关于 Github 学生开发包的说明:
Learn to ship software like a pro. There’s no substitute for hands-on experience. But for most students, real world tools can be cost-prohibitive. That’s why we created the GitHub Student Developer Pack with some of our partners and friends: to give students free access to the best developer tools in one place so they can learn by doing.
在 Github 文档上,它向我们提供了学生开发包的申请流程和介绍:
在申请个人折扣之前,请检查您的学习社区是否已作为 GitHub Education 学校与我们合作。 更多信息请参阅 “关于 GitHub Education”。
在国内,有些院校不给学生提供教育邮箱或者院校没有作为 GitHub Education 学校与 Github 合作,这时候我们只能通过其他方式证明我们身份并设法通过学生开发包的申请。
在作为学生期间,Github 可能会提示您定期重新验证目前的学业身份。
Github 是接受国内高等院校申请的,如果您所在的大学很良心的提供血汗俄国教育邮箱(国内是 edu.cn),你仅需要把这教育邮箱绑定你的 Github 账号或者使用这个邮箱注册 Github,然后在申请页面选择该邮箱即可。
如果你像我一样的倒霉蛋,在一所不提供教育邮箱的 * 大学,那你需要尝试使用证明你学生身份的文件申请,这种方法需要人工审核,需要的时间可能长一点,还有概率申请被拒绝,请做好心里准备…… 随让咱们学校垃圾呢😀
开始前,准备…
俺们肯定选择学生
填入你的学校英文全称(可以维基百科看下正式英文全称),注意 How do you plan to use Github 一定要好好写,点击 “Submit your information” 提交申请
因为俺们这学校没有教育邮箱,所以提交上面的申请后 Github 需要你提供更多信息以证明你的身份,左边的是使用学生证来证明你的身份
下拉页面,你可以选择现在拍照或者上传学生证照片(注意图片不能超过 5MB)
完成后点击提交申请
感谢您的提交! 请务必检查您的电子邮件。如果您在一小时内没有收到我们的回音,您应该在不到 1 个月的时间内收到我们的电子邮件。祝您度过一个美好的一天!
]]>转自 Spoience https://spoience.com/github-jetbrains-edu.html
创建一个新的 git 版本库。这个版本库的配置、存储等信息会被保存到.git 文件夹中
1 | # 初始化当前项目 |
更改设置。可以是版本库的设置,也可以是系统的或全局的
1 | # 显示当前的Git配置 |
git 内置了对命令非常详细的解释,可以供我们快速查阅
1 | # 查找可用命令 |
显示索引文件(也就是当前工作空间)和当前的头指针指向的提交的不同
1 | # 显示分支,未跟踪文件,更改和其他不同 |
获取某些文件,某些分支,某次提交等 git 信息
1 | # 显示commit历史,以及每次commit发生变更的文件 |
添加文件到当前工作空间中。如果你不使用 git add
将文件添加进去,那么这些文件也不会添加到之后的提交之中
1 | # 添加一个文件 |
rm 和上面的 add 命令相反,从工作空间中去掉某个文件
1 | # 移除 HelloWorld.js |
管理分支,可以通过下列命令对分支进行增删改查切换等
1 | # 查看所有的分支和远程分支 |
将当前工作空间更新到索引所标识的或者某一特定的工作空间
1 | # 检出一个版本库,默认将更新到master分支 |
远程同步的远端分支
1 | # 下载远程仓库的所有变动 |
1 | # 恢复暂存区的指定文件到工作区 |
将当前索引的更改保存为一个新的提交,这个提交包括用户做出的更改与信息
1 | # 提交暂存区到仓库区附带提交信息 |
显示当前工作空间和提交的不同
1 | # 显示工作目录和索引的不同 |
可以在版本库中快速查找
可选配置:
1 | # 感谢Travis Jeffery提供的以下用法: |
显示这个版本库的所有提交
1 | # 显示所有提交 |
合并就是将外部的提交合并到自己的分支中
1 | # 将其他分支合并到当前分支 |
重命名或移动一个文件
1 | # 重命名 |
1 | # 列出所有tag |
从远端版本库合并到当前分支
1 | # 从远端origin的master分支更新版本库 |
1 | $ git ci <file> |
将一个分支上所有的提交历史都应用到另一个分支上不要在一个已经公开的远端分支上使用 rebase.
1 | # 将experimentBranch应用到master上面 |
将当前的头指针复位到一个特定的状态。这样可以使你撤销 merge、pull、commits、add 等 这是个很强大的命令,但是在使用时一定要清楚其所产生的后果
1 | # 使 staging 区域恢复到上次提交时的状态,不改变现在的工作目录 |
1 | # 生成一个可供发布的压缩包 |
这个命令可以查看已经安装的包及版本信息,当你要换电脑,或者朋友想复刻你已安装的包,又不想一个一个重新安装。这时就可以使用pip freeze > requirements.txt ,批量导出当前开发环境的包信息,然后安装requirements.txt依赖就行了。
1 | pip freeze > requirements.txt |
用pip安装python模块的时候,重复安装某一模块会经常出现“Using cache”,这样很容易装错版本。而且cache还会占用不少C盘空间,如果空间不足,可以直接删除这些缓存。 方法:
Win + R ,输入%LocalAppData%\pip\Cache
删掉 cache/ 目录下的所有文件夹就好了
pip list 命令列出所有安装包和版本信息,pip list --outdate可以列出所有可升级的包。
但是当前内建命令并不支持升级所有已安装的Python模块,不过可以写一个:
1 | import pip |
替代方案是使用pip-review,这是一个分叉pip-tools,升级包就太方便了。安装和使用方法:
1 | pip install pip-review |
pip 用国外的源下载安装包会比较慢,还经常出错安装失败,可以将安装源切换成国内镜像,速度×10!改一些pip.init配置,一劳永逸,具体做法:Win + R ,输入 %APPDATA% 在当前目录下新建 pip 文件夹,然后新建 pip.ini 文件,内容如下
1 | [global] |
我直接设置成了阿里的,豆瓣的源速度也很快。
1 | 豆瓣(douban) http://pypi.douban.com/simple/ |
废话不多说直接上教程
1 | debugtbs.qq.com |
1 | Bvideo.currentTime=900; |
vconsole
把复制的代码填进去,点击OK
,直接跳过视频以上源码来自于网络收集,我只是个工具人请自行查看原作者
配置up.php中的相关字段
1 | define("TYPE","GITHUB");//选择github |
https://github.com/settings/tokens 去这个页面生成一个有写权限的token(repo:Full control of private repositories 和write:packages前打勾)
文件配置好之后就可以上传到自己的虚拟主机了 参见 https://ysnsn.cn/2817.html 或者推荐 https://plushine.cn/38834.html
绑定域名之后就可以通过域名访问,自己测试下能不能上传成功
php版本选择 7.2
1 | [global] |
🥢学习途径
mooc嵩天 https://www.icourse163.org/learn/BIT-1002058035?tid=1002161029#/learn/announce
B站 用来的学习网站(没说错吧)
python100天 https://github.com/jackfrued/Python-100-Days
python菜鸟教程 https://www.runoob.com/python/python-tutorial.html
淘宝买的二级书
官网python版本一般用3.7.0 https://www.python.org/
vscode 装了插件后好看用 https://code.visualstudio.com/
推荐使用Sublime
以下方法可以检查给定列表是不是存在重复元素,它会使用 set() 函数来移除所有重复元素。
1 | def all_unique(lst): |
检查两个字符串的组成元素是不是一样的。
1 | from collections import Counter |
1 | import sys |
下面的代码块可以检查字符串占用的字节数。
1 | def byte_size(string): |
该代码块不需要循环语句就能打印 N 次字符串。
1 | n = 2 |
6 大写第一个字母
以下代码块会使用 title() 方法,从而大写字符串中每一个单词的首字母。
1 | s = "programming is awesome" |
给定具体的大小,定义一个函数以按照这个大小切割列表。
1 | from math import ceil |
这个方法可以将布尔型的值去掉,例如(False,None,0,“”),它使用 filter() 函数。
1 | def compact(lst): |
如下代码段可以将打包好的成对列表解开成两组不同的元组。
1 | array = [['a', 'b'], ['c', 'd'], ['e', 'f']] |
我们可以在一行代码中使用不同的运算符对比多个不同的元素。
1 | a = 3 |
下面的代码可以将列表连接成单个字符串,且每一个元素间的分隔方式设置为了逗号。
1 | hobbies = ["basketball", "football", "swimming"] |
以下方法将统计字符串中的元音 (‘a’, ‘e’, ‘i’, ‘o’, ‘u’) 的个数,它是通过正则表达式做的。
1 | import re |
如下方法将令给定字符串的第一个字符统一为小写。
1 | def decapitalize(string): |
该方法将通过递归的方式将列表的嵌套展开为单个列表。
1 | def spread(arg): |
该方法将返回第一个列表的元素,其不在第二个列表内。如果同时要反馈第二个列表独有的元素,还需要加一句 set_b.difference(set_a)。
1 | def difference(a, b): |
如下方法首先会应用一个给定的函数,然后再返回应用函数后结果有差别的列表元素。
1 | def difference_by(a, b, fn): |
你可以在一行代码内调用多个函数。
1 | def add(a, b): |
如下代码将检查两个列表是不是有重复项。
1 | def has_duplicates(lst): |
下面的方法将用于合并两个字典。
1 | def merge_two_dicts(a, b): |
在 Python 3.5 或更高版本中,我们也可以用以下方式合并字典:
1 | def merge_dictionaries(a, b) |
如下方法将会把两个列表转化为单个字典。
1 | def to_dictionary(keys, values): |
我们常用 For 循环来遍历某个列表,同样我们也能枚举列表的索引与值。
1 | list = ["a", "b", "c", "d"] |
如下代码块可以用来计算执行特定代码所花费的时间。
1 | import time |
我们在使用 try/except 语句的时候也可以加一个 else 子句,如果没有触发错误的话,这个子句就会被运行。
1 | try: |
下面的方法会根据元素频率取列表中最常见的元素。
1 | def most_frequent(list): |
以下方法会检查给定的字符串是不是回文序列,它首先会把所有字母转化为小写,并移除非英文字母符号。最后,它会对比字符串与反向字符串是否相等,相等则表示为回文序列。
1 | def palindrome(string): |
这一段代码可以不使用条件语句就实现加减乘除、求幂操作,它通过字典这一数据结构实现:
1 | import operator |
该算法会打乱列表元素的顺序,它主要会通过 Fisher-Yates 算法对新列表进行排序:
1 | from copy import deepcopy |
将列表内的所有元素,包括子列表,都展开成一个列表。
1 | def spread(arg): |
不需要额外的操作就能交换两个变量的值。
1 | def swap(a, b): |
通过 Key 取对应的 Value 值,可以通过以下方式设置默认值。如果 get() 方法没有设置默认值,那么如果遇到不存在的 Key,则会返回 None。
1 | d = {'a': 1, 'b': 2} |
CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。——百度百科
放在Github的资源在国内加载速度比较慢,因此需要使用CDN加速来优化网站打开速度,jsDelivr + Github便是免费且好用的CDN,非常适合博客网站使用。
1 | https://cdn.jsdelivr.net/gh/GitHub用户名/新建的仓库名/**图片**.jpg |
1 | Package size exceeded the configured limit of 50 MB |
一. 当你的release版本号写为master时,只需要第一次发布release即可,后面直接用master分支的文件,也没有50MB的文件包大小限制按照官方的格式,就是
1 | https://cdn.jsdelivr.net/gh/<username>/<repo-name>@<version>/<path> |
例如,下面就可以访问了
1 | https://cdn.jsdelivr.net/gh/Ysnsn/picture@master/111/03613.jpg |
二. 通过picgo配合GitHub 来使图片快速上传,配置picgo如下
token获取路径
下面的小方格可以全部选上(如果不知道是啥意思时)
- 本博客不提供任何经过第三方修改的软件
- 仅仅是为了记录自己使用过的一些实用软件
谷歌邮箱 谷歌搜索 谷歌扩展商店 谷歌家的东西基本都能访问了
IGG谷歌访问助手👉IGG
选择离线安装,下载得到压缩包并解压得到图3
打开你的Chrome浏览器的 更多工具>扩展程序页面
1、点击右上角 开发者模式 开关 2、再点击左上角 “添加已解压的扩展程序” 3、选择本次下载包里目录(即图3所示) 4、确认选取.
插件安装成功后如下图所示 并打开点击连接,就可以正常使用Google
以上是谷歌浏览器的方法,其它浏览器请正常安装。
小巧而能力强大的geek,免费版基本够用👉geek
上面这一个就够日常使用,不再推荐了
CCleaner🍀这里直达
火绒也自带垃圾清理 https://www.huorong.cn/
1 | RAR registration data |
Bigjpg - AI人工智能图片无损放大 https://bigjpg.com/
ImageGlass 地址–
]]>🍭可以去我的网盘看看
🎈还有什么要补冲的请留言,后续会慢慢加上
配置 Git 本地代理
Git 同时支持 Socket5 和 HTTP 代理,根据本地客户端具体情况选择一种配置就可以了
Git 默认的 Socket5 代理应设置为:(其中 server 是服务器地址,port是代理端口)
1 | git config --global http.proxy socks5://server:port |
本地服务器的 IPV4 地址就是:127.0.0.1,端口填上面 Clash 中的 Socket5 代理端口
以我的本地代理端口为例,在 Git bash/Windows 终端下输入下面命令回车
1 | $ git config --global http.proxy socks5://127.0.0.1:7891 |
Socket5 代理设置完成
Git 默认的 HTTP 代理应设置为:(其中 server 是服务器地址,port是代理端口)
1 | $ git config --global http.proxy http://server:port |
本地服务器的 IPV4 地址就是:127.0.0.1,端口填上面 Clash 中的 HTTP 代理端口
以我的本地代理端口为例,在 Git bash/Windows 终端下输入下面命令回车
1 | $ git config --global http.proxy http://127.0.0.1:7890 |
✅Git 和 Node.js 的正确安装后你就可以在本地安装 Hexo 了,😉以下命令均在 Git Bash 里面进行。
全局安装Hexo(半墙状态,需要代理&安装淘宝镜像cnpm)
1 | npm install -g cnpm --registry=https://registry.npm.taobao.org |
初始化Hexo
{新建的博客文件夹下进行,如:hexo
}
1 | hexo init hexo |
在 hexo 目录内右键打开 Git Bash,使用 NPM 安装必须的依赖:
1 | npm install |
关联 USERname.github.io仓库 、、
1 | git config --global user.name "username" # username是你的Github用户名,注意大小写保持一致 |
1 | ssh -T git@github.com |
此部分只是大致说明,具体请查看官方文档----(太懒了不想写了😪)
Hexo主题下载如:butterfly
1 | git clone -b master https://github.com/jerryc127/hexo-theme-butterfly.git themes/butterfly |
主题渲染插件
1 | npm install hexo-renderer-pug hexo-renderer-stylus --save |
Git 推送插件
1 | npm install hexo-deployer-git --save |
音乐播放器插件
1 | npm install hexo-tag-aplayer --save |
哔哩哔哩追番页面生成插件
1 | npm install hexo-bilibili-bangumi --save |
RSS 生成插件
1 | npm install hexo-generator-feed --save |
文章置顶插件
1 | npm uninstall hexo-generator-index --save |
本地搜索插件
1 | npm install hexo-generator-search --save |
字数统计插件
1 | npm install hexo-wordcount --save |
永久链接生成插件
1 | npm install hexo-abbrlink --save |
百度 Sitemap 生成插件
1 | npm install hexo-generator-baidu-sitemap@0.1.4 --save |
百度主动推送插件
1 | npm install hexo-baidu-url-submit --save |
SiteMap 生成插件
1 | npm install hexo-generator-sitemap --save |
1 | # RSS订阅支持 |
微博图片显示
1 | <meta name="referrer" content="no-referrer" /> |
星星跟随鼠标
1 | <script src="https://cdn.jsdelivr.net/gh/sviptzk/HexoStaticFile@latest/Hexo/js/mouse_snow.min.js"></script> |
comments-Valine博主代码修改
1 | https://cdn.jsdelivr.net/gh/HCLonely/Valine@latest/dist/Valine.min.js |
看板娘把萌萌哒的看板娘抱回家
1 | <script src="https://cdn.jsdelivr.net/gh/stevenjoezhang/live2d-widget@latest/autoload.js"></script> |
看板娘插件传送门👉
生成自己的sitemap文件
1 | npm install hexo-generator-sitemap --save |
1 | npm install -g nativefier |
每天自动登陆听完300首歌
每天自动向你的微信推送听歌任务进度
这个项目分为Python客户端和API接口(服务器)支持了云函数,一共两个项目,各有三种部署方法。Python项目的部署最简单的是云函数法,API项目的部署最简单的是直接复制项目法。
使用github actions 每天自动打卡签到
一个轻量级、多平台、多种网盘的文件目录索引和管理工具。
支持onedrive 国际版/世纪互联版/无全局管理员版 &google drive v3API/goindex兼容接口 & coding 团队网盘 & 本机文件系统 & webdav(dev) & 自定义链接
2020-08-19 12:06:03
梦想在远方,只要你肯付出十几年的代价,或许你喜欢的人就近在眼前了。
Dreams are far away, as long as you are willing to pay the price of more than ten years, maybe the person you like is near your eyes.
我看见一道光,收了春华与秋实,夏繁与冬盛,最终藏在你眼里
没有谁的生活会一直完美,但无论什么时候都要眼看前方,满怀希望就会所向披靡。-—巫哲《撒野》
春风十里,五十里,一百里,体测八百米,海底两万里,德芙巧克力,香草味八喜,可可布朗尼,榴莲菠萝蜜,芝士玉米粒,鸡汁土豆泥,黑椒牛里脊,黄焖辣子鸡,红烧排骨酱醋鱼,不如你,全都不如你。
天空是蓝色的,太阳是黄色的,大地是棕色的,海洋是蓝色的,草是绿色的,鲜花是五颜六色的,心跳是红色的??而你是属于我世界的颜色
岁月染上的霜雪。光音踟蹰之后,经年里一成不变的,不是流年里的花开花落,也不是月色下的悲欢离合。经年流逝后,依旧没有改变的,是此间温暖而诚实的对白,亦如那句我喜欢你。——《愿你被世界温柔以待》
我见过春日夏风,秋叶冬雪;也踏遍南水北山,东麓西岭;可这四季春秋,苍山泱水;都不及你,冲我展眉一笑。
现在总是含着过去的明亮碎片,过去破碎到无法修补,却总也不会完全消亡。——唐娜·塔特《金翅雀》
一件东西,身价再高也不是性命。万物有灵,生命可贵,生命里的心情更加可贵。——崔曼莉
许多东西未必需要喜欢,阅读游历,其实也不为都记下来,只是留个印象,在心里生根。日后触景生情,总会懂的。——张佳玮
过韧性的生活虽然最好,但终究还是为了有所作为,而不是把韧性本身当成目的。——伍国
我们一生不过是清醒地穿过梦境,每个人只不过是岁月的一个幽灵。——弗朗茨·卡夫卡
无人与我立黄昏,无人问我粥可温,
17:06 2020年7月20日, 星期一
你为什么要努力,因为我喜欢的人都很优秀,我喜欢的东西都很贵,我想去的地方都很远。
让人舒服的是“人气”,或是“市井”气,我很喜欢它们,觉得这才是生活原来的样子。——流沙
忙碌的现代人总是向外追求幸福快乐的人生,却不知幸福快乐原是不假外求。——何健平
没有探究细节的好奇心,对一切都是漠然置之的态度,实际上也是一种自我的边缘化。——陶琦
希望和回忆育有一女,名唤艺术,她的居所远离人类用树杈高悬袍衫充当战旗的绝望之地。——威廉·巴特勒·叶芝《凯尔特的薄暮》
生活的目的就是生活本身。生活的本质即表面。生活的意义就是不需要意义。——詹姆斯·索特《光年》
只有我们睁开眼睛醒过来的时候,黎明才会到来。 ——梭罗《瓦尔登湖》
我年轻过,落魄过,幸福过,我对生活一往情深。——马尔克斯《活着为了讲述》
人不可以太倔强,活在世界上,一方面需要认真,有时候只能无所谓。——汪曾祺
相爱的人们也只是在黑暗中并肩行走,所能做到的仅是各自努力追求心中的光明,并互相感受到这种努力,互相鼓励。——周国平
人之为学,不日进则日退。——顾炎武
人的头脑越空虚,就越不愿意填满它,这是不受普遍规律支配的唯一例外。——陀思妥耶夫斯基《鳄鱼》
好东西不一定贵,平淡的东西也自有滋味。——林清玄
生活安逸时会做出绝望的诗,生活窘迫时会不断写出生的喜悦。——太宰治《叶》
幸福是一种心灵的振颤。它像会倾听音乐的耳朵一样,需要不断地训练。——毕淑敏
等待的未必能获得,而未曾等待的不速之客却飞快来到,而且绝对驱不走,避不开。——吴冠中
没有哪一次巨大的历史灾难不是以历史的进步为补偿的。——恩格斯
只有当你深入了解一个人的内心,站在他的立场上看待问题时,你才能真正理解他。——哈珀·李
幸福也不长驻,有时天气太冷,火生不起来,是让人着急的,只好拿着冰雪用手慢慢让它融化,边融边听。——林清玄
吃的关系微而妙。分一份美食,给谁不给谁,或者,请谁不请谁,都有讲究,轮廓理清,不能怠慢和遗忘。
曲雪中悍刀行,不关刀剑只关情。
西北有雏凤,单衣出北凉,
身旁唯有那缺门牙老黄,发配三千里,不知何日能返乡。
每逢遭难时,高喊风紧扯呼莫惊慌。
待到归来日,提刀上武当,听闻掌教王重楼,曾两指断大江。
大黄庭,长生莲,剑九六千里,去那武帝城头上,八百义从再出凉。
羊皮裘,木牛马,剑招或剑罡,两袖青蛇尽锋芒,剑开天门谁能挡?
勾心斗角靖安王,一刀卸甲芦苇荡。
行至徽山雪坪上,敬城撼昆仑,方知蚍蜉撼大树,可敬不自量!
孤身入北莽,峡谷入金刚。
春雷一刀仙人跪,春秋一剑守敦煌,为那一颗好头颅,拼的两鬓尽苍茫。
杀病虎,斩人猫,再败神武城中一头老天象。
山河庙堂皆退散,九楼之上览风光,可终究对不起,那弹琵琶的小姑娘。
武帝城里武帝出,北凉境内北凉王,呵呵一声响,王仙芝也死在我手上!
抗天雷,斩莽龙,转战千里抖威风。
太安城里战曹邓,钦天监内杀仙翁。
风雪龙骑下广陵,不需来世认酒窝。
可怜我,西北境内一藩王,武评宗师无人挡,到头来,可知为谁辛苦为谁忙?
不为那赵家天子守国门,只为那吾心安处即吾乡。
待到那,凉州城里天气凉,我便在,洛阳城里观落阳。