urllib库的基本使用
import ssl
import urllib.request
import urllib.parse
url = 'https://www.baidu.com/'
# 发送简单的get请求 百度
resp1 = urllib.request.urlopen(url)
# 发送简单的post请求 百度翻译
urlSug = 'https://fanyi.baidu.com/sug'
keyDict = {
"kw": "答案"
}
keyEncode = urllib.parse.urlencode(keyDict).encode()
resp2 = urllib.request.urlopen(urlSug, data=keyEncode)
# 附加ssl信息
resp3 = urllib.request.urlopen(url, context=ssl.SSLContext(ssl.PROTOCOL_SSLv23))
# 请求附带Headers
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'accept-language': 'zh-CN,zh;q=0.9',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6788.400 QQBrowser/10.3.2843.400',
}
req = urllib.request.Request(url, headers=headers)
resp4 = urllib.request.urlopen(url)
# 使用代理
http_proxy_handler = urllib.request.ProxyHandler({"http" : "61.135.217.7:80"})
opener = urllib.request.build_opener(http_proxy_handler)
resp5 = opener.open(url)
# 设置超时未响应 报错
resp6 = urllib.request.urlopen(url, timeout=1)
from http.client import HTTPResponse
# 返回状态码
print(resp4.code, resp4.status)
print(resp4.getcode())
# 返回网址
print(resp4.url)
print(resp4.geturl())
# 服务器端返回的请求头
# <class 'http.client.HTTPMessage'>
print(resp4.headers)
print(resp4.info())
# 列表形式
print(resp4.getheaders()) # [('Accept-Ranges', 'bytes'), ('Cache-Control', 'no-cache')。。。]
# 单个值
print(resp4.getheader('Content-Type')) # text/html
# 读
content = resp4.read() # 读取获取的响应网页信息 二进制形式一般要解析需要解码
HTMLText = content.decode() # 解码
requests库基本使用
requests 非官方库,但使用简单。 pip install request
Requests库的理念:让http服务人类
使用requests库能非常方便地模拟各种请求。
常见请求:
- get 请求指定的页面信息,并返回实体主体。
- post 提交表单等信息并 返回实体主体
- head 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
- put 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。
- delete 请求服务器删除指定的资源。
- options 允许客户端查看服务器的性能
import requests
url = "https://www.baidu.com/"
# 发送简单get请求
resp1 = requests.get(url)
payload = {'key1': 'values', 'key2': "value2"}
# 附带参数
resp2 = requests.get(url, params=payload)
# 发送head请求,用于获取报头
resp3 = requests.head(url)
# 发送简单的post请求 百度翻译
urlSug = 'https://fanyi.baidu.com/sug'
keyDict = {
"kw": "答案"
}
resp4 = requests.post(urlSug, data=keyDict)
# 请求附带headers
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'accept-language': 'zh-CN,zh;q=0.9',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6788.400 QQBrowser/10.3.2843.400',
}
resp5 = requests.get(url, headers=headers)
# 使用代理
proxies = {'https': 'https://117.88.5.230:3000', 'http': 'http://122.231.160.150:9999'}
# resp6 = requests.get(url, proxies=proxies) # 代理不一定还有用。
# 设置超时 即超出规定时间未获得响应就报错
resp7 = requests.get(url, timeout=1)
# 响应结果的处理
from requests.models import Response
# 状态码
print(resp1.status_code)
# 最终响应的网址
print(resp1.url)
# 返回的请求头
print(resp1.headers)
# 返回请求头的某个值
print(resp1.headers.get('Content-Type'))
# 响应的cookies 信息
print(resp1.cookies)
# 返回响应信息的编码/解码 格式。 可以进行赋值
# 如果赋值,在对相应的二进制数据进行解码时,会按照设置的编码格式进行解码。
# 否则会自动挑选出最合适的解码格式作为解码依据
print(resp1.encoding)
resp1.encoding = 'utf-8'
print(resp1.encoding)
# 响应的信息 二进制格式
print(resp1.content)
# 响应的信息, 字符串格式。 二进制格式信息按照规定或者自动寻找到的解码方式解码后的信息
print(resp1.text)
# 如果响应信息时json格式。可直接解析成对象
print(resp4.json(), type(resp4.json()))