# requests 第三方请求库
# 安装: pip install requests
# 测试: requests -v
# 比较常用的方法
# requests.get()
# requests.post()
# requests.session()
# 返回属性
# resp.status_code 状态码
# resp.content 二进制数据 图片等资源
# resp.text 字符串数据
# resp.encoding 编码(可用于设置返回的text编码)
# resp.url 请求地址 (真实的请求地址, 通常访问某个页面会跳转到登录, 这里会显示登录地址)
# resp.json 字典数据 (但返回的必须是jsn数据 否则报错)
# resp.headers 响应头信息 字典
import os.path
import urllib.parse
import requests
from fake_useragent import UserAgent
from pyquery import PyQuery as pq
from hashlib import md5
headers = {
'User-Agent': UserAgent().random
}
# 是否启动重定向 默认是 True
allow_redirects = False
urlItems = [
# 链接 | get请求参数
dict(url='https://www.baidu.com/s', params=dict(wd='历史上的今天'), encoding='utf-8'),
dict(url='https://www.so.com/s', params=dict(q='历史上的今天')),
dict(url='https://wap.faloo.com/search_0_1.html', params=dict(k='外卖'), encoding='gb2312'),
# 这个好像编码有问题, 如果具有参数的gb2312需要提供编码
dict(url='https://www.httpbin.org/get', params=dict()),
dict(url='https://docs.python-requests.org/en/latest/_static/requests-sidebar.png'),
]
for _ in urlItems:
url = _.get('url')
params = _.get('params')
encoding = _.get('encoding')
try:
if encoding == 'gb2312':
params = urllib.parse.urlencode(params, encoding=encoding)
# 这里仅 get测试
res = requests.get(url, params=params, headers=headers, allow_redirects=allow_redirects)
except (Exception, BaseException) as e:
print(e.__class__.__name__, e)
else:
print()
print('-' * 80)
print(res.status_code, res.url)
for k, _ in enumerate(res.cookies):
print(str(k).zfill(3), _)
print('>' * 80)
for k, _ in enumerate(res.headers.items()):
print(str(k).zfill(3), _)
print('>' * 80)
headersContentType = res.headers['Content-Type'].lower()
# json数据
if headersContentType.find('json') >= 0:
for k, _ in enumerate(res.json().items()):
print(str(k).zfill(3), _)
continue
# 图片数据
imageDirPath = 'image'
if headersContentType.find(imageDirPath) >= 0:
if not os.path.exists(imageDirPath):
os.makedirs(imageDirPath)
imageFileName = md5(res.content).hexdigest()
imageFilePos = res.url.split('/')[-1].split('.')[1]
imageFilePath = imageDirPath + '/' + imageFileName + '.' + imageFilePos
if not os.path.exists(imageFilePath):
with open(imageFilePath, 'wb') as w:
w.write(res.content)
print('写入', imageFilePath, '文件')
continue
print('文件', imageFilePath, '已存在')
continue
# 设置编码
if encoding:
res.encoding = encoding
elif headersContentType.find('utf-8') >= 0:
res.encoding = 'utf-8'
elif headersContentType.find('gb2312') >= 0:
res.encoding = 'gbk'
print('encoding', res.encoding)
text = res.text
text = pq(text)
title = text('title').text()
print('title', title)
# 编码问题
utf8_enc = urllib.parse.urlencode(dict(k='外卖'), encoding='utf-8')
print(utf8_enc)
gb2312_enc = urllib.parse.urlencode(dict(k='外卖'), encoding='gb2312') # 可通过浏览器分析提交后的url
print(gb2312_enc)
# 这下上面的正常不乱码了