python脚本写法

25 年 3 月 11 日 星期二
1075 字
6 分钟

python脚本写法

这里并不注重于一些比较专门的用法,大部分介绍的是这些用法的前置知识,当然会有所提及

是我的python基础太差了才需要这篇blog的

what you need

  • 大佬不必看
  • 你需要有浏览器引擎
  • 了解命令行有python环境(Anaconda)
  • 有偷懒的需求

字符串操作

当时逃课了,自己又懒得看QAQ

argparse

首先当然是命令行怎么玩

python
import argparse
def main(args):
    pass
if __name__="__main__":
    paser=argparse.ArgumentParser()#可以加个description
    parser.add_argument('-d','--directory',help='输入目录')
    parser.add_argument('-n','--number',help='输入数字')#require=True,type=int这些条件都可以假如
    args=parser.parse_args()
#运行就是python script.py -d <directory_path> -n <number>

因为是自己用,所以参数的限泛用性可以比较低

抛异常玩玩

python
    try:
        main(args)
    except Exception as e:
        print(f"错误发生: {str(e)}")
        sys.exit(1)

懒得多写,反正给个报错退出就好

文件操作

os库

python
import os

# 路径操作
current_dir = os.getcwd()  # 获取当前目录
os.chdir('/path')          # 切换目录

# 文件操作
os.rename('old.txt', 'new.txt')  # 重命名
os.remove('file.txt')            # 删除文件
os.stat('file.txt')              # 获取文件属性

# 目录操作
os.makedirs('dir1/dir2', exist_ok=True)  # 递归创建目录
os.listdir('.')                          # 列出目录内容

# 路径判断
os.path.exists('/path')        # 路径是否存在
os.path.isfile('file.txt')     # 是否是文件
os.path.isdir('directory')     # 是否是目录
#路径生成
os.path.join('des','name')

pathlib库

python
from pathlib import Path

input_dir = Path(args.directory)
if not input_dir.is_dir():
    raise ValueError("无效目录路径")

# 获取所有.py文件
files = list(input_dir.glob("*.py"))

shutil库

python
import shutil

# 文件复制
shutil.copy('src.txt', 'dst.txt')     # 复制文件
shutil.copy2('src.txt', 'dst.txt')    # 保留元数据

# 目录操作
shutil.copytree('src_dir', 'dst_dir')  # 递归复制目录
shutil.rmtree('directory')             # 递归删除目录
shutil.move('data.csv','C:/数据分析')
# 压缩打包
shutil.make_archive('backup', 'zip', 'src_dir')

批量化处理

遍历!!!批量化处理的关键

python
# 使用os.walk遍历目录树
for root, dirs, files in os.walk('.'):
    for file in files:
        path = os.path.join(root, file)
        if(path.endwith('.csv'))#筛选
        	print(path)

import glob
pdf_files = glob.glob('**/*.pdf', recursive=True)
python
path = '/home/user/docs/report.pdf'

os.path.basename(path)   # 'report.pdf'
os.path.dirname(path)    # '/home/user/docs'
os.path.splitext(path)   #('/home/user/docs/report', '.pdf')
os.path.join('dir', 'sub', 'file.txt')  # 'dir/sub/file.txt'
python
# 批量重命名示例
for filename in os.listdir('.'):
    if filename.endswith('.jpg'):
        new_name = filename.replace(' ', '_').lower()
        os.rename(filename, new_name)

# 使用正则表达式处理文件名
import re

pattern = re.compile(r'(\d{4})-(\d{2})-(\d{2})')
for filename in os.listdir('.'):
    match = pattern.search(filename)
    if match:
        new_name = f"{match.group(1)}{match.group(2)}{match.group(3)}.txt"
        os.rename(filename, new_name)

舒适区操作

tqdm

python
from tqdm import tqdm

with Pool(args.num_processes) as pool:
    results = list(tqdm(pool.imap(safe_run, files), total=len(files)))

正则表达式

我不会

Selenium

获取html

python
from selenuim import webdriver

brower=webdriver.Edge()
brower.get('https://www.taobao.com')
print(browser.page_source)#获取html
browser.close()

查找单个元素

python
input_first = browser.find_element_by_id('q')
input_second = browser.find_element_by_css_selector('#q')
input_third = browser.find_element_by_xpath('//*[@id="q"]')
print(input_first,input_second,input_third)
browser.close()

元素获取:这个应该具体问题具体分析,框架大概是下面这样的,下面这一堆是ai教我的,我也不会

python
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
python
#基本定位方法
# ID
element = driver.find_element(By.ID, 'element-id')
# 类名
element = driver.find_element(By.CLASS_NAME, 'class-name')
# 标签名
element = driver.find_element(By.TAG_NAME, 'div')
# 名称
element = driver.find_element(By.NAME, 'username')
# 链接文本
element = driver.find_element(By.LINK_TEXT, 'Click Here')
# 部分链接文本
element = driver.find_element(By.PARTIAL_LINK_TEXT, 'Click')
#复制
# 单个元素
element = driver.find_element(By.CSS_SELECTOR, 'div.main > input[type="text"]')
# 多个元素
elements = driver.find_elements(By.CSS_SELECTOR, '.item')
#XPath定位
# 绝对路径
element = driver.find_element(By.XPATH, '/html/body/div[1]/form/input')
# 相对路径
element = driver.find_element(By.XPATH, '//input[@name="username"]')
# 包含文本
element = driver.find_element(By.XPATH, '//a[contains(text(), "Login")]')

模拟用户操作

python
# 点击
element.click()
# 输入文本
element.send_keys('text')
# 清除内容
element.clear()
# 获取文本
text = element.text
# 获取属性
value = element.get_attribute('value')
# 鼠标悬停
from selenium.webdriver.common.action_chains import ActionChains
actions = ActionChains(driver)
actions.move_to_element(element).perform()
# 拖放操作
source = driver.find_element(By.ID, 'source')
target = driver.find_element(By.ID, 'target')
actions.drag_and_drop(source, target).perform()
# 键盘操作
from selenium.webdriver.common.keys import Keys
element.send_keys(Keys.CONTROL + 'a')
element.send_keys(Keys.BACKSPACE)

之后再写吧,困了

Scrapy

shell
scrapy startproject mySpider

然后就会有一个文件夹

shell
mySpider/
    scrapy.cfg
    mySpider/
        __init__.py
        items.py
        pipelines.py
        settings.py
        spiders/
            __init__.py
            ...

在spiders自己创建一个python文件,这里是zhihu_spider.py

python
import scrapy
class zhihu_spider(scrapy.Spider):
	name='zhihu_spdier'
    allowed_domains=['xxx.com']#域名
    start_urls=['https://www.xxx.com']
    def parse(self,response):
        for xx in response.css("xxx")#提取每个xxx的信息
        	yield{
                'xxx':xx.css('xxx').get()#xxx的具体信息,用css来解码
            }

配置,在settings.py

python
# 启用日志记录
LOG_ENABLED = True
LOG_LEVEL = 'INFO'

# 设置下载延迟,避免对服务器造成过大压力
DOWNLOAD_DELAY = 1

# 启用User-Agent池
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'

然后就可以运行了

shell
scrapy crawl zhihu_spider

后续一般会把需要的数据导入到csv里面只需要在yield位置修改为pandas或者其他的数据处理的库放入新建的文件就好,创建文件等步骤上文有提及

Playwright

不会,和selenium的想法差不多,还有等待机制,鼠标操作,人机验证等问题,目前不需要,懒得学

下面的链接可以练练手

20个Python 非常实用的自动化脚本 - 虾米哟 - 博客园

文章标题:python脚本写法

文章作者:io-wy

文章链接:https://io-wy.github.io/posts/python%E8%84%9A%E6%9C%AC%E5%86%99%E6%B3%95[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。