• Python


    环境配置

    版本查看

    正常情况下 linux mac os 默认安装python2环境,使用以下命令查看版本号

    python -V

    python3 -V

    Python 3.0 于2008年12月3日正式发布,但python2和python3互不兼容,Python 2.7 于 2020 年 4 月 停止维护!由于历史遗留问题 目前仍有大量代码没有迁移到python3

    安装

    Mac OS brew install python3

    Linux apt install python3 apt-get install python3 .....

    Windows 官网下载安装包>安装> 配置环境变量

    使用

    进入Python shell

    交互式 Python python3

    交互式编程常用于数据分析等领域 jupyter notebook

    文件式 python 程序.py python3 程序.py

    模块安装

    正常情况下 安装python后会自带pip包管理器 如果没有可以使用以下命令安装

    brew install python3-pip

    pip install 模块名 pip3 install 模块名

    requests 第三方网络请求模块

    pip install requests

    代码规范

    js
    //写法1
    function	getList(id){
      if (id == 1){
    			console.log('小明');    
      }else{
        	console.log('张三');   
      }
    },
      
    //写法2
    function	getList(id){
      if (id == 1){console.log('小明');}else{console.log('张三');}
    },
      
    //写法3
    function	getList(id){if (id == 1){console.log('小明');}else{console.log('张三');}},
    
    python
    #通过缩进来区分代码块
    #代码结尾不能加分号
    #代码块不能使用
    
    def getList(id):
        if id == 1:
            print('小明')
        else:
            print('张三')
        
    

    爬虫

    简介

    网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。

    功能

    按照一定地规则获取数据,资源等

    工作流程
    graph TB 请求页面-->定位资源-->获取资源-->请求页面 获取资源-->整理资源-->存储资源

    爬虫的原理非常简单主要难点在于请求页面定位资源

    请求页面可能遇到各种反爬机制

    常见的反爬机制

    请求时间间隔较短 短时间内大量请求会触发反爬机制 一般不会一直存在,增加延时可解决 常见于小说网站,短信验证码等

    浏览器UA验证 每个浏览器打开页面都有UA标识,特殊浏览器可能会自定义UA标示,例如微信内置浏览器,服务端可能会根据UA来验证你的浏览器及设备返回不同页面

    referer 验证请求来自那个url

    ip限制 爬虫运行一段时间后有被发现后封禁ip风险,可用ip代理解决

    自定义验证 请求时携带一个由时间戳+自定义信息生成的字段服务端验证请求的时效性

    定位资源

    常用的定位资源方式有以下几种

    正则表达式 通过正则表达式匹配出固定格式的资源链接等

    **bs4 **Beautiful Soup 4 是一个可以从HTML或XML文件中提取数据的Python库

    html='''
    <div class="panel">
        <div class="panel-heading">
            <h4>Hello</h4>
        </div>
        <div class="panel-body">
            <ul class="list" id="list-1">
                <li class="element">Foo</li>
                <li class="element">Bar</li>
                <li class="element">Jay</li>
            </ul>
            <ul class="list list-small" id="list-2">
                <li class="element">Foo</li>
                <li class="element">Bar</li>
            </ul>
        </div>
    </div>
    '''
    
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html, 'lxml')
    print(soup.find_all(name='ul'))
    print(type(soup.find_all(name='ul')[0]))
    
    
    输出:
    [<ul class="list" id="list-1">
    <li class="element">Foo</li>
    <li class="element">Bar</li>
    <li class="element">Jay</li>
    </ul>, <ul class="list list-small" id="list-2">
    <li class="element">Foo</li>
    <li class="element">Bar</li>
    </ul>]
    
    

    xpath XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言

    xpath是一种通用的元素定位方式,通用性类似正则表达式,能够在各种标记语言中定位元素及属性

    xpath语法

    第一个爬虫
    import requests
    #导入第三方请求库
    from lxml import etree
    #导入lxml库
    
    def get_info(text):
        html = etree.HTML(text)
        #初始化html对象
        title_list = html.xpath('//*[@id="mainContent"]/div/div[*]/div[2]/a/span/text()')
        #搜索节点
        url_list = html.xpath('//*[@id="mainContent"]/div/div[*]/div[2]/a/@href')
        for i in title_list:
            print(str(i))
            #打印标题
        for url in url_list:
            #打印链接
            print(url)
            
    def request(url):
        req = requests.get(url)
        if req.status_code == 200:
            get_info(req.text)
        else:
            print(req.status_code)
    
    
    url = 'https://www.cnblogs.com/WXGC-yang/default.html?page=1'
    #程序入口
    request(url)
    #请求开始
    

    测试工具selenium Web测试

    简介

    seleniumSelenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。

    配置

    安装Google chrome浏览器 正式版

    根据浏览器版本号安装driver

    解压后放入 /usr/bin/目录下

    安装selenium

    pip install selenium

    测试登陆
    from selenium import webdriver
    import time
    # 导入time模块 官方模块无需安装
    
    def login(mobile, passwd, sleep_time=1):
        wd = webdriver.Chrome()
        # 初始化浏览器
        wd.maximize_window()
        # 最大化窗口
        wd.get("https://gitee.com/")
        # 打开页面
        time.sleep(sleep_time)
        # 延时
        wd.find_element_by_xpath('//*[@id="git-nav-user-bar"]/a[1]').click()
        # 通过xpath定位按钮并点击
        time.sleep(sleep_time)
        wd.find_element_by_xpath('//*[@id="user_login"]').send_keys(mobile)
        # xpath定位input输入手机号
        time.sleep(sleep_time)
        wd.find_element_by_xpath('//*[@id="user_password"]').send_keys(passwd)
        # xpath定位input输入密码
        time.sleep(sleep_time)
        wd.find_element_by_xpath('//*[@id="new_user"]/div[2]/div/div/div[4]/input').click()
        # xpath定位登陆按钮并点击
        time.sleep(sleep_time)
        text = wd.find_element_by_xpath(
            '//*[@id="rc-users__container"]/div[1]/div[2]/div/div[1]/div[1]/div[1]/div[1]/strong/a').text
        print(text)
    
    
    if __name__ == '__main__':
        mobile = '15095111275'
        passwd = 'Yy230147961'
        login(mobile, passwd)
        # 调用login方法
        time.sleep(5)
        # 延时5秒后下一步
    
    
    

    pillow 图像处理

    简介

    PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了。PIL功能非常强大,但API却非常简单易用。由于PIL仅支持到Python 2.7,加上年久失修,于是一群志愿者在PIL的基础上创建了兼容的版本,名字叫Pillow,支持最新Python 3.x,又加入了许多新特性,

    安装

    pip install pillow

    对比两张图片 画出差异
    from PIL import Image
    
    img1 = Image.open('./1.png')
    # 解析图片1实例
    img2 = Image.open('./2.png')
    # 解析图片2实例
    width = img1.size[0]
    # 获取图片宽度
    height = img1.size[1]
    # 获取图片高度
    obj_p1 = img1.load()
    # 读取p1像素颜色
    obj_p2 = img2.load()
    # 读取p2像素颜色
    print(obj_p2[0, 0])
    # 打印 x=1 y=2 坐标的像素
    p_list = []
    # 新建差异点列表
    difference = 40
    # 差异阈值
    for x in range(0, width):
        # 遍历x轴
        for y in range(0, height):
            # 遍历y轴
            if obj_p1[x,y] != obj_p2[x,y]:
            # 对比图1与图2同一个坐标像素是否相同
            # if abs(obj_p1[x, y][0] - obj_p2[x, y][0]) > difference and abs(obj_p1[x, y][1] - obj_p2[x, y][1]) > difference and abs(obj_p1[x, y][2] - obj_p2[x, y][2]) > difference:
            # 优化版本 分别对比两个点 rgb颜色差异的绝对值 是否小于差异阈值
                p_list.append([x, y])
                # 记录差异点
    new_img = Image.new('RGBA', (width, height), (255, 255, 255, 255))
    # 新建使用图1的宽高创建新图片实例
    new_img_p = new_img.load()
    # 读取新图片像素
    for i in p_list:
        # 遍历差异点列表
        new_img_p[i[0],i[1]] = (0, 0, 0)
        # 在新图片设置差异点颜色为黑
    # 创建新图片实例
    new_img.save('./new_img.png')
    # 保持新图片
    
    

    极验 滑动验证码

    from selenium import webdriver
    from selenium.webdriver import ActionChains
    import time
    from PIL import Image
    
    color_num = 40
    dian_num = 10
    
    
    def main():
        wd = webdriver.Chrome()
        wd.get('https://www.geetest.com/Register')
        wd.maximize_window()
        # 打开页面
        wd.find_element_by_xpath(
            '//*[@id="gt-register-mobile"]/div/div[2]/div[1]/div[2]/div/div[2]/div[1]/input').send_keys('15095111275')
        # 定位输入框填入手机号
        wd.find_element_by_xpath(
            '//*[@id="gt-register-mobile"]/div/div[2]/div[1]/div[2]/div/div[2]/div[2]/div[1]/div').click()
        # 定位按钮点击
        time.sleep(2)
        # 延时2秒等待动画完成
        get_png(wd, '/html/body/div[3]/div[2]/div[6]/div/div[1]/div[1]/div/a/div[1]/div/canvas[2]', '1.png')
        # 截取第一张图片
        run_js = js_script(wd, '/html/body/div[3]/div[2]/div[6]/div/div[1]/div[1]/div/a/div[1]/canvas')
        # 注入js修改元素属性
        if run_js:
            # 验证修改是否成功
            get_png(wd, '/html/body/div[3]/div[2]/div[6]/div/div[1]/div[1]/div/a/div[1]/canvas', '2.png')
            # 截取第二张图片
        left = get_img_obj('1.png', '2.png')
        # 获取偏移量
        slider = wd.find_element_by_xpath('/html/body/div[3]/div[2]/div[6]/div/div[1]/div[2]/div[2]')
        # 获取滑动手柄
        ActionChains(wd).click_and_hold(slider).perform()
        # 鼠标按下
        track = get_track(left)
        for x in track:
            ActionChains(wd).move_by_offset(xoffset=x, yoffset=0).perform()
            # 鼠标移动
        ActionChains(wd).release().perform()
        # 鼠标松开
    
    
    def js_script(wd, xpath):
        # 调用js命令设置元素属性
        try:
            # 异常捕获 出现异常走 except
            code = "document.evaluate('{}',document,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue.style.display = 'block'".format(
                xpath)
            # 生成js代码
            wd.execute_script(code)
            # 注入js展示原图
            return True
        except:
            return False
    
    
    def get_png(wd, xpath, file_name):
        wd.find_element_by_xpath(xpath).screenshot(file_name)
        # 定位元素 截图
    
    
    def get_img_obj(file_path1, file_path2):
        img1 = Image.open(file_path1)
        img2 = Image.open(file_path2)
        # 读取图片
        w = img1.size[0]
        h = img1.size[1]
        # 获取宽高
        list = []
        for x in range(w):
            for y in range(h):
                info = is_pixel_equal(img1, img2, x, y)
                if info:
                    list.append(info)
        # 获取所有差异点数组
        left = get_dian(list)
    
        save_img(w, h, list)
        return left
    
    
    def is_pixel_equal(image1, image2, x, y):
        p1 = image1.load()[x, y]
        p2 = image2.load()[x, y]
        threshold = color_num
        # 颜色差距
        if abs(p1[0] - p2[0]) > threshold and abs(p1[1] - p2[1]) > threshold and abs(p1[1] - p2[1]) > threshold:
            return [x, y]
    
    
    def get_index(file_path, x, y):
        img = Image.open(file_path, mode='r')
        rgb_img = img.load()
        index = rgb_img[x, y]
        return index
    
    
    def save_img(w, h, list):
        # 获取宽高差异点列表 生成差异图
        img = Image.new('RGB', (w, h), (255, 255, 255))
        pixels = img.load()
        for i in list:
            pixels[i[0], i[1]] = (0, 0, 0)
        img.save('差异图.png')
    
    
    def get_track(left):
        arr = []
        num = 0
        for i in range(left):
            if num + i < left:
                arr.append(i)
                num += i
            else:
                break
        arr.append(left - num)
        return arr[::-1]
        # 返回倒序
    
    
    def get_dian(arr):
        # 统计所有点坐标 筛选出现次数较多的点 计算出
        key_num = {}
        for i in arr:
            if not key_num.get(i[0]):
                key_num[i[0]] = 1
            else:
                key_num[i[0]] += 1
        x_list = []
        for key in key_num:
            if key_num[key] > dian_num:
                x_list.append(key)
        bock1 = []
        for j in x_list:
            if len(bock1) != 0:
                if abs(bock1[-1] - j) < 10:
                    bock1.append(j)
            else:
                bock1.append(j)
        bock2 = list(set(x_list).difference(set(bock1)))
        bock1 = sorted(bock1)
        bock2 = sorted(bock2)
        x = bock2[-1] - bock1[-1]
        return x
    
    
    if __name__ == '__main__':
        try:
            main()
        except:
            main()
        time.sleep(5)
    
    
  • 相关阅读:
    Binary Tree Level Order Traversal II
    图和图的遍历算法
    Remove Duplicates from Sorted List
    Binary Tree Preorder Traversal
    Merge Sorted Array
    [POJ2774][codevs3160]Long Long Message
    [BZOJ2251][2010Beijing Wc]外星联络
    [BZOJ1692][Usaco2007 Dec]队列变换
    [BZOJ1717][Usaco2006 Dec]Milk Patterns 产奶的模式
    [BZOJ1131][POI2008]Sta
  • 原文地址:https://www.cnblogs.com/WXGC-yang/p/13585822.html
Copyright © 2020-2023  润新知