utllib.request

from urllib.parse import urlencode
from urllib import request
from pyquery import PyQuery as pq

from fake_useragent import UserAgent


def requestPlus(**kwargs):
    url = kwargs.get('url')
    
    if not url:
        raise Exception('请求地址为空')
    
    if not isinstance(url, str):
        raise Exception('请求地址非字符串')
    
    # 设置头信息
    headers = {
        'User-Agent': UserAgent().random
    }
    
    kwargsHeaders = kwargs.get('headers')
    
    if kwargsHeaders and isinstance(kwargsHeaders, dict):
        headers.update(kwargsHeaders)
    
    # 设置请求方法
    kwargsMethod = kwargs.get('method')
    method = 'get'
    
    if kwargsMethod and isinstance(kwargsMethod, str) and kwargsMethod.lower() in ['get', 'post']:
        method = kwargsMethod
    
    # 设置 get参数
    kwargsQuery = kwargs.get('query')
    if kwargsQuery and isinstance(kwargsQuery, dict):
        # 将get参数进行编码处理
        url += '?' + urlencode(kwargsQuery)
    
    # 设置post提交数据
    kwargsData = kwargs.get('data')
    data = {}
    if kwargsData and isinstance(kwargsData, dict):
        method = 'post'
        data = kwargsData
    
    data = bytes(urlencode(data), encoding='utf-8')
    
    # 代理设置
    kwargsProxy = kwargs.get('proxy')
    isProxy = False
    if kwargsProxy and isinstance(kwargsProxy, dict):
        isProxy = True
        opener = request.build_opener(request.ProxyHandler(kwargsProxy))
        addheaders = []
        for k in headers:
            pass
            # addheaders.append((k, headers[k]))  # 代理的headers是不同
        
        opener.addheaders = addheaders
        
        request.install_opener(opener)
    
    method = method.upper()  # 需要大写
    
    try:
        req = request.Request(url, data, headers, method=method)
        res = request.urlopen(req)
    except (Exception, BaseException) as e:
        print(url, headers, method, e)
    else:
        res.read = res.read()
        
        try:
            res.text = res.read.decode('utf-8')
        except (Exception, BaseException) as e:
            res.text = res.read.decode('gbk')
        
        return res


respItems = []

respItems.append(requestPlus(url='https://www.baidu.com'))  # utf-8
respItems.append(requestPlus(url='https://wap.faloo.com'))  # gbk

# get带参数
""""""
respItems.append(requestPlus(url='https://www.baidu.com/s', query={
    'wd': '历史上的今天'
}))

# post带参数
""""""
respItems.append(requestPlus(url='https://www.httpbin.org/post', data={
    'int': '1',
    'float': '1.1',
}))

# 代理
respItems.append(requestPlus(url='https://2021.ip138.com', proxy={
    'https': '127.0.0.1:10809'
}))

respItems.append(requestPlus(url='https://www.google.com.hk/search', query={
    'q': 'facebook'
}, proxy={
    'https': '127.0.0.1:10809'
}))

for resp in respItems:
    if resp.code == 200:
        print(resp.url)
        _ = pq(resp.text)
        print(_('title').text(), _('p').text())

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CY3761

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

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

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

打赏作者

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

抵扣说明:

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

余额充值