# 安装
pip install beautifulsoup4 #解析html用
pip install requests #请求用
# 使用
import requests
from bs4 import BeautifulSoup
--------------
# requests 用法
heads['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'
proxy = [
{
'http': 'http://61.135.217.7:80',
'https': 'http://61.135.217.7:80',
},{
'http': 'http://118.114.77.47:8080',
'https': 'http://118.114.77.47:8080',
}
]
cookies = {'cookies_are':'working'}
例:
response = requests.get('http://www.baidu.com',headers=heads,params={'id':11},cookies=cookies,proxies=random.choice(proxy))
参数设置:
1. headers设置请求头,params设置参数,cookies设置,proxies设置代理
2. files上传文件: files = {'file': open('report.xls', 'rb')}
3. timeout超时时间: timeout=0.001
4. allow_redirects是否重定向: allow_redirects=False
5. verify是否忽略证书用于https: requests.get('https://github.com', verify=False)
6. cert设置证书:requests.get('https://kennethreitz.org', cert=('/path/client.cert', '/path/client.key'))
7. 设置json数据:json={'some': 'data'}
8. stream设置流用于大文件:
r = requests.get('https://api.github.com/events', stream=True)
chunk_size=100
with open(filename, 'wb') as fd:
for chunk in r.iter_content(chunk_size):
fd.write(chunk)
------
response = requests.post('http://www.baidu.com', data={'id':11})
response.status_code # 得到状态码
response.url # 得到请求url
response.headers # 得到请求头信息
response.cookies # 得到cookie对象信息 response.cookies.get_dict() 得到字典形式
response.text # 以文本形式显示网页源码
response.content # 以字节流形式输出用于保存文件或图片
response.json() # 获取json格式
response.encoding=response.apparent_encoding # encoding设置编码,apparent_encoding获取编码
# Session 跨请求保持某些参数
s = requests.Session()
s.auth = ('user', 'pass')
s.headers.update({'x-test': 'true'})
s.get('http://httpbin.org/headers', headers={'x-test2': 'true'})
# both 'x-test' and 'x-test2' are sent
------------
from bs4 import Tag
BeautifulSoup 用法
soup=BeautifulSoup(response.text,"html.parser")
soup.prettify() #显示得到数据
div=soup.find_all('div') #获取所有标签
div[0].text #获取文本
div=soup.select('#side') #获取id为side的数据 支持大部分的CSS选择器
tags=div.children #找到所有子级包括换行文本内容
#过滤标签
for tag in tags:
if type(tag)==Tag:
print('%s 是标签'%tag)
img=soup.find('img',id='myimg') #获取单个标签
img.name #获取标签名
img.attrs #获取字典
img.attrs.get('src') #获取属性值
# 获取head 和body的儿子节点
contens = soup.head.contents
body_list = soup.body.contents
# 标签数的上行遍历
.parent 节点的父亲标签
.parents 节点先辈标签的迭代类型,用于循环遍历先辈节点
soup.head.parent
soup.head.parents
# 标签数的平行遍历 (条件 必须是一个父亲节点下的)
.next_sibling 返回按照HTML文本顺序的下一个平行节点标签
.previous_sibling 返回按照HTML文本顺讯的上一个平行节点标签
.next_siblings: 迭代类型, 返回按照HTML顺序的后续所有平行节点标签
.previous_siblings: 迭代类型, 返回按照HTML顺序的前序所有平行节点标签
.find_all(re.compile("^b")) 通过正则表达式的 match() 来匹配内容.例子中找出所有以b开头的标签
.find_all("a", class_="sister") 按照CSS类名搜索
# find_all(name, attr, recursive, string, **kwargs) 搜索参数
返回一个类表类型,存储查找的结果
name: 对标签名称的检索字符串
attrs: 对标签属性值的检索字符串, 可标注属性检索
recursive: 是否对子孙全部检索, 默认为True
string:soup.find_all(string = 'Basic Python)
扩展方法:
1)<>.find(): 搜索且只返回一个结果,字符串类型,同.find_all()参数
2)<>.find_parents():在先辈节点中搜索,返回列表类型, 同find_all()参数
3)<>.find_parent(): 在先辈节点中返回一个结果, 字符串类型
4)<>.find_next_siblings():后续平行节点中搜索,返回列表类型
5)<>.find_next_sibling():后续平行节点返回一个结果,字符串类型
6)<>.find_previous_siblings(): 前序平行节点搜索,返回列表
7)<>.find_previous_sibling():前序平行节点返回一个结果,字符串类型