Python
2021-08-03 10:52:07 45 举报
AI智能生成
Python
作者其他创作
大纲/内容
注释
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : ${DATE} ${TIME}
# @Author : ${USER}
# @Email : 874591940@qq.com
# @desc : ...
pip
导出
pip freeze > requirements.txt
导入
pip install -r requirements.txt
设置源
C:/Users/xx
使用指定目录的pip
D:\Application\Python3.7\python.exe -m pip install xxx
安装到当前目录
pip install xx -t ./
打包
pyinstaller -F -w -i xxx.ico xx.py
D:\Application\Python3.7\Scripts\pyinstaller.exe -F xxx.py<br>
ini
configparser
def get_config():<br> """<br> 读取配置文件<br> :return:<br> """<br> config = {}<br> # 读取配置文件<br> cp = configparser.ConfigParser()<br> cp.read('./config.ini', encoding="utf-8")<br> for header in cp.sections():<br> if header not in config:<br> config[header] = {}<br> # 按照键值对形式保存<br> for key, value in cp.items(header):<br> try:<br> # 自动转为整型<br> config[header][key] = int(value)<br> except:<br> config[header][key] = value.strip()<br> return config
office
word
python-docx
import docx<br>doc = docx.Document('1.docx')<br># 查看<br>for i, p in enumerate(doc.paragraphs):<br> print(str(i) + ": " + str(p.text))<br># 修改<br>doc.paragraphs[7].text = '77777'<br>doc.save('2.docx')<br>
docxtpl
from docxtpl import DocxTemplate<br><br>temp = DocxTemplate('1.docx')<br>info = {<br> 'key1': 'value1',<br>}<br>temp.render(info)<br>temp.save('2.docx')
word里要有{{ key1 }}
pandoc
excel
xlrd
import xlrd<br>
# 打开excel<br>excel = xlrd.open_workbook('1.xlsx')<br># 切换到指定工作簿<br>sheet = excel.sheet_by_name(sheet_name)<br># sheet = excel.sheet_by_index(0)<br># 获取列数据<br>data = sheet.col_values(0)<br>
读取
区域
行
sheet.row_values(row) # 从0开始
列
sheet.col_values(col) # 从0开始
单元格
sheet.cell_value(row, col) # 从0开始<br>
openpyxl
import openpyxl<br>from openpyxl.styles import Font, PatternFill, Border, Side, Alignment<br>
# 打开excel<br>excel = openpyxl.load_workbook('1.xlsx')<br># 切换到指定工作簿<br>sheet = excel[sheet_name]<br># 修改<br>sheet['A1'] = '111'<br># 保存<br>sheet.save('2.xlsx')<br>
添加行
sheet.append([...])
修改样式
import openpyxl<br>from openpyxl.styles import Font, PatternFill, Border, Side, Alignment<br><br># 1.打开工作簿<br>wb = openpyxl.load_workbook('1.xlsx')<br>sheet = wb.active<br><br><br>def set_font():<br> """<br> 设置单元格字体样式<br> Font(<br> name=None, # 字体名,可以用字体名字的字符串<br> strike=None, # 删除线,True/False<br> color=None, # 文字颜色<br> size=None, # 字号<br> bold=None, # 加粗, True/False<br> italic=None, # 倾斜,Tue/False<br> underline=None # 下划线, 'singleAccounting', 'double', 'single', 'doubleAccounting'<br> )<br> :return:<br> """<br> font1 = Font(<br> size=20,<br> italic=True,<br> color='ff0000',<br> bold=True,<br> )<br> sheet['A1'] = '11111'<br> sheet['A1'].font = font1<br><br><br>def set_fill_style():<br> """<br> 设置单元格填充样式<br> PatternFill(<br> # 设置填充样式: 'darkGrid', 'darkTrellis', 'darkHorizontal', 'darkGray', 'lightDown', 'lightGray', 'solid', 'lightGrid', 'gray125', 'lightHorizontal', 'lightTrellis', 'darkDown', 'mediumGray', 'gray0625', 'darkUp', 'darkVertical', 'lightVertical', 'lightUp'<br> fill_type=None,<br> # 设置填充颜色<br> start_color=None<br> )<br> :return:<br> """<br> fill = PatternFill(<br> fill_type='solid',<br> start_color='ffff00'<br> )<br> sheet['A1'].fill = fill<br><br><br>def set_align_style():<br> """<br> 设置单元格对齐样式<br> Alignment(<br> horizontal='right', # 水平方向:center, left, right<br> vertical='top' # 垂直方向: center, top, bottom<br> )<br> :return:<br> """<br> al = Alignment(<br> horizontal='center', # 水平方向:center, left, right<br> vertical='center' # 垂直方向: center, top, bottom<br> )<br> sheet['A1'].alignment = al<br><br><br>def set_border_style():<br> """<br> 设置边框样式<br> Side(<br> border_style='thin',<br> color='0000ff'<br> )<br> Border(left=None, right=None, top=None, bottom=None)<br> """<br> side = Side(border_style='thin', color='0000ff')<br> bd = Border(left=side, right=side, top=side, bottom=side)<br> sheet['B2'].border = bd<br><br><br>def set_size():<br> """<br> 设置单元格的宽度和高度<br> :return:<br> """<br> # 设置指定列的高宽度<br> sheet.column_dimensions['A'].width = 20<br> # 设置指定行的高度<br> sheet.row_dimensions[1].height = 45<br><br><br>if __name__ == '__main__':<br> set_font()<br> set_align_style()<br> wb.save('1.xlsx')<br>
系统相关
win32
键盘
import pyperclip<br>import win32api<br>import win32con
剪贴板
# 复制到剪贴板<br>pyperclip.copy(image_path)<br># 粘贴<br>pyperclip.paste()<br>
按键
# ctrl(17) + V(86)<br>win32api.keybd_event(17, 0, 0, 0)<br>win32api.keybd_event(86, 0, 0, 0)<br># 松开按键<br>win32api.keybd_event(86, 0, win32con.KEYEVENTF_KEYUP, 0) <br>win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0)<br>
按键对照表
https://www.cnblogs.com/q455674496/p/13690871.html
鼠标
监听
#!/usr/bin/env python<br># -*- coding: utf-8 -*-<br># @Time : 2021/7/25 15:05<br># @Author : YXH<br># @Email : 874591940@qq.com<br># @desc : ...<br><br># from pynput.keyboard import Listener<br>#<br>#<br># def press(key):<br># try:<br># print(key.char)<br># except Exception as e:<br># print(key, e)<br>#<br>#<br># with Listener(on_press=press) as listener:<br># listener.join()<br><br>import time<br>import pythoncom<br>import PyHook3<br><br>import win32gui<br>import win32process<br>import psutil<br><br>from ctypes import *<br>import win32clipboard<br><br>user32 = windll.user32<br>kernel32 = windll.kernel32<br>psapi = windll.psapi<br>current_window = None<br><br><br>def on_mouse_listener(event):<br> """<br> 鼠标点击监听事件<br> :param event: 事件对象<br> :type event: PyHook3.HookManager.MouseEvent<br> :return:<br> :rtype: bool<br> """<br> info = {<br> 'messageName': event.MessageName, # 事件名称,例如:mouse left down,mouse right down<br> 'message': event.Message, # windows消息常量,例如:左键513,右键516<br> 'time': event.Time, # 事件发生的时间戳,该时间戳:系统已启动的时间<br> 'timeStr': time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), # 事件发生的时间戳<br> 'window': event.Window, # 窗口句柄<br> 'windowName': event.WindowName, # 窗口标题<br> 'position': event.Position, # 事件发生时相对于整个屏幕的坐标<br> 'wheel': event.Wheel, # 鼠标滚轮<br> 'injected': event.Injected, # 判断这个事件是否由程序方式生成,而不是正常的人为触发。<br> 'visiable': win32gui.IsWindowVisible(event.Window), # 窗口是否可见<br> 'enable': win32gui.IsWindowEnabled(event.Window) # 窗口是否可用<br> }<br> print(info)<br> print(get_process_info(info['window']))<br> print(get_process_info2())<br> print('-' * 100)<br> return True<br><br><br>def on_keyboard_listener(event):<br> """<br> 键盘按下监听事件<br> :param event: 事件对象<br> :type event: PyHook3.HookManager.KeyboardEvent<br> :return:<br> :rtype: bool<br> """<br> info = {<br> 'messageName': event.MessageName, # 同上,共同属性不再赘述<br> 'message': event.Message, # windows消息常量,例如:A键256<br> 'time': event.Time, # 事件发生的时间戳,该时间戳:系统已启动的时间<br> 'timeStr': time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), # 事件发生的时间戳<br> 'window': event.Window, # 窗口句柄<br> 'windowName': event.WindowName, # 窗口名称<br> # 有大小写,根据实际输入的字符<br> 'ascii': event.Ascii, # 按键的ASCII码,例如:97(a键),65(A键)<br> 'ascii_chr': chr(event.Ascii), # ASCII码对应的字符,例如:a键(97),A键(65)<br> # 没有大小写,根据键盘的名称<br> 'key': event.Key, # 按键的名称,例如:A键(65)<br> 'keyID': event.KeyID, # 按键的虚拟键值,例如:65(A键)<br> 'scanCode': event.ScanCode, # 按键扫描码<br> 'extended': event.Extended, # 判断是否为增强键盘的扩展键<br> 'injected': event.Injected,<br> 'alt': event.Alt, # 是某同时按下Alt<br> 'transition': event.Transition, # 判断转换状态<br> 'visiable': win32gui.IsWindowVisible(event.Window), # 窗口是否可见<br> 'enable': win32gui.IsWindowEnabled(event.Window) # 窗口是否可用<br> }<br> global current_window<br> # 检查目标是否切换了窗口<br> if event.WindowName != current_window:<br> print('前一个窗口:{};当前窗口:{},可见:{},可用:{}'.format(current_window,<br> event.WindowName,<br> win32gui.IsWindowVisible(event.Window),<br> 11))<br> current_window = event.WindowName<br> # 普通按键<br> if 32 < event.Ascii < 127:<br> print('普通按键:按下了{}键,符号为:{}'.format(event.Key, chr(event.Ascii)))<br> # 特殊按键<br> else:<br> # 如果是CTRL+V,则获取剪贴板内容<br> if event.Key == 'v':<br> win32clipboard.OpenClipboard()<br> pasted_value = win32clipboard.GetClipboardData()<br> win32clipboard.CloseClipboard()<br> print('粘贴板内容为:{}'.format(pasted_value))<br> # 换行<br> elif event.Key == 'Tab':<br> print('特殊按键:按下了换行键')<br> # 回车<br> elif event.Key == 'Return':<br> print('特殊按键:按下了回车键')<br> # Backspace<br> elif event.Key == 'Back':<br> print('特殊按键:按下了回退键')<br> # Delete<br> elif event.Key == 'Delete':<br> print('特殊按键:按下了删除键')<br> # Insert<br> elif event.Key == 'Insert':<br> print('特殊按键:按下了插入键')<br> else:<br> print('特殊按键:按下了{}键'.format(event.Key))<br> print(info)<br> print(get_process_info(info['window']))<br> print(get_process_info2())<br> print('-' * 100)<br> return True<br><br><br>def get_process_info(window_id):<br> """<br> 根据窗口句柄id获取窗口进程信息<br> :param window_id: 窗口句柄id<br> :type window_id: int<br> :return: 窗口进程信息<br> :rtype: dict<br> """<br> thread_id, process_id = win32process.GetWindowThreadProcessId(window_id)<br> process = psutil.Process(process_id)<br> return {<br> 'thread_id': thread_id,<br> 'process_id': process_id,<br> 'process_name': process.name(),<br> 'window_name': win32gui.GetWindowText(window_id),<br> }<br><br><br>def get_process_info2():<br> """<br> 获取当前进程的相关信息<br> :return:<br> """<br> # 获取最上层的窗口句柄<br> hwnd = user32.GetForegroundWindow() # 获得前台窗口句柄<br> pid = c_ulong(0)<br> user32.GetWindowThreadProcessId(hwnd, byref(pid))<br> process_id = "%d" % pid.value<br> # 申请内存<br> executable = create_string_buffer(1024)<br> h_process = kernel32.OpenProcess(0x400 | 0x10, False, pid)<br> psapi.GetModuleBaseNameA(h_process, None, byref(executable), 512) # 获得进程名<br> # 读取窗口标题<br> window_title = create_string_buffer(512)<br> # length = user32.GetWindowTextA(hwnd, byref(window_title), 512) # 获得窗口名<br> # 关闭handles<br> kernel32.CloseHandle(hwnd)<br> kernel32.CloseHandle(h_process)<br> return {<br> 'process_id': process_id,<br> 'process_name': executable.value.decode('gbk'),<br> 'window_name': window_title.value.decode('gbk')<br> }<br><br><br>def run():<br> # 创建构造函数管理器<br> hm = PyHook3.HookManager()<br> # 鼠标事件:<br> # MouseAll<br> # MouseAllButtons<br> # MouseAllButtonsUp<br> # MouseAllButtonsDown<br> # MouseAllButtonsDbl<br> # MouseWheel<br> # MouseMove<br> # MouseLeftUp<br> # MouseLeftDown<br> # MouseLeftDbl<br> # MouseRightUp<br> # MouseRightDown<br> # MouseRightDbl<br> # MouseMiddleUp<br> # MouseMiddleDown<br> # MouseMiddleDbl<br> # 键盘事件:<br> # KeyUp<br> # KeyDown<br> # KeyChar<br> # KeyAll<br> # 绑定鼠标、键盘监听事件的回调函数<br> hm.MouseAllButtonsDown = on_mouse_listener<br> hm.KeyDown = on_keyboard_listener<br> # 设置鼠标、键盘钩子<br> hm.HookMouse()<br> hm.HookKeyboard()<br> # 取消鼠标、键盘钩子<br> # hm.UnhookMouse()<br> # hm.UnhookKeyboard()<br> # 循环监听<br> pythoncom.PumpMessages()<br><br><br>if __name__ == '__main__':<br> run()<br>
文件
删除文件
import os<br>os.remove(path) # 这个路径是一个文件夹,则会抛出OSError的错误<br>
import os<br>os.unlink(path) # unlink的功能和remove一样是删除一个文件,但是删除一个删除一个正在使用的文件会报错。
删除文件夹
import os<br>os.rmdir(path) # 文件夹需要时空的才能被删除<br>
递归删除
import shutil<br>shutil.rmtree(path)
import os<br>os.removedirs(path) # 递归地删除目录。如果子目录成功被删除,则将会成功删除父目录,子目录没成功删除,将抛异常。
selenium
from selenium.webdriver import Chrome, ChromeOptions<br>from selenium.webdriver.support.wait import WebDriverWait<br>from selenium.webdriver.common.by import By<br>from selenium.webdriver.support import expected_conditions as ec<br>
删除运行时的cmd界面
修改\Lib\site-packages\selenium\webdriver\common\service.py<br>
将<br>from subprocess import PIPE<br>修改为<br>from subprocess import PIPE,CREATE_NO_WINDOW<br>
将<br>self.process = subprocess.Popen(cmd, env=self.env,<br> close_fds=platform.system() != 'Windows',<br> stdout=self.log_file,<br> stderr=self.log_file,<br> stdin=PIPE)<br>修改为<br>self.process = subprocess.Popen(cmd, env=self.env,<br> close_fds=platform.system() != 'Windows',<br> stdout=self.log_file,<br> stderr=self.log_file,<br> stdin=PIPE, creationflags=CREATE_NO_WINDOW)<br>
地址栏
about:version - 显示当前版本<br>about:memory - 显示本机浏览器内存使用状况<br>about:plugins - 显示已安装插件<br>about:histograms - 显示历史记录<br>about:dns - 显示DNS状态<br>about:cache - 显示缓存页面<br>about:gpu -是否有硬件加速<br>chrome://extensions/ - 查看已经安装的扩展<br>
添加启动参数
options = ChromeOptions()<br># 接管已打开的浏览器<br># chrome.exe --remote-debugging-port=9222<br># options.add_experimental_option('debuggerAddress', '127.0.0.1:9222')<br>options.debugger_address('127.0.0.1:9222')<br># 将浏览器数据保存到指定位置<br># chrome.exe --user-data-dir='......'<br># options.add_argument(r'--user-data-dir={}'.format(chrome_data_path))<br># 添加UA<br>options.add_argument(user_agent)<br># 无窗口化<br># options.add_argument('--headless')<br># 指定浏览器分辨率<br># options.add_argument('window-size=1920x3000')<br># 最大化<br>options.add_argument('--start-maximized')<br># 浏览器全屏<br># options.add_argument('start-fullscreen')<br># 谷歌文档提到需要加上这个属性来规避bug<br>options.add_argument('--disable-gpu')<br># 隐藏滚动条, 应对一些特殊页面<br># options.add_argument('--hide-scrollbars')<br># 以最高权限运行<br>options.add_argument('--no-sandbox')<br># 在窗口上不出现‘自动化测试’提示<br>options.add_argument('--disable-infobars')<br># 不加载图片, 提升速度<br># options.add_argument('blink-settings=imagesEnabled=false')<br># 禁用JavaScript<br># options.add_argument("--disable-javascript")<br># 手动指定使用的浏览器位置<br># options.binary_location = chrome_path<br># 代理<br># options.add_argument('--porxy-server=127.0.0.1:8888') # 无认证
# 切换到手机页面
# options.add_experimental_option('mobileEmulation', {'deviceName': 'iPhone 6/7/8'})
# 设置默认下载目录
# options.add_experimental_option('prefs', {'download.default_directory': download_path})
# 设置开发者模式启动,该模式下webdriver属性为正常值
# options.add_experimental_option('excludeSwitches', ['enable-automation'])
# 禁用浏览器弹窗
# options.add_experimental_option('prefs', {'profile.default_content_setting_values': {'notifications': 2}})
添加扩展应用
# 代理<br># options.add_extension(create_proxy_auth_extension('host', 'port', 'user', 'password')) # 有认证<br># 添加crx插件<br># options.add_extension('xx.crx')<br>
代理
background.js
var config = {
mode: "fixed_servers",
rules: {
singleProxy: {
scheme: "http",
host: "mimvp_proxy_host",
port: parseInt(mimvp_proxy_port)
},
bypassList: ["mimvp.com"]
}
};
chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});
function callbackFn(details) {
return {
authCredentials: {
username: "mimvp_username",
password: "mimvp_password"
}
};
}
chrome.webRequest.onAuthRequired.addListener(
callbackFn,
{urls: ["<all_urls>"]},
['blocking']
);
manifest.json
var config = {
mode: "fixed_servers",
rules: {
singleProxy: {
scheme: "http",
host: "mimvp_proxy_host",
port: parseInt(mimvp_proxy_port)
},
bypassList: ["mimvp.com"]
}
};
chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});
function callbackFn(details) {
return {
authCredentials: {
username: "mimvp_username",
password: "mimvp_password"
}
};
}
chrome.webRequest.onAuthRequired.addListener(
callbackFn,
{urls: ["<all_urls>"]},
['blocking']
);
create_proxy_auth_extension.py
import random
import string
import zipfile
def create_proxy_auth_extension(proxy_host, proxy_port, proxy_username, proxy_password, scheme='http',
plugin_path=None):
if plugin_path is None:
plugin_path = r'{}_{}@http-dyn.dobel.com_9020.zip'.format(proxy_username, proxy_password)
manifest_json = """
{
"version": "1.0.0",
"manifest_version": 2,
"name": "Dobel Proxy",
"permissions": [
"proxy",
"tabs",
"unlimitedStorage",
"storage",
"<all_urls>",
"webRequest",
"webRequestBlocking"
],
"background": {
"scripts": ["background.js"]
},
"minimum_chrome_version":"22.0.0"
}
"""
background_js = string.Template(
"""
var config = {
mode: "fixed_servers",
rules: {
singleProxy: {
scheme: "${scheme}",
host: "${host}",
port: parseInt(${port})
},
bypassList: ["foobar.com"]
}
};
chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});
function callbackFn(details) {
return {
authCredentials: {
username: "${username}",
password: "${password}"
}
};
}
chrome.webRequest.onAuthRequired.addListener(
callbackFn,
{urls: ["<all_urls>"]},
['blocking']
);
"""
).substitute(
host=proxy_host,
port=proxy_port,
username=proxy_username,
password=proxy_password,
scheme=scheme,
)
with zipfile.ZipFile(plugin_path, 'w') as zp:
zp.writestr("manifest.json", manifest_json)
zp.writestr("background.js", background_js)
return plugin_path
options.add_extension(create_proxy_auth_extension('host', 'port', 'user', 'password'))
wait
self.wait.until(ec.presence_of_element_located((By.XPATH, partten)))
元素
获取元素
chrome.find_element_by_xpath(partten)
获取属性
element.get_attribute('src')
点击
js点击
chrome.execute_script("arguments[0].click();", element)<br>
普通点击
element.click()
切换iframe
验证码
超级鹰
# 创建超级鹰对象<br>chaojiying = Chaojiying_Client(username, password, softid)<br># 读取验证码<br>image_data = open('1.jpg', 'rb').read()<br># 识别验证码,第二个参数为验证码类型<br>response = chaojiying.PostPic(image_data, 1007)<br># 获取识别的验证码<br>verification_code = response['pic_str']<br><br><br># 若识别错误<br>chaojiying.ReportError(response['pic_id'])<br>
返回的参数类型
{"err_no":0,"err_str":"OK","pic_id":"1662228516102","pic_str":"8vka","md5":"35d5c7f6f53223fbdc5b72783db0c2c0"}
0 条评论
下一页