一、requests库的详解:
request参数:
requests.request(
method, # 请求方式 get post put等
url, # 访问地址
params, # 在url上传递的参数,以字典的形式{"date":"today"}传参,get方式会用到(xxx.com/news?date=today)
data, # 在请求体里传递的数据,post方式会用到,以字典的方式传参,还可以以字符串的形式穿递
# 类似"user=alex&pwd=2333", 传字典最后也会转换为字符串;也可以上传文件。
json, # 在请求体里面传递数据,会自动执行json.dumps方法,会变成字符串"{'name':'alex'}"。
headers, # 请求头,以字典的形式传参
cookies, # 就是cookie, cookie在请求头中
files, # 进行上传文件, {"f1": open("s1.py" ,"rb")},value既可以是文件对象也可以是文件内容
# 还可以以元组的形式指定上传到服务器的文件名{"f1": ("文件名", open("s1.py" ,"rb" ,'application/vnd.ms-excel'))}
# 如果是一个文件对象会在内部调用read方法。
auth, # 认证,适用于有弹窗要求输入用户名和密码,实际上是在请求头加了一条数据(用户名和密码)
# auth = HTTPBasicAuth("用户名","密码")
timeout, # 超时时间, 也可以是元组的形式(发送时间,读的时间)
allow _redirects, # 是否进行重定向跳转
proxies, # 代理,字典的形式 {"http" : "127.01.1.0"}
stream, # stream=True 代表是流的处理 当下载文件过大的时候用
verify, # 是否使用证书
cert # 证书文件, cert ="证书文件路径" 元组形式传参(***.cert,***.key)
)
※:request.get()和request.post()在底层调用的都是requests.requests()。
※:当传参数时出现字典里套字典的情况时用json,其他时候二者都可。
流式下载:
from contextlib import closing
with closing(requests.get('http://httpbin.org/get', stream=True)) as r:
# 在此处理响应。
for i in r.iter_content():
print(i)
基于session的请求
import requests
session = requests.Session()
# 用法和requests一样
response = session.get(url="http://dig.chouti.com/help/service")
Response响应的参数:
response.status_code # 状态码
.headers # 响应头
.encoding # 编码
.apparent_encoding # 可接受的编码
.text # 以文本形式返回响应内容。
.content # 以字节的形式返回响应内容。以字节的形式返回响应内容。
.cookies.get_dict() # cookies属性
.url # 用于返回响应的url.由于重定向的存在,可能会出现我们请求的地址和响应的地址并不 一样的情况.
.json # 处理 JSON 数据
二、BeautifulSoup库的详解
该模块用于接收一个HTML或XML字符串,然后将其进行格式化,之后遍可以使用他提供的方法进行快速查找指定元素,从而使得在HTML或XML中查找指定元素变得简单。
1. name,标签名称
tag = soup.find('a')
name = tag.name # 获取
tag.name = 'span' # 设置
2. attr,标签属性
tag = soup.find('a')
tag.attrs.get("href") # 获取href
tag.attrs = {'ik':123} # 设置
tag.attrs['id'] = 'iiiii' # 设置
3. children,所有子标签(换行也会拿到),返回的是一个迭代器。
body = soup.find('body')
body.children # 所有子标签
body.descendants # 所有子子孙孙标签
4. decode,转换为字符串(含当前标签);decode_contents(不含当前标签)
body = soup.find('body')
body.decode()
body.decode_contents()
5. encode,转换为字节(含当前标签);encode_contents(不含当前标签)
body = soup.find('body')
body.encode()
body.encode_contents()
6. find,获取匹配的第一个标签
# 找到第一个符合条件的对象,返回的是一个soup对象
soup.find('a')
# 找到一个a标签,class=sisiter,text=Lacie,递归的去寻找
soup.find(name='a', attrs={'class': 'sister'}, recursive=True, text='Lacie')
7. find_all,获取匹配的所有标签
# find_all的用法和find一样,但是有拓展,返回的是一个列表对象
soup.find_all(name='a', attrs={'class': 'sister'}, recursive=True, text='Lacie')
# ####### 列表 #######
soup.find_all(name=['a','div']) # 找到name为"a"或者为"div"
# ####### 正则 #######
import re
rep = re.compile('^p')
soup.find_all(name=rep) # 找到所有name符合正则表达式的
# ####### 方法筛选 #######
def func(tag): # tag是当前处理的标签
return tag.has_attr('class') and tag.has_attr('id')
soup.find_all(name=func)
8. has_attr,检查标签是否具有该属性
tag = soup.find('a')
tag.has_attr('id')
9. get_text,获取标签内部文本内容
tag = soup.find('a')
tag.get_text('id')
10. select,select_one, CSS选择器
soup.select("title") # 找到title标签
soup.select("#link") # 找到id为link的元素
soup.select("body a") # 找到body标签下所有的a标签