python之最常用的模块一箩筐
其实我挺羡慕火车的
为什么?
他们连擦肩而过都那么久
request模块:
requests 是一个功能强大、简单易用的 HTTP 请求库
- 请求
requests.get('http://httpbin.org/get')
requests.post('http://httpbin.org/post')
requests.put('http://httpbin.org/put')
requests.delete('http://httpbin.org/delete')
requests.head('http://httpbin.org/get')
requests.options('http://httpbin.org/get')
- 响应
r.url:返回请求网站的 URL
r.status_code:返回响应的状态码
r.encoding:返回响应的编码方式
r.cookies:返回响应的 Cookie 信息
r.headers:返回响应头
r.headers[‘host’]:返回响应头某属性
r.content:返回 bytes 类型的响应体
r.text:返回字符串,也就是页面文本
r.content: 返回内容的二进制形式
r.json():返回josn字典
最常用也就get/post,常用参数
url
cookie
params get形式的参数
data post形式的参数
headers 修改请求头,伪装浏览器等等
timeout 超时时间
proxies 设置代理
举个荔枝,请求百度
# encoding:utf-8
import requests
head = {
'User-Agent': '',
'Referer': '11111'
}
values = {
'name': 'cat',
'id': '1'
}
proxy = {"http": "http://127.0.0.1:8080"}
cookie = {'name': 'gggg'}
site = "http://www.baidu.com/"
# 请求方式主要为get传值用params,post传值用data
#response = requests.get(url=site,headers=head,params=values,proxies=proxy,cookies=cookie, timeout=3)
response = requests.post(url=site, headers=head, data=values, proxies=proxy, cookies=cookie)
print(response)
print(response.url)
print(response.cookies)
print(response.status_code)
print(response.encoding)
print(response.content)
print(response.headers)
print(response.url)
print(response.text)
print(response.json())
print(response.history)
BeautifulSoup模块:
简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据,将 html 解析为对象进行处理。
BeautifulSoup 不仅支持 HTML 解析器,还lxml,XML,html5lib 解析器,需要安装相应的库。如果不安装,则 Python 会使用 Python 默认的解析器,其中 lxml 解析器推荐
一般BS4将HTML文档对象会转换成如下四种类型组合的文档树:
- Tag:标签对象
- NavigableString:字符内容, soup.p.string
- BeautifulSoup:表示的是一个文档的全部内容
- Comment:特殊类型的NavigableString, 如果标签中有注释,则是 comment 对象,可通过 if type(soup.p.string) != bs4.element.Comment:.判断
主要还是Tag也就是标签,如html页面中的
,
等等都是tag,而Beautiful Soup可以轻松获取 各种Tags
如:
soup.title
soup.head
soup.a
soup.p
soup.p.name #p标签的名字
soup.p.string #p标签的内容
soup.p.attrs #p标签的属性,返回的是一个字典
soup.p['class'] #p标签的class属性
需求总是多样的,也可以利用find() 和 find_all()是这两个函数,可以准确的通过标签的不同属性轻松地过滤 HTML 页面,查找需要的标签组或单个标签。唯一的区别是 find_all() 方法的返回结果是值包含一个元素的列表,而 find() 方法直接返回结果.这个语句可以完美诠释两者关系:
soup.find_all('title', limit=1)==soup.find('title')
主要介绍find_all() 方法搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件。
find_all( name , attrs , recursive , text , **kwargs )
name :查找所有名字为 name 的tag,字符串对象会被自动忽略掉;
attrs:根据属性查询,使用字典类型;
text :可以搜搜文档中的字符串内容.与 name 参数的可选值一样, text 参数接受字符串 , 正则表达式 , 列表, True ;
recursive:调用tag的 find_all() 方法时,Beautiful Soup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数 recursive=False ;
limit:find_all() 方法返回全部的搜索结构,如果我们不需要全部结果,可以使用 limit 参数限制返回结果的数量.效果与SQL中的limit关键字类似,当搜索到的结果数量达到 limit 的限制时,就停止搜索返回结果;
class_ :通过 class_ 参数搜索有指定CSS类名的tag,class_ 参数同样接受不同类型的 过滤器 ,字符串,正则表达式,方法或 True。
是不是想说什么乱七八糟的,举个栗子看看,看完还可以吃了
# encoding:utf-8
from bs4 import BeautifulSoup
import re
html = '''
'''
soup = BeautifulSoup(html, 'html.parser')
# 根据name查询节点
print("name为ul的节点:", soup.find_all(name='ul'))
# 根据attrs查询节点
print('根据attr查询节点:', soup.find_all(attrs={'name': 'one'}))
print('根据attr查询节点:', soup.find_all(attrs={'class': 'cls5'}))
# 根据text查询节点
print('根据text查询节点:', soup.find_all(text='3333333333'))
print('根据text查询节点1:', soup.find_all(text=re.compile("abc")))
# 根据class_查询
print('根据class_查询节点:', soup.find_all(class_='cls3'))
# 根据id查询
print('根据id查询节点:', soup.find_all(id='aaa'))
# 设置limit
print('不设置limit:', soup.ul.find_all(name='li'))
print('设置limit为1:', soup.ul.find_all(name='li', limit=2))
如果取其中href,可以
link.a['href'] or link.a.get('href')
也可以通过css类名查找
在查找的时候,如果是标签名不加任何修饰,如果是类名前加点,如果id名前加#
利用 soup.select() , 返回类型是list
举个例子:
111
通过标签名查找
print(soup.select('title')) ##打印出标签是title的
通过类名查找
print(soup.select('.b')) ##打印出class类名是b的
通过id名查找
print(soup.select('#abc')) ##打印出id名是abc的
组合查找
print(soup.select('p #abc’ b')) ##打印出p标签中,id=abc,class=b的
属性查找(注意属性和标签属于同一节点.)
print(soup.select("a[class='b']")) ##打印出a标签中class属性是b的
以上的select方法返回的结果都是列表形式,可以遍历形式输出,然后用get_text()方法来获取他的内容
for i in soup.select('a'):
print(i.get_text()) ##打印出a标签中的文本
urlparse模块:
-
urlparse.urlparse模块主要就是将url解析为6个组件,并以元组形式返回,返回的6个部分,分别是:scheme(协议)、netloc(网络位置)、path(路径)、params(路径段参数)、query(查询)、fragment(片段)。
举个例子:
Import urlparse
a = urlparse.urlparse(‘https:www.cat.com:8080/cat.php?cat=1’)
输出的结果为
ParseResult(scheme='https', netloc='www.cat.com:8080', path='/cat.php', params='', query='cat=1, fragment='')
Print a.netloc 为 www.cat.com
Print a.hostname 为 www.cat.com
Print a.port 为 8080
- urlparse.urlsplit和urlparse差不多,将url分为5部分,返回一个包含5个字符串项目的元组:协议、位置、路径、查询、片段
-
urlparse.urljoin主要是拼接URL,它以base作为其基地址,然后与url中的相对地址相结合组成一个绝对URL地址.最重要就是看/进行替换添加,如果最后路径没有/,即追溯到上一个/进行替换添加
举个例子:
Import urlparse
A = urlparse.urljoin('http://www.cat.com/cat.php,'dog.php')
输出为
http://www.cat.com/dog.php
A = urlparse.urljoin('http://www.cat.com/cat.php/,'dog.php')
输出为
http://www.cat.com/cat.php/dog.php
os、sys模块:
OS模块 提供方便的使用操作系统函数的方法,
SYS 模块 提供可供访问由解释器使用或维护的变量和与解释器进行交互的函数。
简单来说os负责程序与操作系统的交互,提供程序访问操作系统底层的接口;sys主要负责程序与python解析器的交换,提供一系列函数与变量,用于操控pyhton的运行环境。
- os 常用方法
os.name:返回当前使用平台的代表字符,Windows用 nt 表示,Linux用 posix 表示
• os.listdir(path):列举目录下的所有文件。返回的是list类型。
• os.getcwd():查看当前所在路径。
• os.system(command):函数用来运行shell命令。
• os.curdir:返回当前目录('.')
• os.chdir(dirname):改变工作目录到dirname
• os.path.isfile(path):检验给出的路径是不是文件。
• os.path.isdir(path):检验给出的路径是不是目录。
• os.path.exists():用来检验给出的路径是否真地存在
• os.path.dirname(path):返回文件路径
• os.path.basename(path):返回文件名
• os.path.join(path, name):连接目录与文件名或目录,使用‘\’连接
• os.path.splitext():分离文件名与扩展名
• os.path.split(path):将path分割成目录和文件名二元组返回。
• os.path.normpath(path):规范path字符串形式
• os.path.abspath(name):获得绝对路径
• os.path.getsize(name):获得文件大小,如果name是目录返回0L
• os.mkdir(path):创建path目录(只能创建一级目录)
• os.makedirs(path):创建多级目录
• os.remove(path):函数用来删除一个文件。
• os.rmdir(path):删除path目录(只能删除一级目录,如'/Users/XXX/SSS',只删除SSS目录)
• os.removedirs(path):删除多级目录(如'/Users/XXX/SSS',必须为空目录,删除SSS、XXX目录)
• os.path.getmtime(path):返回文件或目录的最后修改时间,结果为秒数
• os.path.getatime(path):返回文件或目录的最后访问时间,结果为秒数
• os.path.getctime(path):返回文件或目录得创建时间,结果为秒数
• os.sep:返回当前操作系统特定的路径分隔符
• os.linesep:返回当前平台使用的行终止符
• os.extsep:返回文件名与扩展名的分隔符
-
sys 常用方法
sys.argv 实现从程序外部向程序传递参数。简单来说就是cmd中命令行参数,返回是一个List,第一个元素是程序名,第二个即输入第二个参数,以此类推。
Python 1.py www.cat.com 10
Sys.argv[0]=1.py
Sys.argv[1]=www.cat.com
Sys.argv[2]=10
sys.modules.keys() #返回所有已经导入的模块列表
sys.exc_info() #获取当前正在处理的异常类,exc_type、exc_value、exc_traceback当前处理的异常详细信息
sys.exit(n) #程序,正常退出时exit(0)
sys.hexversion #获取Python解释程序的版本值,16进制格式如:0x020403F0
sys.version #获取Python解释程序的版本信息
sys.maxint #最大的Int值
sys.maxunicode #最大的Unicode值
sys.modules #返回系统导入的模块字段,key是模块名,value是模块
sys.path #返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform #返回操作系统平台名称
sys.stdout #标准输出
sys.stdin #标准输入
sys.stderr #错误输出
sys.exc_clear() #用来清除当前线程所出现的当前的或最近的错误信息
sys.exec_prefix #返回平台独立的python文件安装的位置
sys.byteorder #本地字节规则的指示器,big-endian平台的值是'big',little-endian平台的值是'little'
sys.copyright #记录python版权相关的东西
sys.api_version #解释器的C的API版本
sys.version_info #获取Python解释器的版本信息
sys.getwindowsversion #获取Windows的版本
sys.getdefaultencoding #返回当前你所用的默认的字符编码格式
sys.getfilesystemencoding #返回将Unicode文件名转换成系统文件名的编码的名字
sys.setdefaultencoding(name) #用来设置当前默认的字符编码
sys.builtin_module_names #Python解释器导入的模块列表
sys.executable #Python解释程序路径
sys.stdin.readline #从标准输入读一行,sys.stdout.write("a") 屏幕输出a
optparse模块:
optparse可以说是sys.argv的升级版主要用来为脚本传递cmd中命令参数,采用预先定义好的选项来解析命令行参数。
parser.add_option()是为解析器添加选项,定义命令行参数常用的五种即
action:存储方式,分为三种store、store_false、store_true
type:类型
dest:存储的变量
default:默认值
help:帮助信息
举个橘子:
简单来说就是创建optparse对象parser,使用add_option()来定义命令行参数,最后利用parse_args()来解析命令行。
# coding=utf-8
import optparse
parser=optparse.optionParser("python %prog -u host -p port") #创建一个对象实例,()中用于cmd提示,可以省略 %prog=程序名。
parser.add_option('-u',dest='Host',type='string',help='test host')
parser.add_option('-p',dest='Ports',type='string',help='test ports',default="80,8080") ##需要的命令行参数 默认-h查看
(options,args)=parser.parse_args() # 传递一个参数列表给parse_args(),只要知道命令行参数名即dest,如host,就可以访问其对应的值:options.host。
print(options.Host)
print(options.Ports)
socket模块:
Socket也就是套接字,使用的时候每一个socket,都被绑定特定的IP地址和端口,主要实现网络上两个程序上的数据交换。
简单来说就是本地建立socket,被访问的服务器也建立一个socket监听,两端用各种的socket及进行数据交换
-
服务端
首先要创建sockert对象
Sock_server = socket.socket(family,type)
Family参数代表地址家族,分为AF_INET(IPV4网络通信)和AF_UNIX(同一主机进程通信)和AF_INET6(IPV6通信)
Type参选为套接字类型,分为SOCK_STREAM(tcp流套接字)和SOCK_DGRAM(udp数据包套接字)和SOCK_RAW(可以监听所有数据帧)和SOCKE_RDM(可靠udp形式,保证交付数据)
举个苹果吧,直接创建个socket服务端
# coding=utf-8
import socket
#服务端
sock_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建一个ipv4,tcp连接对象
sock_server.bind(("127.0.0.1",8888)) #绑定主机名和端口
sock_server.listen(2) #设置服务端,最多可以被多少客户连接
connection,address =sock_server.accept()#服务端通过accept等待客户请求连接,连接建立时,返回新的connection对象(通过这个新的对象与客户端通讯),和address客户端地址
connection.send('i am servce ') #服务器和客户端通过“send”发送byte和“recv”接受方法通信:
mess = connection.recv(1024) #接受多大字节
print(mess)
connection.close() #先关闭新对象,在关闭最开始对象
sock_server.close()
- 客户端
# coding=utf-8
import socket
sock_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock_client.connect(("127.0.0.1",8888)) #使用connect方法连接服务器
mess = sock_client.recv(1024)
print(mess)
sock_client.send('i am client')
sock_client.close()
thread和threading模块:
**余生很长,请多指教。**