环境配置
版本查看
正常情况下 linux mac os 默认安装python2环境,使用以下命令查看版本号
python -V
python3 -V
Python 3.0 于2008年12月3日正式发布,但python2和python3互不兼容,Python 2.7 于 2020 年 4 月 停止维护!由于历史遗留问题 目前仍有大量代码没有迁移到python3
安装
Mac OSbrew 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是一种通用的元素定位方式,通用性类似正则表达式,能够在各种标记语言中定位元素及属性
第一个爬虫
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)