requests.get

# 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)

# 这下上面的正常不乱码了

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CY3761

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值