python渗透测试安全工具开发锦集
Python安全工具编程基础
第一章 Python在网络安全中的应用
第一节 Python黑客领域的现状
漏扫平台 poc suite
敏感目录
常见文件
常见漏洞扫描
第二节 我们可以用Python做什么
正则表达式 匹配
爬虫 收集 后台、敏感目录文件 数据
效率
在网络上 发送数据 反弹 、木马等
第三节 第一章课程内容总结
pycharm sublime
自动补全 分屏 快捷键
规范 方法函数 小写 类 头字母大写
默认规范
b16 b32 b64 encode decode
将 二进制 转换为 ascii码 加号 与 斜线的 替换 第二个参数
第二章 python安全应用编程入门
第一节 Python正则表达式
python 安全 编程
python 核心编程 知道创宇 python技能表 https://blog.knownsec.com/Knownsec_RD_Checklist/index.html
简单 功能强大
r 原生字符 匹配标题 内容 字符编码
遍历 获取
第二节 Python Web编程
requests
目录扫描
缺陷程序 --> 漏扫 -->识别web 漏洞
登录界面
防爬处理
json格式
第三节 Python多线程
线程进程
thread
threading
queue
第四节 Python网络编程
socket
反弹shell
第五节 Python数据库编程
MySQLdb
数据库 结构
第三章 Python爬虫技术实现
第一节 Python爬虫BeautifulSoup模块的介绍
解析html文件
bugscan 四叶草 hackhttp
BeautifulSoup
re 更 精确 但是 有 None
第二节 Python爬虫hackhttp模块的介绍
第三节 结合BeautifulSoup和hackhttp的爬虫实例
分别抓包 post 内容分析
re 模块 字符串匹配
soup 基于 html 标签 来 匹配
第四节 爬虫多线程
threading 构造类 稳定
初始化 导入生产者模块
Python安全工具编程进阶
Python信息收集工具编写
i春秋\08 Python安全编程\第四章
第一节 高精度字典生成
第二节 WEB目录扫描程序
后台爆破 phpinfo() php环境变量 网站敏感信息泄露 上传地址
多线程类
put到queue
用多线程进行调用 等待结果
取出执行
随机 UA头
加上代理
第三节 C段WEB服务扫描
基础
六种数据类型
1、数组List(列表)
pop ( ) 函数用于列表( list) ,表示移除列表中的一个元素(默认最后一个元素)
# List
l = [1, 2, 3, 4, 5] # 列表
print ( l [0]) # 索引
print ( l [1: 3]) # 切片
for x in l : # 遍历
print ( x)
l.append ( 6) # 添加元素
l.remove ( 2) # 删除元素
l.sort ( ) # 排序
List(列表):由逗号分隔的一组有序的可变的值,用方括号括起来,可以进行切片、索引、遍历、添加、删除、排序等操作。
2、Tuple(元组)
Tuple(元组):由逗号分隔的一组有序的
不可变的值,用圆括号括起来,可以进行切片、索引、遍历等操作。
# Tuple
t = ( 1, 2, 3, 4, 5) # 元组
print ( t [0]) # 索引
print ( t [1: 3]) # 切片
for x in t : # 遍历
print ( x)
3、dict Dictionary(字典)
# Dictionary
d = { "name" : "Bing" , "age" : 10 , "gender" : "male" } # 字典
print ( d [ "name" ] ) # 访问键对应的值
d [ "age" ] = 11 # 添加或修改键值对
del d [ "gender" ] # 删除键值对
for k, v in d. items ( ) : # 遍历键值对
print ( k, v)
修改
dicts[ new_name] = dicts. pop ( old_name)
例子:
dicts = {
"xx" : 1 ,
"zz" : 2 ,
"yy" : 3
}
dicts[ 'yy' ] = dicts. pop ( 'xx' )
print ( dicts)
结果:
{ 'zz' : 2 , 'yy' : 1 }
新增
dicts[ new_name] = value
例子:
dicts = {
"xx" : 1 ,
"zz" : 2 ,
"yy" : 3
}
dicts[ "aa" ] = 4
print ( dicts)
结果:
{ 'xx' : 1 , 'zz' : 2 , 'yy' : 3 , 'aa' : 4 }
删除
del dicts[ del_name]
例子:
dicts = {
"xx" : 1 ,
"zz" : 2 ,
"yy" : 3
}
del dicts[ 'xx' ]
print ( dicts)
结果:
{ 'zz' : 2 , 'yy' : 3 }
使用 for 循环,直接遍历字典的键,并使用 dict [ key] 获取它们对应的值。例如:
dict = { "id" : 1 , "second" : "abcd" }
for key in dict:
print ( key, dict[ key] )
使用 dict. items ( ) 方法,返回一个包含字典中所有键值对的可迭代对象,并使用 for 循环遍历它们。每个键值对是一个元组,可以使用解包赋值的方式获取键和值。例如:
dict = { "id" : 1 , "second" : "abcd" }
for key, value in dict. items ( ) :
print ( key, value)
使用 dict. keys ( ) 方法,返回一个包含字典中所有键的可迭代对象,并使用 for 循环遍历它们。这与直接遍历字典的键类似,但可以在需要时转换为列表或集合等其他数据结构。例如:
dict = { "id" : 1 , "second" : "abcd" }
for key in dict. keys ( ) :
print ( key, dict[ key] )
使用 dict. values ( ) 方法,返回一个包含字典中所有值的可迭代对象,并使用 for 循环遍历它们。这在只需要字典的值而不需要键时很有用。例如:
dict = { "id" : 1 , "second" : "abcd" }
for value in dict. values ( ) :
print ( value)
Dictionary (字典):由键值对组成的一组无序的可变的值,用花括号括起来,可以进行访问、添加、删除、遍历等操作。
4、Number(数字)
Number(数字):包括整数、浮点数、复数等,可以进行算术运算和逻辑运算。
3、int
# Number
a = 10 # 整数
b = 3.14 # 浮点数
c = 1 + 2j # 复数
print ( a + b) # 算术运算
print ( a > b) # 逻辑运算
5、Set(集合)
Set(集合):由逗号分隔的一组无序的不重复的值,用花括号括起来,可以进行交集、并集、差集、对称差等操作。
# Set
s1 = { 1 , 2 , 3 , 4 , 5 } # 集合
s2 = { 3 , 4 , 5 , 6 , 7 } # 集合
print ( s1 & s2) # 交集
print ( s1 | s2) # 并集
print ( s1 - s2) # 差集
print ( s1 ^ s2) # 对称差
6、String(字符串
String(字符串):由单引号或双引号括起来的一系列字符,可以进行切片、索引、拼接、格式化等操作。
# String
s = "Hello, world!" # 字符串
print ( s [ 0 ] ) # 索引
print ( s [ 1 : 5 ] ) # 切片
print ( s + " Python" ) # 拼接
print ( "My name is %s" % "Bing" ) # 格式化
异常
用于抛出一个异常,即一个运行时错误。message是一个字符串,用于描述异常的原因。例如:
raise Exception( "Invalid input" )
这会抛出一个异常,显示“Invalid input ”作为错误信息。
assert
Python中的assert 是一个用于调试和测试代码的关键字。assert 可以让你检查代码中的某个条件是否为真,如果不为真,就会抛出一个AssertionError异常。你可以在异常中写一个消息来说明条件为假的原因,例如:
x = "hello"
assert x == "hello"
assert x == "goodbye" , "x应该是'hello'"
assert 的语法如下:
assert expression[ , assertion_message]
其中,expression可以是任何有效的Python表达式或对象,它会被测试其真值。如果expression为假,就会抛出AssertionError。assertion_message参数是可选的,但是建议提供,以便更好地说明错误原因。
assert 可以用来在代码中写一些假设或者检查,以确保代码的正确性和一致性。你可以用assert 来文档化、调试和测试你的代码,在开发过程中发现和修复错误。一旦你用assert 调试和测试好了你的代码,你就可以关闭它们,以提高代码在生产环境中的性能。
装饰器
Python 内置了3 种函数装饰器, 分别是 @staticmethod 、@classmethod 和 @property
property 函数字如其名,其在装饰器的主要应用在于,我们要实现
保护类的封装特性
让开发者可以使用“对象. 属性”的方式操作操作类属性
global
python中global 是一个关键字,
用来声明一个或多个变量为全局变量。
全局变量是指在模块(module)级别的变量,
可以被不同的函数或对象引用和修改。
如果在函数内部不使用global 声明全局变量,
而直接对其进行赋值或修改,
会报错或者创建一个新的局部变量。
如果只是读取全局变量的值,不需要使用global 声明。
运算符
位运算符
page_url_set |= set(urls)这个语句是使用了Python中的位运算符|=,它表示按位或赋值,即将page_url_set和set(urls)进行按位或运算,然后将结果赋值给page_url_set。按位或运算符|在Python中也可以用于集合类型,表示集合的并集,即将两个集合中的所有元素合并在一起,去除重复的元素。因此,这个语句的意思是将page_url_set和set(urls)两个集合合并为一个集合,并赋值给page_url_set。例如:
# 定义一个集合
page_url_set = { "https://www.example.com" , "https://www.foo.com" }
# 定义一个列表
urls = ["https://www.bar.com", "https://www.example.com"]
# 使用|=运算符
page_url_set |= set(urls)
# 打印结果
print(page_url_set) # 输出 { 'https://www.example.com' , 'https://www.foo.com' , 'https://www.bar.com' }
在上面的例子中,我们将page_url_set和set ( urls) 两个集合进行了并集运算,并将结果赋值给了page_url_set。可以看到,结果集合中包含了两个集合中的所有元素,但是去除了重复的"https://www.example.com" 元素。
累加 累积
code += _ 是一个赋值语句,它将变量 code 的值增加 _ 的值。这与 code = code + _ 是等价的。这种写法通常用于累加或累积变量的值。
标准库模块
内置库/函数
setuptools
setuptools是PEAK的一个副项目, 它 是一组Python的 distutilsde工具的增强工具 (适用于 Python 2.3.5 以上的版本,64 位平台则适用于 Python 2.4 以上的版本),
其功能可以使程序员更方便的创建和发布 Python 包,特别是那些对其它包具有依赖性的状况
模块
GUI
anaconda
爬虫
打包
python-pip命令
pip -V 显示pip版本 pip list 列出已经安装的包 pip show numpy 显示特定安装包的信息 pip check tensorflow 检查依赖包是否已经安装 pip hash numpy-1.19.1-cp36-cp36m-win_amd64.whl 计算安装包的hash值 pip install numpy 安装numpy包 pip install --upgrade tensorflow 或 pip install -U tensorflow安装最新版本tensorflow(升级) pip install numpy==1.13.3 安装指定版本包 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tensorflow 指定从清华服务器下载tensorflow 安装包。等效于后面的配置文件中index-url设置。 pip install -r requirements.txt 根据包需求文件批量安装,常用于复现环境
【requirements.txt内容格式为】
APScheduler==2.1.2
Django==1.5.4
MySQL-Connector-Python==2.0.1
MySQL-python==1.2.3
PIL==1.1.7
South>=1.0.2
django-grappelli==2.6.3
django-pagination==1.0.7
pip install numpy-1.19.1-cp36-cp36m-win_amd64.whl 安装当前目录中的wheel安装包文件
卸载安装包 pip uninstall numpy 卸载(加-y参数,自动完成,不再询问y/n)
pip uninstall -r requirements.txt -y 自动卸载requirements.txt中所有包(批量卸载)
下载安装包文件 pip download numpy
下载numpy包,执行后,在当前目录中下载numpy-1.19.1-cp36-cp36m-win_amd64.whl
取得当前环境包列表文件 pip freeze >requirements.txt
cache缓存命令(pip安装时,会将下载的文件进行缓存,以后再次安装此包时,不必再下载。一般用于当前用户环境时。不是虚拟环境。虚拟环境会参考此缓存。) pip cache dir
pip cache list 列出当前缓存的安装包
pip cache info 显示缓存占用磁盘大小信息
pip cache remove gym* 删除缓存中的gym开头的包
pip cache purge 删全部缓存中包
pip wheel 安装包制作命令,以后单独整理安装包制作时进一步说明 pip wheel -r requirements.txt --wheel-dir=./wheelhouse
在当前目录下的wheelhouse目录,下载requirements.txt中所有包
flask框架
functools包 wraps 增强函数功能 高阶函数(该高阶函数的定义为作用于或返回其它函数的函数)
import parsel scrapy内置的选择器包含re、css、xpath选择器,依赖lxml
import requests import re
import requests import json from openpyxl import Workbook import time import hashlib import os import datetime
CentOS 7.2 默认安装了python2.7.5 因为一些命令要用它比如yum 它使用的是python2.7.5。
使用 python -V 命令查看一下是否安装Python
然后使用命令 which python 查看一下Python可执行文件的位置 可见执行文件在/usr/bin/ 目录下,切换到该目录下执行 ll python* 命令查看
python 指向的是python2.7
要安装python3版本,所以python要指向python3才行,目前还没有安装python3, 先备份,备份之前先安装相关包,用于下载编译python3
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make
不能忽略相关包,我之前就没有安装readline-devel导致执行python模式无法使用键盘的上下左右键;
然后备份
mv python python.bak
2.开始编译安装python3
去官网下载编译安装包或者直接执行以下命令下载
wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tar.xz
解压
tar -xvJf Python-3.6.2.tar.xz
切换进入
cd Python-3.6.2
编译安装
./configure prefix=/usr/local/python3
make && make install
安装完毕,/usr/local/目录下就会有python3了
因此我们可以添加软链到执行目录下/usr/bin
ln -s /usr/local/python3/bin/python3 /usr/bin/python
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
可以看到软链创建完成
测试安装成功了没,执行
python -V 看看输出的是不是python3的版本
执行python2 -V 看到的就是python2的版本
因为执行yum需要python2版本,所以我们还要修改yum的配置,执行:
vi /usr/bin/yum
把#! /usr/bin/python修改为#! /usr/bin/python2 同理 vi /usr/libexec/urlgrabber-ext-down 文件里面的#! /usr/bin/python 也要修改为#! /usr/bin/python2
这样python3版本就安装完成;同时python2也存在
python -V 版本3
python2 -V 版本2
print() 输出颜色
标准格式
print ( "\033[显示方式;前景颜色;背景颜色m…\033[0m" )
显示方式
意义 显示方式
默认 0
高亮显示 1
下划线 4
闪烁 5
反白显示 7
不可见 8
前景颜色和背景颜色
颜色 前景色 背景色
黑色 30 40
红色 31 41
绿色 32 42
黄色 33 43
蓝色 34 44
紫红色 35 45
青蓝色 36 46
白色 37 47
没有设置的话就是默认
print ( "\033[0;31;40m我是小杨我就这样\033[0m" )
print ( "\033[0;32;40m我是小杨我就这样\033[0m" )
print ( "\033[0;33;40m我是小杨我就这样\033[0m" )
print ( "\033[0;34;40m我是小杨我就这样\033[0m" )
print ( "\033[0;35;40m我是小杨我就这样\033[0m" )
print ( "\033[0;36;40m我是小杨我就这样\033[0m" )
print ( "\033[0;37;40m我是小杨我就这样\033[0m" )
print ( "\033[0;37;41m我是小杨我就这样\033[0m" )
print ( "\033[0;37;42m我是小杨我就这样\033[0m" )
print ( "\033[0;37;43m我是小杨我就这样\033[0m" )
print ( "\033[0;37;44m我是小杨我就这样\033[0m" )
print ( "\033[0;37;45m我是小杨我就这样\033[0m" )
print ( "\033[0;37;46m我是小杨我就这样\033[0m" )
print ( "\033[0;30;47m我是小杨我就这样\033[0m" )
项目 重新打开
删掉 venv
正则表达式(regular expression)
描述了一种字符串匹配的模式(pattern), 可以用来检查一个串是否含有某种子串、
将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
runoo+ b,可以匹配 runoob、runooob、runoooooob 等
+ 号代表前面的字符必须至少出现一次(1 次或多次)。
runoo* b,可以匹配 runob、runoob、runoooooob 等
* 号代表前面的字符可以不出现,也可以出现一次或者多次(0 次、或1 次、或多次)。
colou? r 可以匹配 color 或者 colour
? 问号代表前面的字符最多只可以出现一次(0 次或1 次)。
re.compile 函数
编译正则表达式模式,返回一个对象。 可以把常用的正则表达式编译成正则表达式对象,方便后续调用及提高效率。
re. compile ( pattern, flags= 0 )
pattern 指定编译时的表达式字符串 flags 编译标志位,用来修改正则表达式的匹配方式。支持 re.L|re.M 同时匹配
flags 标志位参数:
re. I ( re. IGNORECASE) :使匹配对大小写不敏感
re. L ( re. LOCAL) :做本地化识别(locale- aware)匹配
re. M ( re. MULTILINE) :多行匹配,影响 ^ 和 $
re. S ( re. DOTALL) :使 . 匹配包括换行在内的所有字符
re. U ( re. UNICODE) :根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re. X ( re. VERBOSE) :该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
特殊的字符序列
作用: 检查一个字符串是否与 某种模式 匹配
python x>1.5 re 模块 Perl 风格-正则表达式模式 方法功能函数------一个模式字符串做为它们的第一个参数
compile 函数:编译正则表达式 根据 一个模式字符串 和 可选的标志参数 —> 生成一个正则表达式( Pattern )对象 (该对象拥有一系列方法 用于正则表达式匹配和替换) 供 match() 和 search() 这两个函数使用
re.match(pattern, string, flags=0) 函数
尝试从字符串的起始位置匹配一个模式,
匹配成功----------返回一个匹配的对象
如果不是起始位置匹配成功的话,
使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
. - 除换行符以外的所有字符。
^ - 字符串开头。
$ - 字符串结尾。
\d, \w, \s - 匹配数字、字符、空格。
\D, \W, \S - 匹配非数字、非字符、非空格。
[ abc] - 匹配 a、b 或 c 中的一个字母。
[ a- z] - 匹配 a 到 z 中的一个字母。
[ ^ abc] - 匹配除了 a、b 或 c 中的其他字母。
aa| bb - 匹配 aa 或 bb。
? - 0 次或 1 次匹配。
* - 匹配 0 次或多次。
+ - 匹配 1 次或多次。
{ n} - 匹配 n次。
{ n, } - 匹配 n次以上。
{ m, n} - 最少 m 次,最多 n 次匹配。
( expr) - 捕获 expr 子模式, 以 \1 使用它。
( ? : expr) - 忽略捕获的子模式。
( ? = expr) - 正向预查模式 expr。
( ? ! expr) - 负向预查模式 expr。
一、校验数字的表达式
数字:^ [ 0 - 9 ] * $
n位的数字:^ \d{ n} $
至少n位的数字:^ \d{ n, } $
m- n位的数字:^ \d{ m, n} $
零和非零开头的数字:^ ( 0 | [ 1 - 9 ] [ 0 - 9 ] * ) $
非零开头的最多带两位小数的数字:^ ( [ 1 - 9 ] [ 0 - 9 ] * ) + ( \. [ 0 - 9 ] { 1 , 2 } ) ? $
带1 - 2 位小数的正数或负数:^ ( \- ) ? \d+ ( \. \d{ 1 , 2 } ) $
正数、负数、和小数:^ ( \- | \+ ) ? \d+ ( \. \d+ ) ? $
有两位小数的正实数:^ [ 0 - 9 ] + ( \. [ 0 - 9 ] { 2 } ) ? $
有1 ~ 3 位小数的正实数:^ [ 0 - 9 ] + ( \. [ 0 - 9 ] { 1 , 3 } ) ? $
非零的正整数:^ [ 1 - 9 ] \d* $ 或 ^ ( [ 1 - 9 ] [ 0 - 9 ] * ) { 1 , 3 } $ 或 ^ \+ ? [ 1 - 9 ] [ 0 - 9 ] * $
非零的负整数:^ \- [ 1 - 9 ] [ ] 0 - 9 "* $ 或 ^ - [ 1 - 9 ] \d* $
非负整数:^ \d+ $ 或 ^ [ 1 - 9 ] \d* | 0 $
非正整数:^ - [ 1 - 9 ] \d* | 0 $ 或 ^ ( ( - \d+ ) | ( 0 + ) ) $
非负浮点数:^ \d+ ( \. \d+ ) ? $ 或 ^ [ 1 - 9 ] \d* \. \d* | 0 \. \d* [ 1 - 9 ] \d* | 0 ? \.0 + | 0 $
非正浮点数:^ ( ( - \d+ ( \. \d+ ) ? ) | ( 0 + ( \.0 + ) ? ) ) $ 或 ^ ( - ( [ 1 - 9 ] \d* \. \d* | 0 \. \d* [ 1 - 9 ] \d* ) ) | 0 ? \.0 + | 0 $
正浮点数:^ [ 1 - 9 ] \d* \. \d* | 0 \. \d* [ 1 - 9 ] \d* $ 或 ^ ( ( [ 0 - 9 ] + \. [ 0 - 9 ] * [ 1 - 9 ] [ 0 - 9 ] * ) | ( [ 0 - 9 ] * [ 1 - 9 ] [ 0 - 9 ] * \. [ 0 - 9 ] + ) | ( [ 0 - 9 ] * [ 1 - 9 ] [ 0 - 9 ] * ) ) $
负浮点数:^ - ( [ 1 - 9 ] \d* \. \d* | 0 \. \d* [ 1 - 9 ] \d* ) $ 或 ^ ( - ( ( [ 0 - 9 ] + \. [ 0 - 9 ] * [ 1 - 9 ] [ 0 - 9 ] * ) | ( [ 0 - 9 ] * [ 1 - 9 ] [ 0 - 9 ] * \. [ 0 - 9 ] + ) | ( [ 0 - 9 ] * [ 1 - 9 ] [ 0 - 9 ] * ) ) ) $
浮点数:^ ( - ? \d+ ) ( \. \d+ ) ? $ 或 ^ - ? ( [ 1 - 9 ] \d* \. \d* | 0 \. \d* [ 1 - 9 ] \d* | 0 ? \.0 + | 0 ) $
校验字符的表达式
汉字:^ [ \u4e00- \u9fa5] { 0 , } $
英文和数字:^ [ A- Za- z0- 9 ] + $ 或 ^ [ A- Za- z0- 9 ] { 4 , 40 } $
长度为3 - 20 的所有字符:^ . { 3 , 20 } $
由26 个英文字母组成的字符串:^ [ A- Za- z] + $
由26 个大写英文字母组成的字符串:^ [ A- Z] + $
由26 个小写英文字母组成的字符串:^ [ a- z] + $
由数字和26 个英文字母组成的字符串:^ [ A- Za- z0- 9 ] + $
由数字、26 个英文字母或者下划线组成的字符串:^ \w+ $ 或 ^ \w{ 3 , 20 } $
中文、英文、数字包括下划线:^ [ \u4E00- \u9FA5A- Za- z0- 9 _] + $
中文、英文、数字但不包括下划线等符号:^ [ \u4E00- \u9FA5A- Za- z0- 9 ] + $ 或 ^ [ \u4E00- \u9FA5A- Za- z0- 9 ] { 2 , 20 } $
可以输入含有^ % & ',;=?$\"等字符:[^%&' , ; = ? $\x22] +
禁止输入含有~ 的字符:[ ^ ~ ] +
三、特殊需求表达式
Email地址:^ \w+ ( [ - + . ] \w+ ) * @\w+ ( [ - . ] \w+ ) * \. \w+ ( [ - . ] \w+ ) * $
域名:[ a- zA- Z0- 9 ] [ - a- zA- Z0- 9 ] { 0 , 62 } ( \. [ a- zA- Z0- 9 ] [ - a- zA- Z0- 9 ] { 0 , 62 } ) + \. ?
InternetURL:[ a- zA- z] + :
手机号码:^ ( 13 [ 0 - 9 ] | 14 [ 01456879 ] | 15 [ 0 - 35 - 9 ] | 16 [ 2567 ] | 17 [ 0 - 8 ] | 18 [ 0 - 9 ] | 19 [ 0 - 35 - 9 ] ) \d{ 8 } $
电话号码( "XXX-XXXXXXX" 、"XXXX-XXXXXXXX" 、"XXX-XXXXXXX" 、"XXX-XXXXXXXX" 、"XXXXXXX" 和"XXXXXXXX) :^ ( \( \d{ 3 , 4 } - ) | \d{ 3.4 } - ) ? \d{ 7 , 8 } $
国内电话号码( 0511 - 4405222 、021 - 87888822 ) :\d{ 3 } - \d{ 8 } | \d{ 4 } - \d{ 7 }
电话号码正则表达式(支持手机号码,3 - 4 位区号,7 - 8 位直播号码,1 -4 位分机号): ( ( \d{ 11 } ) | ^ ( ( \d{ 7 , 8 } ) | ( \d{ 4 } | \d{ 3 } ) - ( \d{ 7 , 8 } ) | ( \d{ 4 } | \d{ 3 } ) - ( \d{ 7 , 8 } ) - ( \d{ 4 } | \d{ 3 } | \d{ 2 } | \d{ 1 } ) | ( \d{ 7 , 8 } ) - ( \d{ 4 } | \d{ 3 } | \d{ 2 } | \d{ 1 } ) ) $)
身份证号( 15 位、18 位数字) ,最后一位是校验位,可能为数字或字符X:( ^ \d{ 15 } $) | ( ^ \d{ 18 } $) | ( ^ \d{ 17 } ( \d| X| x) $)
帐号是否合法( 字母开头,允许5 - 16 字节,允许字母数字下划线) :^ [ a- zA- Z] [ a- zA- Z0- 9 _] { 4 , 15 } $
密码( 以字母开头,长度在6 ~ 18 之间,只能包含字母、数字和下划线) :^ [ a- zA- Z] \w{ 5 , 17 } $
强密码( 必须包含大小写字母和数字的组合,不能使用特殊字符,长度在 8 - 10 之间) :^ ( ? = . * \d) ( ? = . * [ a- z] ) ( ? = . * [ A- Z] ) [ a- zA- Z0- 9 ] { 8 , 10 } $
强密码( 必须包含大小写字母和数字的组合,可以使用特殊字符,长度在8 - 10 之间) :^ ( ? = . * \d) ( ? = . * [ a- z] ) ( ? = . * [ A- Z] ) . { 8 , 10 } $
日期格式:^ \d{ 4 } - \d{ 1 , 2 } - \d{ 1 , 2 }
一年的12 个月( 01 ~09 和1 ~12 ) :^ ( 0 ? [ 1 - 9 ] | 1 [ 0 - 2 ] ) $
一个月的31 天( 01 ~09 和1 ~31 ) :^ ( ( 0 ? [ 1 - 9 ] ) | ( ( 1 | 2 ) [ 0 - 9 ] ) | 30 | 31 ) $
钱的输入格式:
有四种钱的表示形式我们可以接受: "10000.00" 和 "10,000.00" , 和没有 "分" 的 "10000" 和 "10,000" :^ [ 1 - 9 ] [ 0 - 9 ] * $
这表示任意一个不以0 开头的数字, 但是, 这也意味着一个字符"0" 不通过, 所以我们采用下面的形式:^ ( 0 | [ 1 - 9 ] [ 0 - 9 ] * ) $
一个0 或者一个不以0 开头的数字. 我们还可以允许开头有一个负号:^ ( 0 | - ? [ 1 - 9 ] [ 0 - 9 ] * ) $
这表示一个0 或者一个可能为负的开头不为0 的数字. 让用户以0 开头好了. 把负号的也去掉, 因为钱总不能是负的吧。下面我们要加的是说明可能的小数部分:^ [ 0 - 9 ] + ( . [ 0 - 9 ] + ) ? $
必须说明的是, 小数点后面至少应该有1 位数, 所以"10." 是不通过的, 但是 "10" 和 "10.2" 是通过的:^ [ 0 - 9 ] + ( . [ 0 - 9 ] { 2 } ) ? $
这样我们规定小数点后面必须有两位, 如果你认为太苛刻了, 可以这样:^ [ 0 - 9 ] + ( . [ 0 - 9 ] { 1 , 2 } ) ? $
这样就允许用户只写一位小数. 下面我们该考虑数字中的逗号了, 我们可以这样:^ [ 0 - 9 ] { 1 , 3 } ( , [ 0 - 9 ] { 3 } ) * ( . [ 0 - 9 ] { 1 , 2 } ) ? $
1 到3 个数字, 后面跟着任意个 逗号+ 3 个数字, 逗号成为可选, 而不是必须:^ ( [ 0 - 9 ] + | [ 0 - 9 ] { 1 , 3 } ( , [ 0 - 9 ] { 3 } ) * ) ( . [ 0 - 9 ] { 1 , 2 } ) ? $
备注:这就是最终结果了, 别忘了"+" 可以用"*" 替代如果你觉得空字符串也可以接受的话( 奇怪, 为什么? ) 最后, 别忘了在用函数时去掉去掉那个反斜杠, 一般的错误都在这里
xml文件:^ ( [ a- zA- Z] + - ? ) + [ a- zA- Z0- 9 ] + \\. [ x| X] [ m| M] [ l| L] $
中文字符的正则表达式:[ \u4e00- \u9fa5]
双字节字符:[ ^ \x00- \xff] ( 包括汉字在内,可以用来计算字符串的长度( 一个双字节字符长度计2 ,ASCII字符计1 ) )
空白行的正则表达式:\n\s* \r ( 可以用来删除空白行)
HTML标记的正则表达式:< ( \S* ? ) [ ^ > ] * > . * ? | < . * ? / > ( 首尾空白字符的正则表达式:^ \s* | \s* $或( ^ \s* ) | ( \s* $) ( 可以用来删除行首行尾的空白字符( 包括空格、制表符、换页符等等) ,非常有用的表达式)
腾讯QQ号:[ 1 - 9 ] [ 0 - 9 ] { 4 , } ( 腾讯QQ号从10000 开始)
中国邮政编码:[ 1 - 9 ] \d{ 5 } ( ? ! \d) ( 中国邮政编码为6 位数字)
IPv4地址:( ( 2 ( 5 [ 0 - 5 ] | [ 0 - 4 ] \d) ) | [ 0 - 1 ] ? \d{ 1 , 2 } ) ( \. ( ( 2 ( 5 [ 0 - 5 ] | [ 0 - 4 ] \d) ) | [ 0 - 1 ] ? \d{ 1 , 2 } ) ) { 3 }
reportlab
reportlab是Python的一个标准库, 可以画图、画表格、编辑文字,最后可以输出PDF格式。
它的逻辑和编辑一个word文档或者PPT很像。
有两种方法:
1)建立一个空白文档,然后在上面写文字、画图等; 2)建立一个空白list,以填充表格的形式插入各种文本框、图片等,最后生成PDF文档。
pip install reportlab -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
字典
字典:
字典是无序的,它不能通过偏移来存取,只能通过键来存取。
字典 = {‘key’:value} key:类似我们现实的钥匙,而value则是锁。一个钥匙开一个锁
特点:
内部没有顺序,通过键来读取内容,可嵌套,方便我们组织多种数据结构,并且可以原地修改里面的内容,
属于可变类型。
组成字典的键必须是不可变的数据类型,比如,数字,字符串,元组等,列表等可变对象不能作为键.
1 创建字典。{},dict()
info = {‘name’:‘lilei’, ‘age’: 20}
info = dict(name=‘lilei’,age=20)
2 添加内容 a[‘xx’] = ‘xx’
比如 info[‘phone’] = ‘iphone5’
3 修改内容 a[‘xx’] = ‘xx’ ,
info[‘phone’] = ‘htc’
update 参数是一个字典的类型,他会覆盖相同键的值
info.update({‘city’:‘beijing’,‘phone’:‘nokia’})
htc 变成了nokia了
4 删除 del,clear,pop
del info[‘phone’] 删除某个元素
info.clear()删除字典的全部元素
info.pop(‘name’)
5 in 和 has_key() 成员关系操作
比如:
1 phone in info
2 info.has_key(‘phone’)
6 keys(): 返回的是列表,里面包含了字典的所有键
values():返回的是列表,里面包含了字典的所有值
items:生成一个字典的容器:[()]
7 get:从字典中获得一个值
info.get(‘name’)
info.get(‘age2’,‘22’)
变量
1.Python的自述
https://www.bilibili.com/video/BV1wD4y1o7AS?from=search&seid=7925680372439541422
2018 计算机 二级 加 Python
浙江省 2017 高考
2020 中小学 信息素质 体测
智能化课程 设置
小学三年级
2.Python简介
3.Python开发环境的安装
格式化
pythn print格式化输出
格式符 格式符为真实值预留位置,并控制显示的格式。格式符可以包含有一个类型码,用以控制显示的类型,如下: %s 字符串 (采用str()的显示) %r 字符串 (采用repr()的显示) %c 单个字符 %b 二进制整数 %d 十进制整数 %i 十进制整数 %o 八进制整数 %x 十六进制整数 %e 指数 (基底写为e) %E 指数 (基底写为E) %f 浮点数 %F 浮点数,与上相同 %g 指数(e)或浮点数 (根据显示长度) %G 指数(E)或浮点数 (根据显示长度)
Python爬虫——新闻热点爬取
显示更多
可以看到相关的数据接口,里面有新闻标题以及新闻详情的url地址
如何提取url地址
1、转成json,键值对取值;
2、用正则表达式匹配url地址;
根据接口数据链接中的pager 变化进行翻页,其对应的就是页码。
详情页可以看到新闻内容都是在 div标签里面 p 标签内,按照正常的解析网站即可获取新闻内容。
保存方式
txt文本形式 PDF形式
整体爬取思路总结
在栏目列表页中,点击更多新闻内容,获取接口数据url
接口数据url中返回的数据内容中匹配新闻详情页url
使用常规解析网站操作(re、css、xpath)提取新闻内容
保存数据
import parsel
import requests
import re
#### 获取网页源代码
def get_html ( html_url) :
"" "
获取网页源代码 response
: param html_url: 网页url地址
: return : 网页源代码
"" "
headers = {
"User-Agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36" ,
"Accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9" , }
response = requests. get ( url= html_url, headers= headers)
return response
#### 获取每篇新闻url地址
def get_page_url ( html_data) :
"" "
获取每篇新闻url地址
: param html_data: response. text
: return : 每篇新闻的url地址
"" "
page_url_list = re. findall ( '"url":"(.*?)"' , html_data)
return page_url_list
#### 文件保存命名不能含有特殊字符,需要对新闻标题进行处理
def file_name ( name) :
"" "
文件命名不能携带 特殊字符
: param name: 新闻标题
: return : 无特殊字符的标题
"" "
replace = re. compile ( r'[\\\/\:\*\?\"\<\>\|]' )
new_name = re. sub ( replace, '_' , name)
return new_name
####保存数据
def download ( content, title) :
"" "
with open 保存新闻内容 txt
: param content: 新闻内容
: param title: 新闻标题
: return :
"" "
path = '新闻\\' + title + '.txt'
with open ( path, mode= 'a' , encoding= 'utf-8' ) as f:
f. write ( content)
print ( '正在保存' , title)
### 主函数
def main ( url) :
"" "
主函数
: param url: 新闻列表页 url地址
: return :
"" "
html_data = get_html ( url) . text # 获得接口数据response. text
lis = get_page_url ( html_data) # 获得新闻url地址列表
for li in lis:
page_data = get_html ( li) . content. decode ( 'utf-8' , 'ignore' ) # 新闻详情页 response. text
selector = parsel. Selector ( page_data)
title = re. findall ( '(.*?) ' , page_data, re. S) [ 0 ] # 获取新闻标题
new_title = file_name ( title)
new_data = selector. css ( '#cont_1_1_2 div.left_zw p::text' ) . getall ( )
content = '' . join ( new_data)
download ( content, new_title)
if __name__ == '__main__' :
for page in range ( 1 , 101 ) :
url_1 = 'https://channel.chinanews.com/cns/cjs/gj.shtml?pager={}&pagenum=9&t=5_58' . format ( page)
main ( url_1)
在浏览器开发者模式network下很快能找到一个‘?category=new_hot…’字样的文件,查看该文件发现新闻内容的数据全部存储在data里面,且能发现数据类型为json;
只要找到这个文件的requests url即可通过python requests来爬取网页了;
查看请求的url, 发现链接为:https://www.toutiao.com/api/pc/feed/?category=news_hot&utm_source=toutiao&widen=1&max_behot_time=0&max_behot_time_tmp=0&tadrequire=true&as=A1B5AC16548E0FA&cp=5C647E601F9AEE1&_signature=F09fYAAASzBjiSc9oUU9MxdPX3 其中max_behot_time在获取的json数据中获得 :
在网上找了下大神对as和cp算法的分析, 发现两个参数在js文件:home_4abea46.js中有,具体算法如下代码:
! function ( t) {
var e = { } ;
e. getHoney = function ( ) {
var t = Math. floor ( ( new Date ) . getTime ( ) / 1e3 )
, e = t. toString ( 16 ) . toUpperCase ( )
, i = md5 ( t) . toString ( ) . toUpperCase ( ) ;
if ( 8 != e. length)
return {
as: "479BB4B7254C150" ,
cp: "7E0AC8874BB0985"
} ;
for ( var n = i. slice ( 0 , 5 ) , a = i. slice ( - 5 ) , s = "" , o = 0 ; 5 > o; o++ )
s + = n[ o] + e[ o] ;
for ( var r = "" , c = 0 ; 5 > c; c++ )
r + = e[ c + 3 ] + a[ c] ;
return {
as: "A1" + s + e. slice ( - 3 ) ,
cp: e. slice ( 0 , 3 ) + r + "E1"
}
}
,
t. ascp = e
} ( window, document) ,
python获取as和cp值的代码如下:(代码参考blog:https://www.cnblogs.com/xuchunlin/p/7097391.html)
def get_as_cp ( ) : # 该函数主要是为了获取as和cp参数,程序参考今日头条中的加密js文件:home_4abea46. js
zz = { }
now = round ( time. time ( ) )
print ( now) # 获取当前计算机时间
e = hex ( int ( now) ) . upper ( ) [ 2 : ] #hex ( ) 转换一个整数对象为16 进制的字符串表示
print ( 'e:' , e)
a = hashlib. md5 ( ) #hashlib. md5 ( ) . hexdigest ( ) 创建hash对象并返回16 进制结果
print ( 'a:' , a)
a. update ( str ( int ( now) ) . encode ( 'utf-8' ) )
i = a. hexdigest ( ) . upper ( )
print ( 'i:' , i)
if len ( e) != 8 :
zz = { 'as' : '479BB4B7254C150' ,
'cp' : '7E0AC8874BB0985' }
return zz
n = i[ : 5 ]
a = i[ - 5 : ]
r = ''
s = ''
for i in range ( 5 ) :
s= s+ n[ i] + e[ i]
for j in range ( 5 ) :
r = r+ e[ j+ 3 ] + a[ j]
zz = {
'as' : 'A1' + s+ e[ - 3 : ] ,
'cp' : e[ 0 : 3 ] + r+ 'E1'
}
print ( 'zz:' , zz)
return zz
这样完整的链接就构成了,另外提一点就是:
_signature参数去掉也是可以获取到json数据的,
import requests
import json
from openpyxl import Workbook
import time
import hashlib
import os
import datetime
start_url = 'https://www.toutiao.com/api/pc/feed/?category=news_hot&utm_source=toutiao&widen=1&max_behot_time='
url = 'https://www.toutiao.com'
headers= {
'user-agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
cookies = { 'tt_webid' : '6649949084894053895' } # 此处cookies可从浏览器中查找,为了避免被头条禁止爬虫
max_behot_time = '0' # 链接参数
title = [ ] # 存储新闻标题
source_url = [ ] # 存储新闻的链接
s_url = [ ] # 存储新闻的完整链接
source = [ ] # 存储发布新闻的公众号
media_url = { } # 存储公众号的完整链接
def get_as_cp ( ) : # 该函数主要是为了获取as和cp参数,程序参考今日头条中的加密js文件:home_4abea46. js
zz = { }
now = round ( time. time ( ) )
print ( now) # 获取当前计算机时间
e = hex ( int ( now) ) . upper ( ) [ 2 : ] #hex ( ) 转换一个整数对象为16 进制的字符串表示
print ( 'e:' , e)
a = hashlib. md5 ( ) #hashlib. md5 ( ) . hexdigest ( ) 创建hash对象并返回16 进制结果
print ( 'a:' , a)
a. update ( str ( int ( now) ) . encode ( 'utf-8' ) )
i = a. hexdigest ( ) . upper ( )
print ( 'i:' , i)
if len ( e) != 8 :
zz = { 'as' : '479BB4B7254C150' ,
'cp' : '7E0AC8874BB0985' }
return zz
n = i[ : 5 ]
a = i[ - 5 : ]
r = ''
s = ''
for i in range ( 5 ) :
s= s+ n[ i] + e[ i]
for j in range ( 5 ) :
r = r+ e[ j+ 3 ] + a[ j]
zz = {
'as' : 'A1' + s+ e[ - 3 : ] ,
'cp' : e[ 0 : 3 ] + r+ 'E1'
}
print ( 'zz:' , zz)
return zz
def getdata ( url, headers, cookies) : # 解析网页函数
r = requests. get ( url, headers= headers, cookies= cookies)
print ( url)
data = json. loads ( r. text)
return data
def savedata ( title, s_url, source, media_url) : # 存储数据到文件
# 存储数据到xlxs文件
wb = Workbook ( )
if not os. path. isdir ( os. getcwd ( ) + '/result' ) : # 判断文件夹是否存在
os. makedirs ( os. getcwd ( ) + '/result' ) # 新建存储文件夹
filename = os. getcwd ( ) + '/result/result-' + datetime. datetime. now ( ) . strftime ( '%Y-%m-%d-%H-%m' ) + '.xlsx' # 新建存储结果的excel文件
ws = wb. active
ws. title = 'data' # 更改工作表的标题
ws[ 'A1' ] = '标题' # 对表格加入标题
ws[ 'B1' ] = '新闻链接'
ws[ 'C1' ] = '头条号'
ws[ 'D1' ] = '头条号链接'
for row in range ( 2 , len ( title) + 2 ) : # 将数据写入表格
_= ws. cell ( column= 1 , row= row, value= title[ row- 2 ] )
_= ws. cell ( column= 2 , row= row, value= s_url[ row- 2 ] )
_= ws. cell ( column= 3 , row= row, value= source[ row- 2 ] )
_= ws. cell ( column= 4 , row= row, value= media_url[ source[ row- 2 ] ] )
wb. save ( filename= filename) # 保存文件
def main ( max_behot_time, title, source_url, s_url, source, media_url) : # 主函数
for i in range ( 3 ) : # 此处的数字类似于你刷新新闻的次数,正常情况下刷新一次会出现10 条新闻,但夜存在少于10 条的情况;所以最后的结果并不一定是10 的倍数
ascp = get_as_cp ( ) # 获取as和cp参数的函数
demo = getdata ( start_url+ max_behot_time+ '&max_behot_time_tmp=' + max_behot_time+ '&tadrequire=true&as=' + ascp[ 'as' ] + '&cp=' + ascp[ 'cp' ] , headers, cookies)
print ( demo)
# time. sleep ( 1 )
for j in range ( len ( demo[ 'data' ] ) ) :
# print ( demo[ 'data' ] [ j] [ 'title' ] )
if demo[ 'data' ] [ j] [ 'title' ] not in title:
title. append ( demo[ 'data' ] [ j] [ 'title' ] ) # 获取新闻标题
source_url. append ( demo[ 'data' ] [ j] [ 'source_url' ] ) # 获取新闻链接
source. append ( demo[ 'data' ] [ j] [ 'source' ] ) # 获取发布新闻的公众号
if demo[ 'data' ] [ j] [ 'source' ] not in media_url:
media_url[ demo[ 'data' ] [ j] [ 'source' ] ] = url+ demo[ 'data' ] [ j] [ 'media_url' ] # 获取公众号链接
print ( max_behot_time)
max_behot_time = str ( demo[ 'next' ] [ 'max_behot_time' ] ) # 获取下一个链接的max_behot_time参数的值
for index in range ( len ( title) ) :
print ( '标题:' , title[ index] )
if 'https' not in source_url[ index] :
s_url. append ( url+ source_url[ index] )
print ( '新闻链接:' , url+ source_url[ index] )
else :
print ( '新闻链接:' , source_url[ index] )
s_url. append ( source_url[ index] )
# print ( '源链接:' , url+ source_url[ index] )
print ( '头条号:' , source[ index] )
print ( len ( title) ) # 获取的新闻数量
if __name__ == '__main__' :
main ( max_behot_time, title, source_url, s_url, source, media_url)
savedata ( title, s_url, source, media_url)
Python爬虫——使用Python爬取代理数据
结构的分析以及网页数据的提取
/2 首页分析及提取/
简单分析下页面, 其中后面的 1 是页码的意思,分析后发现每一页有100 多条数据, 然后网站底部总共有 2700+页 的链接, 所以总共ip 代理加起来超过 27 万条数据, 但是后面的数据大部分都是很多年前的数据了,比如 2012 年, 大概就前 5000 多条是最近一个月的,所以决定爬取前面100 页。 通 过网站 url 分析,可以知道这 100 页的 url 为:
规律显而易见,在程序中,我们使用一个 for 循环即可完整这个操作: 其中 scrapy 函数是爬取的主要逻辑,对应的代码为: 通过这个方式,我们可以得到每一页的数据
/3 网页元素分析及提取/
接下来就是对页面内的元素进行分析,提取其中的代理信息。
如上图,我们目的是进行代理地域分布分析, 同时,在爬取过程中需要使用爬取的数据进行代 理更新, 所以需要以下几个字段的信息:
Ip 地址、端口、服务器位置、类型
为此,先构建一个类,用于保存这些信息:
这样,每爬取一条信息,只要实例化一个 ProxyBean 类即可,非常方便。
接下来就是提取元素过程了,
在这个过程我使用了正则表达式和 BeautifulSoup 库进行关键数据提取。
首先,通过分析网页发现,所有的条目实际上都是放在一个标签中。
该便签内容如下:
< table id= "ip_list" > ……< / table>
我们首先通过正则表达式将该标签的内容提取出来:
正则表达式为:,
表示搜索之 间的任意字符组成的数据。
Python 中的实现如下:
其中得到的 data 就是这个标签的内容了。下面进一步分析。
进入到 table 中,发现每一个代理分别站 table 的一列,
但是这些 标签分为两类,一 类包含属性 class="odd", 另一类不包含
通过这种方式,就能获取到每一个列的列表了。
接下来就是从每个列中获取 ip、端口、位置、类型等信息了。进一步分析页面:
我们使用正则表达式对 IP 进行解析,IP 正则如下:
** (2[0-5]{2}|[0-1]?\d{1,2})(.(2[0-5]{2}|[0-1]?\d{1,2})){3}**
2、 端口字段 端口由包裹,并且中间全部是数字,故可构造如下正则进行提取:
([0-9]+)
3、 位置字段
位置字段如下:
由 便签包裹,构造如下正则即可提取:
< a href= "( [ ^ > ] * ) > ( [ ^ < ] * ) < / a>
4、类型字段
类型字段如下:
由包裹,中间为字母,构造正则如下:
< td> ( [ A - Za- z] + ) < / td>
数据全部获取完之后,将其保存到文件中即可:
/4 小结/
本次任务主要爬取了代理网站上的代理数据。主要做了以下方面的工作:
学习 requests 库的使用以及爬虫程序的编写; 学习使用反爬虫技术手段,并在实际应用中应用这些技术,如代理池技术; 学习使用正则表达式,并通过正则表达式进行网页元素提取; 学习使用 beautifulsoup 库,并使用该库进行网页元素的提取。
IP代理池
import urllib. request
import urllib
import requests
import re
import time
import random
proxys = [ ]
def show_interface ( ) :
choice= input ( "请选择功能:1.显示可用代理;2.显示可用代理并生成文本;3.退出系统:" )
return choice
def get_proxyIP ( ) :
ip_title= [ ] #IP列表
try:
page_num= input ( '想要爬取多少个代理IP页面( 注:每个页面包含100 个IP地址, 输入数值大于等于2 ,小于等于705 ) :')
if int ( page_num) < 2 or int ( page_num) > 705 :
print ( ">>>>>已经说明清楚了,再乱输的是傻逼 o -_-)=○)°O°) 给你一拳!" )
return ip_title
else :
for i in range ( 1 , int ( page_num) ) :
url= 'http://www.xicidaili.com/nt/' + str ( i)
headers= { "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64)" }
request= urllib. request. Request ( url= url, headers= headers)
response= urllib. request. urlopen ( request)
content= response. read ( ) . decode ( 'utf-8' )
pattern= re. compile ( ' (\d.*?|HTTP|HTTPS) ')
ip_page= re. findall ( pattern, str ( content) )
ip_title. extend ( ip_page)
time. sleep ( random. choice ( range ( 1 , 3 ) ) )
print ( '代理IP地址 ' , '\t' , '端口' , '\t' , '类型' , '\t\t\t' , '存活时间' , '\t\t' , '验证时间' )
for i in range ( 0 , len ( ip_title) , 5 ) :
if len ( ip_title[ i] ) < 14 and len ( ip_title[ i] ) > 10 :
print ( ip_title[ i] , ' ' , '\t' , ip_title[ i+ 1 ] , '\t' , ip_title[ i+ 2 ] , '\t\t\t' , ip_title[ i+ 3 ] , '\t\t' , ip_title[ i+ 4 ] )
elif len ( ip_title[ i] ) <= 10 :
print ( ip_title[ i] , ' ' , '\t' , ip_title[ i + 1 ] , '\t' , ip_title[ i + 2 ] , '\t\t\t' , ip_title[ i + 3 ] , '\t\t' , ip_title[ i+ 4 ] )
else :
print ( ip_title[ i] , ' ' , '\t' , ip_title[ i+ 1 ] , '\t' , ip_title[ i+ 2 ] , '\t\t\t' , ip_title[ i+ 3 ] , '\t\t' , ip_title[ i+ 4 ] )
return ip_title
except ValueError:
print ( ">>>>>已经说明清楚了,再乱输的是傻逼 o -_-)=○)°O°) 给你一拳!" )
return ip_title
proxy_ip= open ( 'proxy_ip.txt' , 'w' ) #新建文档存储有效IP
def effective_IP ( ip_title) :
socket. setdefaulttimeout ( 5 ) #设置全局超时时间
url= 'https:
try:
for i in range ( 0 , len ( ip_title) , 5 ) :
ip= { ip_title[ i+ 2 ] : ip_title[ i] + ":" + ip_title[ i+ 1 ] }
proxy_support= urllib. request. ProxyHandler ( ip)
opener= urllib. request. build_opener ( proxy_support)
opener. addheaders= [ ( 'User-Agent' , 'Mozilla/ 5.0 ( Windows NT 10.0 ; WOW64) ') ]
urllib. request. install_opener ( opener)
res= urllib. request. urlopen ( url) . read ( )
print ( ip_title[ i] + ':' + ip_title[ i+ 1 ] , 'is OK' )
proxy_ip. write ( '%s\n' % str ( '\'' + ip_title[ i+ 2 ] + '\'' + ':' + '\'' + ip_title[ i] + ':' + ip_title[ i+ 1 ] + '\'' ) ) #写入IP
print ( '总共爬取了' + str ( len ( ip_title) / 5 ) + '个有效IP' )
except Exception as e:
print ( i, e)
if __name__== '__main__' :
print ( ' ')
print ( ' ')
print ( ' ◆◆ ◆◆◆◆◆ ◆◆◆◆◆◆◆◆◆◆◆◆◆◆ ')
print ( ' ◆◆ ◆◆ ◆◆◆ ◆ ◆◆ ◆ ◆ ◆◆◆◆ ◆◆◆◆◆◆◆ ')
print ( ' ◆◆ ◆ ◆◆ ◆ ◆ ◆ ◆ ◆◆◆ ◆◆◆◆◆◆◆◆ ')
print ( ' ◆◆◆ ◆ ◆◆◆ ◆ ◆◆◆◆◆◆◆◆◆ ◆◆ ◆◆ ◆◆◆◆ ')
print ( ' ◆◆◆◆◆◆◆◆◆◆◆◆◆◆ ◆ ◆ ◆ ◆ ◆◆ ◆◆ ◆◆◆ ')
print ( ' ◆◆◆ ◆◆ ◆ ◆ ◆ ◆ ◆◆ ◆◆ ◆◆◆◆ ')
print ( ' ◆◆◆ ◆◆ ◆◆◆◆◆◆◆ ◆ ◆◆ ◆◆ ◆◆◆◆◆◆◆ ')
print ( ' ◆ ◆ ◆◆ ◆ ◆◆◆◆◆◆◆◆◆ ◆◆ ◆◆◆◆◆◆ ')
print ( ' ◆ ◆◆ ◆ ◆ ◆◆ ◆◆ ')
print ( ' ◆ ◆◆ ◆ ◆ ◆◆ ◆◆ ')
print ( ' ◆ ◆◆ ◆ ◆ ◆◆◆◆◆◆◆◆◆ ◆◆ ◆◆ ')
print ( ' ◆ ◆◆◆ ◆◆ ◆◆◆ ◆ ◆◆◆◆◆ ◆◆◆◆◆◆ ')
print ( ' ◆ ◆◆ ◆◆ ◆◆◆◆ ◆ ')
print ( ' ◆ ◆◆◆◆ ◆◆◆◆ ◆◆◆◆◆◆◆◆◆◆◆ ')
print ( ' ◆ ◆◆ ')
print ( '' )
print ( '' )
choice = show_interface ( )
while True:
if choice== '1' :
get_proxyIP ( )
i= input ( ">>>>>还想继续使用该系统?(Y/N):" )
if i== 'Y' or i== 'y' :
choice= show_interface ( )
else :
print ( '>>>>>欢迎再次使用*_*,我也要睡觉觉了(-_-)ZZZ' )
break
if choice== '2' :
ip_title= get_proxyIP ( )
effective_IP ( ip_title)
i = input ( ">>>>>还想继续使用该系统?(Y/N):" )
if i == 'Y' or i == 'y' :
choice = show_interface ( )
else :
print ( '>>>>>欢迎再次使用*_*,我也要睡觉觉了(-_-)ZZZ' )
break
if choice== '3' :
print ( '>>>>>欢迎再次使用*_*,我也要睡觉觉了(-_-)ZZZ' )
break
import requests
import parsel
import time
def check_ip ( proxies_list) :
"" "检测ip的方法" ""
headers = { 'User-Agent' : 'Mozilla/ 5.0 ( Windows NT 10.0 ; Win64; x64) AppleWebKit/ 537.36 ( KHTML, like Gecko) Chrome/ 79.0 .3945 .79 Safari/ 537.36 '}
can_use = [ ]
for proxy in proxies_list:
try:
response = requests. get ( 'http://www.baidu.com' , headers= headers, proxies= proxy, timeout= 0.1 ) # 超时报错
if response. status_code == 200 :
can_use. append ( proxy)
except Exception as error:
print ( error)
return can_use
import requests
import parsel
# 1 、确定爬取的url路径,headers参数
base_url = 'https://www.kuaidaili.com/free/'
headers = { 'User-Agent' : 'Mozilla/ 5.0 ( Windows NT 10.0 ; Win64; x64) AppleWebKit/ 537.36 ( KHTML, like Gecko) Chrome/ 79.0 .3945 .79 Safari/ 537.36 '}
# 2 、发送请求 -- requests 模拟浏览器发送请求,获取响应数据
response = requests. get ( base_url, headers= headers)
data = response. text
# print ( data)
# 3 、解析数据 -- parsel 转化为Selector对象,Selector对象具有xpath的方法,能够对转化的数据进行处理
# 3 、1 转换python可交互的数据类型
html_data = parsel. Selector ( data)
# 3 、2 解析数据
parse_list = html_data. xpath ( '
# print ( parse_list)
# 免费 IP { "协议" : "IP:port" }
# 循环遍历,二次提取
proxies_list = [ ]
for tr in parse_list:
proxies_dict = { }
http_type = tr. xpath ( './td[4]/text()' ) . extract_first ( )
ip_num = tr. xpath ( './td[1]/text()' ) . extract_first ( )
port_num = tr. xpath ( './td[2]/text()' ) . extract_first ( )
# print ( http_type, ip_num, port_num)
# 构建代理ip字典
proxies_dict[ http_type] = ip_num + ':' + port_num
# print ( proxies_dict)
proxies_list. append ( proxies_dict)
print ( proxies_list)
print ( "获取到的代理ip数量:" , len ( proxies_list) , '个' )
# 检测代理ip可用性
can_use = check_ip ( proxies_list)
print ( "能用的代理:" , can_use)
print ( "能用的代理数量:" , len ( can_use) )
环境搭建
打开 安装
找到 可执行文件路径 (便于配置虚拟环境)
linux 环境配置
安装系统依赖包 sudo apt-get install libssl1.0.0 libssl-dev tcl tk sqlite sqlite3 libbz2-1.0 libbz2-dev libexpat1 libexpat1-dev libgdbm3 libgdbm-dev libreadline5 libreadline6 libreadline-dev libreadline6-dev libsqlite0 libsqlite0-dev libsqlite3-0 libsqlite3-dev openssl
上面的依赖包是ubuntu的安装源的包名,不同版本的linux包名可能不一样
下载源码包并解压
wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz
tar -xzvf Python-3.6.8.tgz -C /tmp
cd /tmp/Python-3.6.8/
把Python3.6安装到 /usr/local 目录
./configure --prefix=/usr/local
make
make altinstall
上面操作执行完成以后就可以执行:
python3.6 就可以进入python的交互环境了
注:
很多linux操作系统会默认安装python和python3,大家可以在终端中输入python或者python3就能查看是否默认安装了py2和py3的版本,如果没有安装可以使用
ln -s /usr/local/bin/python3.6 /usr/bin/python
或者 ln -s /usr/local/bin/python3.6 /usr/bin/python3
生成python或者python3直接运行的python3.6的软连接 安装pip
python3对应的pip很多linux操作系统没有默认安装, 可以通过
sudo apt-get install python3-pip
安装python3的pip 安装完成以后可以终端中输入: pip3 查看是否安装成功
后续的所有的关于pip中安装的命令,这里都使用 pip3 install XXX
#虚拟环境搭建#
不同项目 不同依赖包
python 版本不一样
所以需要 隔离的 py环境
我们使用 virtualenvwrapper (包装的env)
win 可以直接使用
linux mac 配置
sudo apt-get install python3.6
centos
再安装pip
virtualenv
pip install virtualenv
python爬虫——入门(1)
pymysql orm 保存数据
html解析方法 分析
抓取 静态网页 论坛
动态网站 电商类
模拟登陆cookie 社区类
验证突破
反爬虫突破
多线程 线程池
scrapy
通用分布式爬虫框架模块
更新迭代采集
通用解析方法
分布存储
#认识爬虫#
搜索引擎 之前 输入域名访问
搜索引擎 主动查询代替 被动浏览
怎么获取所有数据(我们关心的内容)
产生爬虫 爬取 索引
采集网络数据
自动化测试 (接口 请求 验证数据)selenium
脱离手动 (抢票 , 微信助手,爱聊,注册账号,登陆,获取资料)
灰产业 (撸羊毛,网络水军,攻击)
数据产品 数据聚合(新闻 ,头条)
搜索产品
数据分析、人工智能元数据
特定领域 数据服务(二手车估价,天气预报,团购,去哪儿)
#知识储备#
计算机网络 (http/https协议,tcp/ip协议,socket编程)
前端基础
正则表达式(数据处理)xpath css选择器
数据分布式存储
并发处理,多线程池,协程
图像识别(处理反扒,验证码)
机器学习算法(验证码,数据解析)
#学习问题#
大型爬虫 采集更新策略
解决 数据反爬虫 机制(多变)
数据解析
数据存储
模拟登陆(验证码识别)
爬虫监控 部署
数据去重
#爬虫正能量#
注意节制 限速/代理/线程 控制 减少频率
数据安全 robots.txt协议
法律问题 (2019.11.30 并不成熟)
可显数据
反扒策略
#robots协议#
Opencv for python
opencv 简介
强大的图像处理和计算机视觉库,实现了很多实用算法
安装
opencv包安装
opencv-python包(非官方):
pip install opencv- python
官方文档:https://opencv-python-tutroals.readthedocs.io/en/latest/
简单图像处理
图像像素存储形式
首先得了解下图像在计算机中存储形式: (为了方便画图,每列像素值都写一样了)
对于只有黑白颜色的灰度图,为单通道, 一个像素块对应矩阵中一个数字,数值为0到255, 其中0表示最暗(黑色) ,255表示最亮(白色)
对于采用RGB模式的彩色图片,为三通道图, Red、Green、Blue三原色, 按不同比例相加, 一个像素块对应矩阵中的一个向量, 如[24,180, 50], 分别表示三种颜色的比列,
即对应深度上的数字,如下图所示:
需要注意的是,由于历史遗留问题,opencv采用BGR模式,而不是RGB
Caffe,全称Convolutional Architecture for Fast Feature Embedding, 是一个兼具表达性、速度和思维模块化的深度学习框架。 由伯克利人工智能研究小组和伯克利视觉和学习中心开发。
图像读取和写入
imread ( img_path, flag) 读取图片,返回图片对象
img_path: 图片的路径,即使路径错误也不会报错,但打印返回的图片对象为None
flag:cv2. IMREAD_COLOR,读取彩色图片,图片透明性会被忽略,为默认参数,也可以传入1
cv2. IMREAD_GRAYSCALE, 按灰度模式读取图像,也可以传入0
cv2. IMREAD_UNCHANGED, 读取图像,包括其alpha通道,也可以传入- 1
imshow ( window_name, img) :显示图片,窗口自适应图片大小
window_name: 指定窗口的名字
img:显示的图片对象
可以指定多个窗口名称,显示多个图片
waitKey ( millseconds) 键盘绑定事件,阻塞监听键盘按键,返回一个数字(不同按键对应的数字不同)
millseconds: 传入时间毫秒数,在该时间内等待键盘事件;传入0 时,会一直等待键盘事件
destroyAllWindows ( window_name)
window_name: 需要关闭的窗口名字,不传入时关闭所有窗口
imwrite( img_path_name, img)
img_path_name: 保存的文件名
img:文件对象
#coding:utf-8
import cv2
img = cv2. imread ( r"C:\Users\Administrator\Desktop\roi.jpg" )
# print(img.shape)
img_gray = cv2. cvtColor( img, cv2. COLOR_BGR2GRAY)
ret, img_threshold = cv2. threshold( img_gray, 127, 255, cv2. THRESH_BINARY)
cv2. imshow ( "img" , img)
cv2. imshow ( "thre" , img_threshold)
key = cv2. waitKey ( 0 )
if key== 27 : #按esc键时,关闭所有窗口
print ( key)
cv2. destroyAllWindows ( )
cv2. imwrite ( r"C:\Users\Administrator\Desktop\thre.jpg" , img_threshold)
图像像素获取和编辑
img = cv2. imread ( r"C:\Users\Administrator\Desktop\roi.jpg" )
#获取和设置
pixel = img[ 100 , 100 ] #[ 57 63 68 ] , 获取( 100 , 100 ) 处的像素值
img[ 100 , 100 ] = [ 57 , 63 , 99 ] #设置像素值
b = img[ 100 , 100 , 0 ] #57 , 获取( 100 , 100 ) 处,blue通道像素值
g = img[ 100 , 100 , 1 ] #63
r = img[ 100 , 100 , 2 ] #68
r = img[ 100 , 100 , 2 ] = 99 #设置red通道值
#获取和设置
piexl = img. item( 100, 100, 2)
img. itemset ( ( 100 , 100 , 2 ) , 99 )
import cv2
img = cv2. imread ( r"C:\Users\Administrator\Desktop\roi.jpg" )
#rows,cols,channels
img. shape #返回( 280 , 450 , 3 ) , 宽280 ( rows) ,长450 ( cols) ,3 通道( channels)
#size
img. size #返回378000 ,所有像素数量,= 280 * 450 * 3
#type
img. dtype #dtype ( 'uint8')
ROI截取(Range of Interest) 矩形和多边形
#ROI,Range of instrest
roi = img[ 100 : 200 , 300 : 400 ] #截取100 行到200 行,列为300 到400 列的整块区域
img[ 50 : 150 , 200 : 300 ] = roi #将截取的roi移动到该区域 (50 到100 行,200 到300 列)
b = img[ : , : , 0 ] #截取整个蓝色通道
b, g, r = cv2. split ( img) #截取三个通道,比较耗时
img = cv2. merge ( ( b, g, r) )
cv2. copyMakeBorder ( )
参数:
img: 图像对象
top, bottom, left, right : 上下左右边界宽度,单位为像素值
borderType:
cv2. BORDER_CONSTANT, 带颜色的边界,需要传入另外一个颜色值
cv2. BORDER_REFLECT, 边缘元素的镜像反射做为边界
cv2. BORDER_REFLECT_101/ cv2. BORDER_DEFAULT
cv2. BORDER_REPLICATE, 边缘元素的复制做为边界
CV2. BORDER_WRAP
value : borderType为cv2. BORDER_CONSTANT时,传入的边界颜色值,如[ 0 , 255 , 0 ]
#coding:utf-8
import cv2 as cv
import matplotlib. pyplot as plt
img2 = cv. imread ( r"C:\Users\Administrator\Desktop\dog.jpg" )
img = cv. cvtColor ( img2, cv. COLOR_BGR2RGB) #matplotlib的图像为RGB格式
constant = cv. copyMakeBorder ( img, 20 , 20 , 20 , 20 , cv. BORDER_CONSTANT, value = [ 0 , 255 , 0 ] ) #绿色
reflect = cv. copyMakeBorder( img, 20, 20, 20, 20, cv. BORDER_REFLECT)
reflect01 = cv. copyMakeBorder( img, 20, 20, 20, 20, cv. BORDER_REFLECT_101)
replicate = cv. copyMakeBorder( img, 20, 20, 20, 20, cv. BORDER_REPLICATE)
wrap = cv. copyMakeBorder( img, 20, 20, 20, 20, cv. BORDER_WRAP)
titles = [ "constant" , "reflect" , "reflect01" , "replicate" , "wrap" ]
images = [ constant , reflect , reflect01 , replicate , wrap ]
for i in range ( 5 ) :
plt. subplot ( 2 , 3 , i+ 1 ) , plt. imshow ( images[ i] ) , plt. title ( titles[ i] )
plt. xticks ( [ ] ) , plt. yticks ( [ ] )
plt. show ( )
https://www.cnblogs.com/silence-cho/p/10926248.html
import cv2
import matplotlib. pyplot as plt
img = cv2. imread ( r"F:\1.jpg" )
# print(type(img))
# print(img.shape)
'''
< class 'numpy. ndarray'>
( 675 , 1200 , 3 )
'''
img_gray = cv2. cvtColor ( img, cv2. COLOR_BGR2GRAY)
#matplotlib的图像为RGB格式
content = cv2. copyMakeBorder ( img_gray, 20 , 20 , 20 , 20 , cv2. BORDER_CONSTANT, value = [ 0 , 255 , 0 ] )
ret, thre1 = cv2. threshold( img, 127, 255, cv2. THRESH_BINARY)
cv2. imshow ( "gray" , thre1)
title = [ "normal" , "gray" , "se" ]
imgs= [ img , img_gray , thre1 ]
for i in range ( 3 ) :
plt. subplot ( 2 , 2 , i+ 1 ) , plt. imshow ( imgs[ i] , "gray" )
plt. title ( title[ i] )
plt. xticks ( [ ] ) , plt. yticks ( [ ] )
plt. show ( )
key = cv2. waitKey ( 0 )
if key == 27 :
print ( key)
cv2. destroyAllWindows ( )
# https://blog.csdn.net/u010451780/article/details/106729827
# net = cv2.dnn.readNetFromCaffe()
# 用于读取已经训练好的caffe模型
# 参数说明: 1表示caffe网络的结构文本,2表示已经训练好的参数结果
# https://www.cnblogs.com/my-love-is-python/p/10455812.html
# https://www.baidu.com/s?ie=utf8&oe=utf8&wd=caffe%E6%A8%A1%E5%9E%8B%20%20openpose&tn=98010089_dg&ch=3
windows GUI python自动化
pywin32
QQ/微信 邮件 群发技术实现
由于外包开发 ,自己也需要 所以开发点 常用账号的 软件
添加依赖
pip install pyautogui
实验原理
itchat库
如果我们需要自己来分析这个接口,也不是不可以,但需要费时费力。 github用户littlecodersh已经做好了这个工作,它把接口都找出来,封装成python语言下的itchat库。 我们直接调用这个库就可以了。
微信itchat 手册 https://itchat.readthedocs.io/zh/latest/
关键点
微信个人号中的群发助手可以一次给30个发送消息,
如果要给所有所有群发,则需要自己手动发送多次,或者借助程序实现了。
在微信的官方网站上 https://weixin.qq.com/,提供了一个网页版的微信,地址为https://wx.qq.com/
登录该网页版微信后,可以在网页上给对方发送消息,通过抓包分析网页交互,可以得到发送消息的接口,
然后使用程序调用该接口,就可以给好友发送消息了。
把所有好友都找出来,然后排列依次给他们发送消息,这样就是群发。
win32 api获取窗口句柄
通过使用opencv对窗体控件进行识别,进而实现控制操作
对于简单的操作 (控制剪切板缓存、自动化keyboard操作、desktop光标移动、鼠标点击动作等)可以使用python的一些包进行 简单的模拟实现:pyautogui / pywin32 等。
pyautogui是美国一个知名python程序员也是优秀的python作者Al Sweigart维护的一个模块 整个模块都是python写的,可读性比较好,对一般功能的封装得很好。
pywin32就有点不一样了,这个完全是用python对win32 api接口进行python api的转换,用起来比较复杂, 对windows api及c sharp有一定了解,加上文档全但是基本就是原样包windows api的文档抄了一下,所以看起来是相当痛苦的。
(但是实际上pywin32跟pyautogui的思路都是使用windows api获取窗体程序句柄进而实现自动化操控,从 实现原理上看来,也注定这种方式是不可能完成过于复杂的UI自动化作业的。)
安装好之后,在程序中引用该库
import itchat
import os
import time
itchat. auto_login( hotReload= True )
print ( '纪年科技' )
print ( '微信营销工具' )
print ( '微信账号测试' )
print ( '请慎重使用' )
wxfriends = itchat. get_friends( )
num = len ( wxfriends)
print ( "此账号共有" , num , "位好友" )
for wxname in range ( 1 , num) :
itchat. send( "微信清理,请配合您回我一条信息备注身份,否则系统会清理掉记录以及好友信息 本人xxx" , toUserName= wxfriends[ wxname] [ 'UserName' ] )
print ( f'发送到第 { wxname} 位好友: { str ( wxfriends[ wxname] [ "NickName" ] ) . center( 20 , "x" ) } ' )
time. sleep( 5 )
print ( '此次消息发送完毕,请在系统联网查看结果' )
itchat. run( )
os. system( 'pause' )
QQ群发实现
pyHook 库获取: https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyhook https://pan.baidu.com/s/1IHk4kMTSm-FtmrGFPbu-Ng 提取码: c7fq
安装时用 pip install 然后直接把 whl 文件拖到 cmd 里就生成路径了
anaconda
win32gui库
env 虚拟环境
pyautogui
邮件群发
SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。
循环结构正弦幂级数展开及图像
import math
n = int ( input ( 'input order n(odd number): ' ) )
x = eval ( input ( 'input x: ' ) )
exact_sol = math. sin ( x)
s = 0
flag = 1
for i in range ( 1 , n+ 1 , 2 ) :
s + = flag * math. pow ( x, i) / math. factorial ( i)
flag = - flag
number_sol = s
print ( 'exact solution sin(%s)=%s' % ( x, exact_sol) )
print ( 'numerical solution = %s' % number_sol)
重写数组类对象结构实现
重写数组类
## 2020/4/27
class Myarray : #自定义数组类
def __init__ ( self, arr) :
"列表转换"
self. arr = list ( arr)
def Ladd ( self, x) :
"末尾添加元素"
self. arr. append ( x)
return self. arr
def Insert ( self, x, con) :
"指定位置添加内容"
self. arr. insert ( x, con)
return self. arr
def Switch ( self, x, con) :
"修改元素"
self. arr[ x] = con
return self. arr
def Ldel ( self, x) :
"删除指定元素"
self. arr. pop ( x)
return self. arr
a = Myarray ( range ( 10 ) ) #调用类转换
print ( list ( range ( 10 ) ) )
print ( a. Ladd ( 6 ) )
print ( a. Insert ( 5 , 777 ) )
print ( a. Switch ( 7 , 555 ) )
print ( a. Ldel ( 8 ) )
从数组中取下标 打印数组中元素
arr = input ( "" )
#输入一个一维数组,每个数之间使空格隔开
num = [ int ( n) for n in arr. split ( ) ]
#将输入每个数以空格键隔开做成数组
# print(num)
a = num
print ( a)
#打印数组
import random
num = range ( 0 , 100 ) # 范围在0 到100 之间,需要用到range ( ) 函数。
nums = random. sample ( num, 10 ) # 选取10 个元素
print ( nums)
res = [ ]
for x in a:
xx = nums[ x- 1 ]
res. append ( xx)
print ( res)
搭建python环境
走进python
解释型、面向对象、动态数据类型的高级程序设计语言
由 Guido van Rossum 于 1989 年底发明,
第一个公开发行版发行于 1991 年。
像 Perl 语言一样, Python 源代码同样遵循 GPL(GNU General Public License) 协议。
官方宣布,2020 年 1 月 1 日, 停止 Python 2 的更新。
Python 2.7 被确定为最后一个 Python 2.x 版本。
print ( "Hello, World!" )
print ( "Hello, World!" )
(Python 3.0+)
Python 3.0+ 版本已经把 print 作为一个内置函数
解析器
解析库 – lxml
安装lxml库 (支持HTML和XML解析,支持XPath解析方式)
pip install lxml
Xpath
在 XPath 中,有七种类型的节点: 元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。 XML 文档是被作为节点树来对待的。 树的根被称为文档节点或者根节点。
节点关系 父(Parent)、子(Children) 每个元素以及属性都有一个父。 book 元素是 title、author、year 以及 price 元素的父 title、author、year 以及 price 元素都是 book 元素的子 title、author、year 以及 price 元素都是同胞: title 元素的先辈是 book 元素和 bookstore 元素 bookstore 的后代是 book、title、author、year 以及 price 元素
节点选取
XPath 使用路径表达式在 XML 文档中选取节点。 节点是通过沿着路径或者 step 来选取的。
获取页面元素xpath路径的快捷方式
BeautifulSoup4解析器
BeautifulSoup4是一个HTML/XML的解析器, 主要的功能是解析和提取HTML/XML的数据。和lxml库一样 lxml只会局部遍历, 而BeautifulSoup4是基于HTML DOM的,会加载整个文档,解析整个DOM树, 因此内存开销比较大,性能比较低。
BeautifulSoup4用来解析HTML比较简单,API使用非常人性化, 支持CSS选择器,是Python标准库中的HTML解析器, 也支持lxml解析器。 ———————————————— BeautifulSoup4的安装
pip install beautifulsoup4
# 获取title标签
print ( soup. title)
# < title> The Dormouse's story< / title>
# 获取title标签名称
print ( soup. title. name)
# title
# 获取title标签的内容
print ( soup. title. string)
# The Dormouse's story
# 获取title的父标签
print ( soup. title. parent)
# < head> < title> The Dormouse's story< / title> < / head>
# 获取title的父标签名称
print ( soup. title. parent. name)
# head
# 获取p标签
print ( soup. p)
# < p class= "title" > < b> The Dormouse's story< / b> < / p>
# 获取p标签class属性
print ( soup. p[ 'class' ] )
# [ 'title' ] #返回的是list
# 获取所有的a标签
print ( soup. find_all ( 'a' ) )
# [ < a class= "sister" href= "http://example.com/elsie" id= "link1" > Elsie< / a> , < a class= "sister" href= "http://example.com/lacie" id= "link2" > Lacie< / a> , < a class= "sister" href= "http://example.com/tillie" id= "link3" > Tillie< / a> ]
# 获取id= 'link3' 的标签
print ( soup. find ( id= "link3" ) )
# < a class= "sister" href= "http://example.com/tillie" id= "link3" > Tillie< / a>
# 获取所有的a标签的链接
for link in soup. find_all ( 'a' ) :
print ( link. get ( 'href' ) )
# http :
# http :
# http :
# 获取文档中所有文字内容
print ( soup. get_text ( ) )
# The Dormouse's story
#
# The Dormouse's story
# Once upon a time there were three little sisters; and their names were
# Elsie,
# Lacie and
# Tillie;
# and they lived at the bottom of a well.
# . . .
文档
爬取文章自动发送QQ群
Python的re模块 正则表达式
正则表达式处理函数
特殊的字符序列 检查一个字符串是否与某种模式匹配 测试字符串内的模式。 —— 例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。 替换文本。 —— 可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。 基于模式匹配从字符串中提取子字符串。 —— 可以查找文档内或输入域内特定的文本。
贪婪模式和非贪婪模式
正则表达式通常使用于查找匹配字符串。 python里数量词默认是贪婪的,总是尝试匹配尽可能多的字符; 非贪婪模式正好相反,总是尝试匹配尽可能少的字符。 使用非贪婪模式的话,只需要在量词后面直接加上一个问号”?”。 贪婪模式可以与固化分组结合,提升匹配效率,而非贪婪模式却不可以。
方法/属性 作用
match() 只检查 RE 是否在字符串刚开始的位置匹配
只报告一次成功的匹配,它将从 0 处开始; 不是从 0 开始的 ,不会报告
search() 扫描整个字符串,找到这个 RE 匹配的位置
findall() 找到 RE 匹配的所有子串,并把它们作为一个列表返回
finditer() 找到 RE 匹配的所有子串,并把它们作为一个迭代器返回
- 如果匹配成功则返回一个Match Object对象,该对象有以下属性、方法:
方法/属性 作用
group() 返回re整体匹配的字符串
可以一次输入多个组号,对应组号匹配的字符串
group (n,m) 返回组号为n,m所匹配的字符串,如果组号不存在,则返回indexError异常
start() 返回匹配开始的位置
end() 返回匹配结束的位置
span() 返回一个元组包含匹配 (开始,结束) 的位置
re.compile 可以把正则表达式编译成一个正则表达式对象。 可以把那些经常使用的正则表达式编译成正则表达式对象,这样可以提高一定的效率。
re.findall 以列表形式 获取字符串中 返回所有匹配的字符串 Python 2.2中,也可以用 finditer() 方法
re.split 以列表形式返回分割的字符串
re.sub 替换所有的匹配项,返回一个替换后的字符串,如果匹配失败,返回原字符串
re.search 在字符串内查找匹配,找到第一个匹配,返回Match Object,或None
语法
'.' 匹配所有字符串,除\n以外
'-' 表示范围[0-9]
'*' 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。
'+' 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+
'^' 匹配字符串开头
'$' 匹配字符串结尾 re
'\' 转义字符, 使后一个字符改变原来的意思,如果字符串中有字符*需要匹配,可以\*或者字符集[*] re.findall(r'3\*','3*ds')结['3*']
'*' 匹配前面的字符0次或多次 re.findall("ab*","cabc3abcbbac")结果:['ab', 'ab', 'a']
'?' 匹配前一个字符串0次或1次 re.findall('ab?','abcabcabcadf')结果['ab', 'ab', 'ab', 'a']
'{m}' 匹配前一个字符m次 re.findall('cb{1}','bchbchcbfbcbb')结果['cb', 'cb']
'{n,m}' 匹配前一个字符n到m次 re.findall('cb{2,3}','bchbchcbfbcbb')结果['cbb']
'\d' 匹配数字,等于[0-9] re.findall('\d','电话:10086')结果['1', '0', '0', '8', '6']
'\D' 匹配非数字,等于[^0-9] re.findall('\D','电话:10086')结果['电', '话', ':']
'\w' 匹配字母和数字,等于[A-Za-z0-9] re.findall('\w','alex123,./;;;')结果['a', 'l', 'e', 'x', '1', '2', '3']
'\W' 匹配非英文字母和数字,等于[^A-Za-z0-9] re.findall('\W','alex123,./;;;')结果[',', '.', '/', ';', ';', ';']
'\s' 匹配空白字符 re.findall('\s','3*ds \t\n')结果[' ', '\t', '\n']
'\S' 匹配非空白字符 re.findall('\s','3*ds \t\n')结果['3', '*', 'd', 's']
'\A' 匹配字符串开头
'\Z' 匹配字符串结尾
'\b' 匹配单词的词首和词尾,单词被定义为一个字母数字序列,因此词尾是用空白符或非字母数字符来表示的
'\B' 与\b相反,只在当前位置不在单词边界时匹配
[] 是定义匹配的字符范围。比如 [a-zA-Z0-9] 表示相应位置的字符要匹配英文字符和数字。[\s*]表示空格或者*号
'(?P...)' 分组,除了原有编号外在指定一个额外的别名
re.search(“(?P[0-9]{4})(?P[0-9]{2})(?P[0-9]{8})”,“371481199306143242”).groupdict(“city”)
结果{‘province’: ‘3714’, ‘city’: ‘81’, ‘birthday’: ‘19930614’}
反斜杠的困扰
python 的字符串中, \ 是被当做转义字符的。
在正则表达式中,\ 也是被当做转义字符。
这就导致了一个问题: 如果你要匹配 \ 字符串,那么传递给 re.compile() 的字符串必须是"\\"。
由于字符串的转义, 所以实际传递给 re.compile() 的是"\“,然后再通过正则表达式的转义, “\” 会匹配到字符”"。
这样虽然可以正确匹配到字符 \,但是很麻烦,而且容易漏写反斜杠而导致 Bug。那么有什么好的解决方案呢?
原始字符串很好的解决了这个问题,通过在字符串前面添加一个r, 表示原始字符串,不让字符串的反斜杠发生转义。 那么就可以使用r"\"来匹配字符\了。
正则表达式实例
[Pp]ython 匹配 "Python" 或 "python"
rub[ye] 匹配 "ruby" 或 "rube"
[aeiou] 匹配中括号内的任意一个字母
[0-9] 匹配任何数字。类似于 [0123456789]
[a-z] 匹配任何小写字母
[A-Z] 匹配任何大写字母
[a-zA-Z0-9] 匹配任何字母及数字
[^aeiou] 除了aeiou字母以外的所有字符
[^0-9] 匹配除了数字外的字符
特殊字符类
. 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
\W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。
lxml中etree
xpath解析DOM树 ( XPath是一门在 XML文档中查找信息的语言)
方法:etree.HTML()和etree.tostrint()
解析字符串格式的HTML文档对象, 将传进去的字符串转变成_Element对象。 作为_Element对象, 可以方便的使用getparent()、remove()、xpath()等方法
2.用来将_Element对象转换成字符串。 一般通过简单的xpath表达式无法得到想要的内容的时候我就会用该方法
采用的etree去选取对应的xpath
组合成文档 (这边可将获取的html写入本地文件,看看是不是可以直接获取值得)
– url 访问
import urllib. request
url = "https://www.t00ls.net/"
res = urllib. request. Request ( url)
resfind = urllib. request. urlopen ( res)
data = resfind. read ( ) . decode ( 'utf- 8 ')
print ( data)
xpath语法 xxxooo
BeautifulSoup
import urllib. request
from bs4 import BeautifulSoup
url = "https://www.t00ls.net/"
res = urllib. request. Request ( url)
resfind = urllib. request. urlopen ( res)
data = resfind. read ( ) . decode ( 'utf-8' )
soup = BeautifulSoup ( data, 'html.parser' )
# print ( soup)
for k in soup. find_all ( 'a' ) :
# print ( k)
#查找href标签
link= k. get ( 'href' )
print ( link)
requests.get()参数
查询参数-params 1.参数类型 : 字典,字典中键值对作为查询参数
2.使用方法
1、res = requests.get(url,params=params,headers=headers) 2、特点:
url为基准的url地址,不包含查询参数
该方法会自动对params字典编码,然后和url拼接
web客户端验证 参数-auth
1.作用类型
1、针对于需要web客户端用户名密码认证的网站 2、auth = (‘username’,‘password’)
from urllib import request
from bs4 import BeautifulSoup
import numpy as np
url = "https://tophub.today/"
headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36' }
res = request. Request( url, headers= headers)
page = request. urlopen( res) . read( ) . decode( 'utf-8' )
soup = BeautifulSoup( page, 'html.parser' )
titles = soup. find_all( 'span' , 't' )
urls = soup. find_all( 'a' , rel= 'nofollow' )
urllink = [ ]
for url in urls:
xll = url. get( 'href' )
urllink. append( xll)
titlink = [ ]
for title in titles:
tit = title. get_text( )
titlink. append( tit)
for i in range ( 4 ) :
del urllink[ 0 ]
x = { }
x[ 0 ] = urllink
x[ 1 ] = titlink
y1 = zip ( x[ 0 ] , x[ 1 ] )
finish = [ ]
for xx in y1:
xxx = np. array( xx) . flatten( )
模拟登陆自动刷新
urllib2库的基本使用
所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地
urllib2 是 Python2.7 自带的模块(不需要下载,导入即可使用)
urllib2 官方文档:https://docs.python.org/2/library/urllib2.html
urllib2 源码:https://hg.python.org/cpython/file/2.7/Lib/urllib2.py
pip install virtualenv
选择想建立虚拟环境的文件夹
使用python 2.7 创建env环境
1.通过默认浏览器打开网页
import webbrowser
webbrowser.open ( "http://www.baidu.com" )
webbrowser.open(url, new=0, autoraise=True)
在系统的默认浏览器中访问url地址,
如果new=0, url会在同一个浏览器窗口中打开;
如果new=1,新的浏览器窗口会被打开;
new=2 新的浏览器tab会被打开
2.通过os模块,启动浏览器并打开指定网页
import os
os.system ( r'"C:\Program Files\internet explorer\iexplore.exe" http://www.baidu.com' )
3.使用selenium
from selenium import webdriver
url='http://www.baidu.com'
driver = webdriver.Firefox ( )
driver.get ( url)
Python黑帽子-Pentesters手记
视觉识别实战&&coreML
coreML 人工智能 物体识别
计算机从历史数据 找规律(客观数据)–>未来不确定(太阳爆炸)的场景自动决策
人脑判断评估局限性 (人为因素(成见,知识水平,思想层次))(迁带笔顺)
数据替代专家层面的学习
经济驱动 数据变现
离线学习---->模型 (用户行为模式特定变化)
在线学习 ----> 在线实时数据 ---->写入模型 ---->模型演化优化 (应用程序埋点–>收据数据–>数据分析---->需求分析 ---->程序撰写)
人工智能接口
监督学习 SupervisedML 条件分析
非监督学习 unSupervisedML
未来简史 从智人到神人 CS229 机器学习 (斯坦福大学) CoreML core image —>open cv/gl
像素点 高低 —>判断 RGB299,299----> image buffer
你可能感兴趣的:(python,开发语言)
理解Gunicorn:Python WSGI服务器的基石
范范0825
ipython linux 运维
理解Gunicorn:PythonWSGI服务器的基石介绍Gunicorn,全称GreenUnicorn,是一个为PythonWSGI(WebServerGatewayInterface)应用设计的高效、轻量级HTTP服务器。作为PythonWeb应用部署的常用工具,Gunicorn以其高性能和易用性著称。本文将介绍Gunicorn的基本概念、安装和配置,帮助初学者快速上手。1.什么是Gunico
Python数据分析与可视化实战指南
William数据分析
python python 数据
在数据驱动的时代,Python因其简洁的语法、强大的库生态系统以及活跃的社区,成为了数据分析与可视化的首选语言。本文将通过一个详细的案例,带领大家学习如何使用Python进行数据分析,并通过可视化来直观呈现分析结果。一、环境准备1.1安装必要库在开始数据分析和可视化之前,我们需要安装一些常用的库。主要包括pandas、numpy、matplotlib和seaborn等。这些库分别用于数据处理、数学
python os.environ
江湖偌大
python 深度学习
os.environ['TF_CPP_MIN_LOG_LEVEL']='0'#默认值,输出所有信息os.environ['TF_CPP_MIN_LOG_LEVEL']='1'#屏蔽通知信息(INFO)os.environ['TF_CPP_MIN_LOG_LEVEL']='2'#屏蔽通知信息和警告信息(INFO\WARNING)os.environ['TF_CPP_MIN_LOG_LEVEL']='
Python中os.environ基本介绍及使用方法
鹤冲天Pro
# Python python 服务器 开发语言
文章目录python中os.environos.environ简介os.environ进行环境变量的增删改查python中os.environ的使用详解1.简介2.key字段详解2.1常见key字段3.os.environ.get()用法4.环境变量的增删改查和判断是否存在4.1新增环境变量4.2更新环境变量4.3获取环境变量4.4删除环境变量4.5判断环境变量是否存在python中os.envi
Pyecharts数据可视化大屏:打造沉浸式数据分析体验
我的运维人生
信息可视化 数据分析 数据挖掘 运维开发 技术共享
Pyecharts数据可视化大屏:打造沉浸式数据分析体验在当今这个数据驱动的时代,如何将海量数据以直观、生动的方式展现出来,成为了数据分析师和企业决策者关注的焦点。Pyecharts,作为一款基于Python的开源数据可视化库,凭借其丰富的图表类型、灵活的配置选项以及高度的定制化能力,成为了构建数据可视化大屏的理想选择。本文将深入探讨如何利用Pyecharts打造数据可视化大屏,并通过实际代码案例
Python教程:一文了解使用Python处理XPath
旦莫
Python进阶 python 开发语言
目录1.环境准备1.1安装lxml1.2验证安装2.XPath基础2.1什么是XPath?2.2XPath语法2.3示例XML文档3.使用lxml解析XML3.1解析XML文档3.2查看解析结果4.XPath查询4.1基本路径查询4.2使用属性查询4.3查询多个节点5.XPath的高级用法5.1使用逻辑运算符5.2使用函数6.实战案例6.1从网页抓取数据6.1.1安装Requests库6.1.2代
python os.environ_python os.environ 读取和设置环境变量
weixin_39605414
python os.environ
>>>importos>>>os.environ.keys()['LC_NUMERIC','GOPATH','GOROOT','GOBIN','LESSOPEN','SSH_CLIENT','LOGNAME','USER','HOME','LC_PAPER','PATH','DISPLAY','LANG','TERM','SHELL','J2REDIR','LC_MONETARY','QT_QPA
使用Faiss进行高效相似度搜索
llzwxh888
faiss python
在现代AI应用中,快速和高效的相似度搜索是至关重要的。Faiss(FacebookAISimilaritySearch)是一个专门用于快速相似度搜索和聚类的库,特别适用于高维向量。本文将介绍如何使用Faiss来进行相似度搜索,并结合Python代码演示其基本用法。什么是Faiss?Faiss是一个由FacebookAIResearch团队开发的开源库,主要用于高维向量的相似性搜索和聚类。Faiss
python是什么意思中文-在python中%是什么意思
编程大乐趣
Python中%有两种:1、数值运算:%代表取模,返回除法的余数。如:>>>7%212、%操作符(字符串格式化,stringformatting),说明如下:%[(name)][flags][width].[precision]typecode(name)为命名flags可以有+,-,''或0。+表示右对齐。-表示左对齐。''为一个空格,表示在正数的左侧填充一个空格,从而与负数对齐。0表示使用0填
Day1笔记-Python简介&标识符和关键字&输入输出
~在杰难逃~
Python python 开发语言 大数据 数据分析 数据挖掘
大家好,从今天开始呢,杰哥开展一个新的专栏,当然,数据分析部分也会不定时更新的,这个新的专栏主要是讲解一些Python的基础语法和知识,帮助0基础的小伙伴入门和学习Python,感兴趣的小伙伴可以开始认真学习啦!一、Python简介【了解】1.计算机工作原理编程语言就是用来定义计算机程序的形式语言。我们通过编程语言来编写程序代码,再通过语言处理程序执行向计算机发送指令,让计算机完成对应的工作,编程
python八股文面试题分享及解析(1)
Shawn________
python
#1.'''a=1b=2不用中间变量交换a和b'''#1.a=1b=2a,b=b,aprint(a)print(b)结果:21#2.ll=[]foriinrange(3):ll.append({'num':i})print(11)结果:#[{'num':0},{'num':1},{'num':2}]#3.kk=[]a={'num':0}foriinrange(3):#0,12#可变类型,不仅仅改变
每日算法&面试题,大厂特训二十八天——第二十天(树)
肥学
⚡算法题⚡面试题每日精进 java 算法 数据结构
目录标题导读算法特训二十八天面试题点击直接资料领取导读肥友们为了更好的去帮助新同学适应算法和面试题,最近我们开始进行专项突击一步一步来。上一期我们完成了动态规划二十一天现在我们进行下一项对各类算法进行二十八天的一个小总结。还在等什么快来一起肥学进行二十八天挑战吧!!特别介绍小白练手专栏,适合刚入手的新人欢迎订阅编程小白进阶python有趣练手项目里面包括了像《机器人尬聊》《恶搞程序》这样的有趣文章
Python快速入门 —— 第三节:类与对象
孤华暗香
Python快速入门 python 开发语言
第三节:类与对象目标:了解面向对象编程的基础概念,并学会如何定义类和创建对象。内容:类与对象:定义类:class关键字。类的构造函数:__init__()。类的属性和方法。对象的创建与使用。示例:classStudent:def__init__(self,name,age,major):self.name
pyecharts——绘制柱形图折线图
2224070247
信息可视化 python java 数据可视化
一、pyecharts概述自2013年6月百度EFE(ExcellentFrontEnd)数据可视化团队研发的ECharts1.0发布到GitHub网站以来,ECharts一直备受业界权威的关注并获得广泛好评,成为目前成熟且流行的数据可视化图表工具,被应用到诸多数据可视化的开发领域。Python作为数据分析领域最受欢迎的语言,也加入ECharts的使用行列,并研发出方便Python开发者使用的数据
Python 实现图片裁剪(附代码) | Python工具
剑客阿良_ALiang
前言本文提供将图片按照自定义尺寸进行裁剪的工具方法,一如既往的实用主义。环境依赖ffmpeg环境安装,可以参考我的另一篇文章:windowsffmpeg安装部署_阿良的博客-CSDN博客本文主要使用到的不是ffmpeg,而是ffprobe也在上面这篇文章中的zip包中。ffmpy安装:pipinstallffmpy-ihttps://pypi.douban.com/simple代码不废话了,上代码
【华为OD技术面试真题 - 技术面】- python八股文真题题库(4)
算法大师
华为od 面试 python
华为OD面试真题精选专栏:华为OD面试真题精选目录:2024华为OD面试手撕代码真题目录以及八股文真题目录文章目录华为OD面试真题精选**1.Python中的`with`**用途和功能自动资源管理示例:文件操作上下文管理协议示例代码工作流程解析优点2.\_\_new\_\_和**\_\_init\_\_**区别__new____init__区别总结3.**切片(Slicing)操作**基本切片语法
python os 环境变量
CV矿工
python 开发语言 numpy
环境变量:环境变量是程序和操作系统之间的通信方式。有些字符不宜明文写进代码里,比如数据库密码,个人账户密码,如果写进自己本机的环境变量里,程序用的时候通过os.environ.get()取出来就行了。os.environ是一个环境变量的字典。环境变量的相关操作importos"""设置/修改环境变量:os.environ[‘环境变量名称’]=‘环境变量值’#其中key和value均为string类
Python爬虫解析工具之xpath使用详解
eqa11
python 爬虫 开发语言
文章目录Python爬虫解析工具之xpath使用详解一、引言二、环境准备1、插件安装2、依赖库安装三、xpath语法详解1、路径表达式2、通配符3、谓语4、常用函数四、xpath在Python代码中的使用1、文档树的创建2、使用xpath表达式3、获取元素内容和属性五、总结Python爬虫解析工具之xpath使用详解一、引言在Python爬虫开发中,数据提取是一个至关重要的环节。xpath作为一门
【华为OD技术面试真题 - 技术面】- python八股文真题题库(1)
算法大师
华为od 面试 python
华为OD面试真题精选专栏:华为OD面试真题精选目录:2024华为OD面试手撕代码真题目录以及八股文真题目录文章目录华为OD面试真题精选1.数据预处理流程数据预处理的主要步骤工具和库2.介绍线性回归、逻辑回归模型线性回归(LinearRegression)模型形式:关键点:逻辑回归(LogisticRegression)模型形式:关键点:参数估计与评估:3.python浅拷贝及深拷贝浅拷贝(Shal
nosql数据库技术与应用知识点
皆过客,揽星河
NoSQL nosql 数据库 大数据 数据分析 数据结构 非关系型数据库
Nosql知识回顾大数据处理流程数据采集(flume、爬虫、传感器)数据存储(本门课程NoSQL所处的阶段)Hdfs、MongoDB、HBase等数据清洗(入仓)Hive等数据处理、分析(Spark、Flink等)数据可视化数据挖掘、机器学习应用(Python、SparkMLlib等)大数据时代存储的挑战(三高)高并发(同一时间很多人访问)高扩展(要求随时根据需求扩展存储)高效率(要求读写速度快)
《Python数据分析实战终极指南》
xjt921122
python 数据分析 开发语言
对于分析师来说,大家在学习Python数据分析的路上,多多少少都遇到过很多大坑**,有关于技能和思维的**:Excel已经没办法处理现有的数据量了,应该学Python吗?找了一大堆Python和Pandas的资料来学习,为什么自己动手就懵了?跟着比赛类公开数据分析案例练了很久,为什么当自己面对数据需求还是只会数据处理而没有分析思路?学了对比、细分、聚类分析,也会用PEST、波特五力这类分析法,为啥
Python中深拷贝与浅拷贝的区别
yuxiaoyu.
转自:http://blog.csdn.net/u014745194/article/details/70271868定义:在Python中对象的赋值其实就是对象的引用。当创建一个对象,把它赋值给另一个变量的时候,python并没有拷贝这个对象,只是拷贝了这个对象的引用而已。浅拷贝:拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。也就是,把对象复制一遍,但是该对象中引用的其他对象我不复
Python开发常用的三方模块如下:
换个网名有点难
python 开发语言
Python是一门功能强大的编程语言,拥有丰富的第三方库,这些库为开发者提供了极大的便利。以下是100个常用的Python库,涵盖了多个领域:1、NumPy,用于科学计算的基础库。2、Pandas,提供数据结构和数据分析工具。3、Matplotlib,一个绘图库。4、Scikit-learn,机器学习库。5、SciPy,用于数学、科学和工程的库。6、TensorFlow,由Google开发的开源机
Python编译器
鹿鹿~
Python编译器 Python python 开发语言 后端
嘿嘿嘿我又来了啊有些小盆友可能不知道Python其实是有编译器的,也就是PyCharm。你们可能会问到这个是干嘛的又不可以吃也不可以穿好像没有什么用,其实你还说对了这个还真的不可以吃也不可以穿,但是它用来干嘛的呢。用来编译你所打出的代码进行运行(可能这里说的有点不对但是只是个人认为)现在我们来说说PyCharm是用来干嘛的。PyCharm是一种PythonIDE,带有一整套可以帮助用户在使用Pyt
一文掌握python面向对象魔术方法(二)
程序员neil
python python 开发语言
接上篇:一文掌握python面向对象魔术方法(一)-CSDN博客目录六、迭代和序列化:1、__iter__(self):定义迭代器,使得类可以被for循环迭代。2、__getitem__(self,key):定义索引操作,如obj[key]。3、__setitem__(self,key,value):定义赋值操作,如obj[key]=value。4、__delitem__(self,key):定义
一文掌握python常用的list(列表)操作
程序员neil
python python 开发语言
目录一、创建列表1.直接创建列表:2.使用list()构造器3.使用列表推导式4.创建空列表二、访问列表元素1.列表支持通过索引访问元素,索引从0开始:2.还可以使用切片操作访问列表的一部分:三、修改列表元素四、添加元素1.append():在末尾添加元素2.insert():在指定位置插入元素五、删除元素1.del:删除指定位置的元素2.remove():删除指定值的第一个匹配项3.pop():
Python实现简单的机器学习算法
master_chenchengg
python python 办公效率 python开发 IT
Python实现简单的机器学习算法开篇:初探机器学习的奇妙之旅搭建环境:一切从安装开始必备工具箱第一步:安装Anaconda和JupyterNotebook小贴士:如何配置Python环境变量算法初体验:从零开始的Python机器学习线性回归:让数据说话数据准备:从哪里找数据编码实战:Python实现线性回归模型评估:如何判断模型好坏逻辑回归:从分类开始理论入门:什么是逻辑回归代码实现:使用skl
python中的深拷贝与浅拷贝
anshejd70787
python
深拷贝和浅拷贝浅拷贝的时候,修改原来的对象,浅拷贝的对象不会发生改变。1、对象的赋值对象的赋值实际上是对象之间的引用:当创建一个对象,然后将这个对象赋值给另外一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用。当对对象做赋值或者是参数传递或者作为返回值的时候,总是传递原始对象的引用,而不是一个副本。如下所示:>>>aList=["kel","abc",123]>>>bLis
用Python实现简单的猜数字游戏
程序媛了了
python 游戏 java
猜数字游戏代码:importrandomdefpythonit():a=random.randint(1,100)n=int(input("输入你猜想的数字:"))whilen!=a:ifn>a:print("很遗憾,猜大了")n=int(input("请再次输入你猜想的数字:"))elifna::如果玩家猜的数字n大于随机数字a,则输出"很遗憾,猜大了",并提示玩家再次输入。elifn
用Python实现读取统计单词个数
程序媛了了
python 游戏 java
完整实例代码:fromcollectionsimportCounterdefpythonit():danci={}withopen("pythonit.txt","r",encoding="utf-8")asf:foriinf:words=i.strip().split()forwordinwords:ifwordnotindanci:danci[word]=1else:danci[word]+=
HQL之投影查询
归来朝歌
HQL Hibernate 查询语句 投影查询
在HQL查询中,常常面临这样一个场景,对于多表查询,是要将一个表的对象查出来还是要只需要每个表中的几个字段,最后放在一起显示?
针对上面的场景,如果需要将一个对象查出来:
HQL语句写“from 对象”即可
Session session = HibernateUtil.openSession();
Spring整合redis
bylijinnan
redis
pom.xml
<dependencies>
<!-- Spring Data - Redis Library -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redi
org.hibernate.NonUniqueResultException: query did not return a unique result: 2
0624chenhong
Hibernate
参考:http://blog.csdn.net/qingfeilee/article/details/7052736
org.hibernate.NonUniqueResultException: query did not return a unique result: 2
在项目中出现了org.hiber
android动画效果
不懂事的小屁孩
android动画
前几天弄alertdialog和popupwindow的时候,用到了android的动画效果,今天专门研究了一下关于android的动画效果,列出来,方便以后使用。
Android 平台提供了两类动画。 一类是Tween动画,就是对场景里的对象不断的进行图像变化来产生动画效果(旋转、平移、放缩和渐变)。
第二类就是 Frame动画,即顺序的播放事先做好的图像,与gif图片原理类似。
js delete 删除机理以及它的内存泄露问题的解决方案
换个号韩国红果果
JavaScript
delete删除属性时只是解除了属性与对象的绑定,故当属性值为一个对象时,删除时会造成内存泄露 (其实还未删除)
举例:
var person={name:{firstname:'bob'}}
var p=person.name
delete person.name
p.firstname -->'bob'
// 依然可以访问p.firstname,存在内存泄露
Oracle将零干预分析加入网络即服务计划
蓝儿唯美
oracle
由Oracle通信技术部门主导的演示项目并没有在本月较早前法国南斯举行的行业集团TM论坛大会中获得嘉奖。但是,Oracle通信官员解雇致力于打造一个支持零干预分配和编制功能的网络即服务(NaaS)平台,帮助企业以更灵活和更适合云的方式实现通信服务提供商(CSP)的连接产品。这个Oracle主导的项目属于TM Forum Live!活动上展示的Catalyst计划的19个项目之一。Catalyst计
spring学习——springmvc(二)
a-john
springMVC
Spring MVC提供了非常方便的文件上传功能。
1,配置Spring支持文件上传:
DispatcherServlet本身并不知道如何处理multipart的表单数据,需要一个multipart解析器把POST请求的multipart数据中抽取出来,这样DispatcherServlet就能将其传递给我们的控制器了。为了在Spring中注册multipart解析器,需要声明一个实现了Mul
POJ-2828-Buy Tickets
aijuans
ACM_POJ
POJ-2828-Buy Tickets
http://poj.org/problem?id=2828
线段树,逆序插入
#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>using namespace std;#define N 200010struct
Java Ant build.xml详解
asia007
build.xml
1,什么是antant是构建工具2,什么是构建概念到处可查到,形象来说,你要把代码从某个地方拿来,编译,再拷贝到某个地方去等等操作,当然不仅与此,但是主要用来干这个3,ant的好处跨平台 --因为ant是使用java实现的,所以它跨平台使用简单--与ant的兄弟make比起来语法清晰--同样是和make相比功能强大--ant能做的事情很多,可能你用了很久,你仍然不知道它能有
android按钮监听器的四种技术
百合不是茶
android xml配置 监听器 实现接口
android开发中经常会用到各种各样的监听器,android监听器的写法与java又有不同的地方;
1,activity中使用内部类实现接口 ,创建内部类实例 使用add方法 与java类似
创建监听器的实例
myLis lis = new myLis();
使用add方法给按钮添加监听器
软件架构师不等同于资深程序员
bijian1013
程序员 架构师 架构设计
本文的作者Armel Nene是ETAPIX Global公司的首席架构师,他居住在伦敦,他参与过的开源项目包括 Apache Lucene,,Apache Nutch, Liferay 和 Pentaho等。
如今很多的公司
TeamForge Wiki Syntax & CollabNet User Information Center
sunjing
TeamForge How do Attachement Anchor Wiki Syntax
the CollabNet user information center http://help.collab.net/
How do I create a new Wiki page?
A CollabNet TeamForge project can have any number of Wiki pages. All Wiki pages are linked, and
【Redis四】Redis数据类型
bit1129
redis
概述
Redis是一个高性能的数据结构服务器,称之为数据结构服务器的原因是,它提供了丰富的数据类型以满足不同的应用场景,本文对Redis的数据类型以及对这些类型可能的操作进行总结。
Redis常用的数据类型包括string、set、list、hash以及sorted set.Redis本身是K/V系统,这里的数据类型指的是value的类型,而不是key的类型,key的类型只有一种即string
SSH2整合-附源码
白糖_
eclipse spring tomcat Hibernate Google
今天用eclipse终于整合出了struts2+hibernate+spring框架。
我创建的是tomcat项目,需要有tomcat插件。导入项目以后,鼠标右键选择属性,然后再找到“tomcat”项,勾选一下“Is a tomcat project”即可。具体方法见源码里的jsp图片,sql也在源码里。
补充1:项目中部分jar包不是最新版的,可能导
[转]开源项目代码的学习方法
braveCS
学习方法
转自:
http://blog.sina.com.cn/s/blog_693458530100lk5m.html
http://www.cnblogs.com/west-link/archive/2011/06/07/2074466.html
1)阅读features。以此来搞清楚该项目有哪些特性2)思考。想想如果自己来做有这些features的项目该如何构架3)下载并安装d
编程之美-子数组的最大和(二维)
bylijinnan
编程之美
package beautyOfCoding;
import java.util.Arrays;
import java.util.Random;
public class MaxSubArraySum2 {
/**
* 编程之美 子数组之和的最大值(二维)
*/
private static final int ROW = 5;
private stat
读书笔记-3
chengxuyuancsdn
jquery笔记 resultMap配置 ibatis一对多配置
1、resultMap配置
2、ibatis一对多配置
3、jquery笔记
1、resultMap配置
当<select resultMap="topic_data">
<resultMap id="topic_data">必须一一对应。
(1)<resultMap class="tblTopic&q
[物理与天文]物理学新进展
comsci
如果我们必须获得某种地球上没有的矿石,才能够进行某些能量输出装置的设计和建造,而要获得这种矿石,又必须首先进行深空探测,而要进行深空探测,又必须获得这种能量输出装置,这个矛盾的循环,会导致地球联盟在与宇宙文明建立关系的时候,陷入困境
怎么办呢?
 
Oracle 11g新特性:Automatic Diagnostic Repository
daizj
oracle ADR
Oracle Database 11g的FDI(Fault Diagnosability Infrastructure)是自动化诊断方面的又一增强。
FDI的一个关键组件是自动诊断库(Automatic Diagnostic Repository-ADR)。
在oracle 11g中,alert文件的信息是以xml的文件格式存在的,另外提供了普通文本格式的alert文件。
这两份log文
简单排序:选择排序
dieslrae
选择排序
public void selectSort(int[] array){
int select;
for(int i=0;i<array.length;i++){
select = i;
for(int k=i+1;k<array.leng
C语言学习六指针的经典程序,互换两个数字
dcj3sjt126com
c
示例程序,swap_1和swap_2都是错误的,推理从1开始推到2,2没完成,推到3就完成了
# include <stdio.h>
void swap_1(int, int);
void swap_2(int *, int *);
void swap_3(int *, int *);
int main(void)
{
int a = 3;
int b =
php 5.4中php-fpm 的重启、终止操作命令
dcj3sjt126com
PHP
php 5.4中php-fpm 的重启、终止操作命令:
查看php运行目录命令:which php/usr/bin/php
查看php-fpm进程数:ps aux | grep -c php-fpm
查看运行内存/usr/bin/php -i|grep mem
重启php-fpm/etc/init.d/php-fpm restart
在phpinfo()输出内容可以看到php
线程同步工具类
shuizhaosi888
同步工具类
同步工具类包括信号量(Semaphore)、栅栏(barrier)、闭锁(CountDownLatch)
闭锁(CountDownLatch)
public class RunMain {
public long timeTasks(int nThreads, final Runnable task) throws InterruptedException {
fin
bleeding edge是什么意思
haojinghua
DI
不止一次,看到很多讲技术的文章里面出现过这个词语。今天终于弄懂了——通过朋友给的浏览软件,上了wiki。
我再一次感到,没有辞典能像WiKi一样,给出这样体贴人心、一清二楚的解释了。为了表达我对WiKi的喜爱,只好在此一一中英对照,给大家上次课。
In computer science, bleeding edge is a term that
c中实现utf8和gbk的互转
jimmee
c iconv utf8&gbk编码
#include <iconv.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/stat.h>
int code_c
大型分布式网站架构设计与实践
lilin530
应用服务器 搜索引擎
1.大型网站软件系统的特点?
a.高并发,大流量。
b.高可用。
c.海量数据。
d.用户分布广泛,网络情况复杂。
e.安全环境恶劣。
f.需求快速变更,发布频繁。
g.渐进式发展。
2.大型网站架构演化发展历程?
a.初始阶段的网站架构。
应用程序,数据库,文件等所有的资源都在一台服务器上。
b.应用服务器和数据服务器分离。
c.使用缓存改善网站性能。
d.使用应用
在代码中获取Android theme中的attr属性值
OliveExcel
android theme
Android的Theme是由各种attr组合而成, 每个attr对应了这个属性的一个引用, 这个引用又可以是各种东西.
在某些情况下, 我们需要获取非自定义的主题下某个属性的内容 (比如拿到系统默认的配色colorAccent), 操作方式举例一则:
int defaultColor = 0xFF000000;
int[] attrsArray = { andorid.r.
基于Zookeeper的分布式共享锁
roadrunners
zookeeper 分布式 共享锁
首先,说说我们的场景,订单服务是做成集群的,当两个以上结点同时收到一个相同订单的创建指令,这时并发就产生了,系统就会重复创建订单。等等......场景。这时,分布式共享锁就闪亮登场了。
共享锁在同一个进程中是很容易实现的,但在跨进程或者在不同Server之间就不好实现了。Zookeeper就很容易实现。具体的实现原理官网和其它网站也有翻译,这里就不在赘述了。
官
两个容易被忽略的MySQL知识
tomcat_oracle
mysql
1、varchar(5)可以存储多少个汉字,多少个字母数字? 相信有好多人应该跟我一样,对这个已经很熟悉了,根据经验我们能很快的做出决定,比如说用varchar(200)去存储url等等,但是,即使你用了很多次也很熟悉了,也有可能对上面的问题做出错误的回答。 这个问题我查了好多资料,有的人说是可以存储5个字符,2.5个汉字(每个汉字占用两个字节的话),有的人说这个要区分版本,5.0
zoj 3827 Information Entropy(水题)
阿尔萨斯
format
题目链接:zoj 3827 Information Entropy
题目大意:三种底,计算和。
解题思路:调用库函数就可以直接算了,不过要注意Pi = 0的时候,不过它题目里居然也讲了。。。limp→0+plogb(p)=0,因为p是logp的高阶。
#include <cstdio>
#include <cstring>
#include <cmath&