Python
venv
- 安装
pip install virtualenv
- 创建
python -m venv {myenv}
- myenv 是虚拟环境的名字 (其实是路径)
- 会在路径下创建一个文件夹
- 进入
source /home/trdthg/myproject/bigdata20/venv/bin/activate
- 其实就是执行 venv 下的名字为 activate 的 shell 脚本
- 退出
- 运行
deactivate
- 运行
- 其他虚拟工具
- pipenv
requirements.txt
- 生成项目依赖
- venv
pip3 freeze > requirements.txt
- 注意:如果不是在虚拟环境下执行,会把全局的依赖也加进去
- pipenv
- 略过
- 非虚拟环境 pipreqs
pipreqs /path/to/project
- venv
- 使用 requirements.txt
pip install -r requirements.txt
setup.py
感觉不好用
scrapy
IP 池
docker run --network host --env DB_CONN=redis://:@localhost:6379/0 -p 5010:5010 jhao104/proxy_pool:2.4.0
class ProxyMiddleware(object):
def __init__(self, proxy_url):
self.proxy_url = proxy_url
def get_random_proxy(self):
try:
print("-"*100)
print("请求随机代理")
response = requests.get("http://127.0.0.1:5010/get?type=https")
if response.status_code == 200:
proxy = response.json()['proxy']
return proxy
except requests.ConnectionError:
return False
def process_request(self, request, spider):
if request.meta.get('retry_times'):
proxy = self.get_random_proxy()
if proxy:
uri = f'https://{proxy}'
print(' 使用代理 ' + proxy)
request.meta['proxy'] = uri
@classmethod
def from_crawler(cls, crawler):
settings = crawler.settings
return cls(proxy_url=settings.get('PROXY_URL'))
随机下载延迟
class RandomDelayMiddleware(object):
def __init__(self, delay):
self.delay = delay
@classmethod
def from_crawler(cls, crawler):
delay = crawler.spider.settings.get("RANDOM_DELAY", 10)
if not isinstance(delay, int):
raise ValueError("RANDOM_DELAY need a int")
return cls(delay)
def process_request(self, request, spider):
delay = random.randint(0, self.delay)
print('-'*100)
print("下载延迟:", delay, "秒")
time.sleep(delay)
MicroPython
MicroPython --- esp8266
运行
- 准备项目
- 下载 win10usb-series 的驱动
- 下载基于 ESP8266 的 MicroPython 固件MicroPython 的官网
- 下载串口工具Putty
- 下载烧录工具
- 下载webrepl 客户端
- 烧录连接
- 烧写固件把该固件烧写到 0x0 位置即可。
- 上电打印出现下例表示成功
MicroPython v1.8.6-7-gefd0927 on 2016-11-10; ESP module with ESP8266
Type "help()" for more information.
>>>
::: warning 注意 putty 连接时,若键盘无法输入,尝试设置 (Connection -> Serial -> Flow control = None) :::
连接 WiFi
- 连接
import network
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.scan() # Scan for available access points
sta_if.connect("<wifiname>", "<password>") # Connect to an AP
sta_if.isconnected() # Check for successful connection
- 设置上电自动连接 MicroPython 初始化后都会自动执行 main.py 文件,所以我们只需要设置该文件即可上电自动连接 WiFi。打开自己常用的编辑器,输入下面代码,并保存为 main.py 文件:
# main.py
import network
import webrepl
import time
SSIDs = [("602", "4602yyds")]
def do_connect():
import network
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print('connecting to network...')
wlan.connect(SSIDs[0][0], SSIDs[0][1])
start = time.time()
while not wlan.isconnected():
time.sleep(1)
if time.time()-start > 5:
print("connect timeout!")
break
if wlan.isconnected():
print("successfully connected!")
print('network config:', wlan.ifconfig())
def main():
do_connect()
main()
WebREPL 上传文件
webrepl 是 MicroPython 官方提供的文件管理工具。并且有一个 webrepl 客户端工具,使用它可以通过浏览器来访 ESP8266。
- 初始化 (putty)
import webrepl_setup
- 启动 (putty)
import webrepl
webrepl.start()
- 连接 (webrepl 客户端)
- ESP8266 连接好 WiFi 后,输入 sta_if.ifconfig() 查看连接信息,返回的元组第一个 IP 就是无线路由器分配给 ESP8266 的 IP。
- 如果你的电脑和 ESP8266 在同一个局域网,修改 WebREPL 要连接的地址为 ESP8266 的 IP,点击「Connect」,返回「Welcome to MicroPython!」说明连接成功,根据提示输入密码(密码默认不显示)。回车后显示「WebREPL connected」表示登录成功。
- 之后就可以用这个客户端上传下载文件了。
待续...
Conda
基本操作
# 安装 PYTHON 指定环境
conda create -n $name python=$version
# 列出所有环境
conda env list
# 进入环境
conda activate $name
# 退出环境
conda deactivate $name
# 删除环境
conda env remove -n $name
::: warning 若不进入环境,默认在 base 环境进行所有操作 :::
待续...
模拟输入
PyUserInput
- 安装
- 安装 PyHook: PyHook 找到 PyHook 目录,
找到对应的 python 版本,下载后直接
pip install pyHook‑1.5.1‑cp35‑cp35m‑win_amd64.whl
- 安装 PyUserInput:
pip install PyUserput
- 基本操作
from pymouse import * # 模拟鼠标所使用的包
from pykeyboard import * # 模拟键盘所使用的包
import time # 连续进行两个动作可能太快而效果不明显,因此加入暂停时间
m = PyMouse() # 鼠标的实例 m
k = PyKeyboard() # 键盘的实例 k
x_dim, y_dim = m.screen_size() # 获取屏幕尺寸(一般为电脑屏幕的分辨率,如 1920*1080)
# 估计需要点击的位置坐标(不知道有没有定位代码,我没找到,我是自己估计的。例如,我的电脑屏幕为 (1920,1080),我想要单击的地方估计坐标为 (10,500))
m.move(10, 500) # 将鼠标移动到位(此步可忽略,直接单击也可)
time.sleep(0.5) # 暂停 0.5s,方便观察移动结果
m.click(10, 500, 1, 1) # 表示在 (10, 500) 的地方,单击左键
- 常用函数
k.type_string('Hello, World!') # 模拟键盘输入字符串
k.press_key('H') # 模拟键盘按 H 键
k.release_key('H') # 模拟键盘松开 H 键
k.tap_key("H") # 模拟点击 H 键
k.tap_key('H',n=2,interval=5) # 模拟点击 H 键,2 次,每次间隔 5 秒
k.tap_key(k.function_keys[5]) # 点击功能键 F5
k.tap_key(k.numpad_keys[5],3) # 点击小键盘 5,3 次
- 组合键
k.press_key(k.alt_key) # 按住 alt 键
k.tap_key(k.tab_key) # 点击 tab 键
k.release_key(k.alt_key) # 松开 alt 键
- 常见的键和键值码
字母和数字键 数字小键盘的键 功能键 其它键
键 键码 键 键码 键 键码 键 键码
A 65 0 96 F1 112 Backspace 8
B 66 1 97 F2 113 Tab 9
C 67 2 98 F3 114 Clear 12
D 68 3 99 F4 115 Enter 13
E 69 4 100 F5 116 Shift 16
F 70 5 101 F6 117 Control 17
G 71 6 102 F7 118 Alt 18
H 72 7 103 F8 119 Caps Lock 20
I 73 8 104 F9 120 Esc 27
J 74 9 105 F10 121 Spacebar 32
K 75 * 106 F11 122 Page Up 33
L 76 + 107 F12 123 Page Down 34
M 77 Enter 108 End 35
N 78 - 109 Home 36
O 79 . 110 LeftArrow 37
P 80 / 111 UpArrow 38
Q 81 RightArrow 39
R 82 DownArrow 40
S 83 Insert 45
T 84 Delete 46
U 85 Help 47
V 86 Num Lock 144
W 87
X 88
Y 89
Z 90
0 48
1 49
2 50
3 51
4 52
5 53
6 54
7 55
8 56
9 57
标准库
http.client
- demo 实例
import json
h1 = HTTPConnection('127.0.0.1:7878')
body = json.dumps({"aaa": 1, "bbb": 2, "ccc": "sss"}).encode("utf-8")
h1.request("POST", "/", body=body, headers={"Content-Type": "application/json"})
- 基本流程
--- start ---
|
|===== self.__state = _CS_IDLE
v
HTTPConnection => _create_connect()
|
| socket // 获取连接
| _output // 储存请求字符串
v
request() -> _send_request(method, url, body, headers)
|
|===== self.__state = _CS_REQ_STARTED
v
putrequests(method, url)
|
| self._output.append(method url http-vsn)
v
[ putheaders(hdr, value) for hdr, vale in headers ]
|
| 形成了不带 body 的部分
v
endheaders(body) -> _send_output(body)
|
|===== self.__state = _CS_REQ_STARTED
| self.__state = _CS_REQ_SENT
| send(msg)
| send(body) if body exists
| send(b"0\r\n\r\n")
v
---end---