requests 的使用
Get请求
- params 参数进行传递各种信息
python
import requests
data = {
'name':'germey',
'age':'25'
}
r = request.get('url',params=data)
print(r.text)
-
json方法
如果返回的数据类型是json,可以直接用json方法
python
r = request.get('url',params=data)
print(r.json())
# 如果数据返回的不是JSON格式,就会出现解析错误,抛出json.decoder.JSONDecodeErrot异常
-
r.text 和 r.content 的区别
-
r.text 中打印时会转换成 str 类型
-
r.content 的前面带有一个b, 代表这是 bytse 类型的数据
-
-
配置请求头
python
import requests
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0',
'Host':'www.httpbin.org'
}
r = request.get('url',headers=headers)
POST请求
python
import requests
data = {
'name':'germey',
'age':'25'
}
r = request.post('url',params=data)
print(r.text)
响应
-
状态码
-
响应头
-
Cookie
python
import requests
r = request.get('url')
print(r.status_code)
print(r.headers)
print(r.cookies)
print(r.url)
print(r.history)
高级用法
- 文件上传
python
import requests
file = {'file':open('favicon.ico','rb')}
r = requests.post('url',file=file)
print(t.text)
- 设置Cookie
python
# 获取Cookie
import requsets
r = requests.get('https://www.baidu.com')
print(r.cookies)
for key,value in r.cookies.items():
print(key + '=' + value)
# 我们从网站上复制请求头
import requests
headers = {
'Cookie':'...',
'User-Agent':'...'
}
r = requsets.get('https://github.com/',headers=headers)
print(r.text)
# 创建一个RequestCookieJar 对象
cookies = '..'
jar = requsets.cookies.RequestsCookieJar()
for cookie in cookies.split(';'):
key,value = cookie.split('=',1)
jar.set(key,value)
r = requests.get('https://github.com/',cookies=jar,headers=headers)
-
Session
-
它通常在模拟登录成功之后,进行下一步操作时用到
s = requests.Session()
s.get('url')
-
-
请求中的一些参数
-
SSL错误
- 将请求中的verify=False,就可以解决了
-
timeout 参数
-
timeout = 1
-
timeout=(5,30)
-
-
用户认证
- auth=('...','...')
-
代理设置
-
proxies=proxies
-
其中proxies是一个代理池
-
-
正则表达式
常用的方法
-
match
- 从字符串的起始位置开始匹配正则表达式,如果匹配,就返回匹配成功的结果,如果不匹配,就返回None
-
search
- 它会搜索整个HTML文本,找到符合上述正则表达式的第一个内容并返回,尽量加上re.S ----> 以免出现匹配不到的问题
-
findall
- 获取全部匹配的内容
-
sub
- 借助它来修改文本
-
compile
- 这个方法将正则字符串编译成正则表达式对象,以便在后面的匹配中复用
logging模块简介
相比print的优点有如下
-
可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必现实大量的调试信息
-
print 将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其他数据,logging则可以有开发者决定将信息输出到什么地方,以及怎么输出
基本使用
python
import logging
logging.basicConfig(level = logging.INFO,format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 这句得到了一个logger实例,__name__这个参数,得到运行的模块名字
logger = logging.getLogger(__name__)
# 这里的等级依次递增
# 默认配置中只会打印 warning 级别以上的日志
# 可以通过配置修改打印级别
# logging.basicConfig(level=logging.INFO)
logger.info("Start print log")
logger.debug("Do something")
logger.warning("Something maybe fail.")
logger.info("Finish")
# 当我们需要对日志的输出进行一些格式上的要求,我们就可以这样写,注:配置项要写在最上面,否则可能会出现各种bug
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 将日志输出到文件中
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filename='TryLog.log',
filemode='a')
# 获得自定义的 logger
# 注:这里的参数 text_logger 是该logger的名字,
# 很多人会用__name__ 来命名
# root 这个是全局的logger的名字
test_logger = logging.getLogger('text_logger')
# 创建一个Handler 实例 -----> 指定了文件名和文件的打开方式
file_handler = logging.FileHandler('text_logger.txt',mode='a')
# handler 里面可以设置basicConfig 里面大多数的配置,比如下面的输出格式
file_handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
# 这里面可以放入多个handler
test_logger.addHandler(file_handler)
# 异常处理
try:
1/0
except:
text_logger.exception("Get exception")
参数:作用
%(levelno)s:打印日志级别的数值
%(levelname)s:打印日志级别的名称
%(pathname)s:打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s:打印当前执行程序名
%(funcName)s:打印日志的当前函数
%(lineno)d:打印日志的当前行号
%(asctime)s:打印日志的时间
%(thread)d:打印线程ID
%(threadName)s:打印线程名称
%(process)d:打印进程ID
%(message)s:打印日志信息