天天看点

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 = '15011111111'
    passwd = '111111'
    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('15011111111')
    # 定位输入框填入手机号
    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)