【python爬虫】设计自己的爬虫 1. request封装

这篇具有很好参考价值的文章主要介绍了【python爬虫】设计自己的爬虫 1. request封装。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

通过requests.session().request 封装request方法
考虑到请求HTTP/2.0
同时封装httpx 来处理HTTP/2.0的请求

封装requests

# 遇到请求失败的情况时 重新请求,请求5次等待2s
@retry(stop_max_attempt_number=5, retry_on_result=lambda re_data: re_data is None, wait_fixed=2000)
    def requests_request(self, method, url, params=None, data=None, json=None, headers=None, files=None, verify=False,
                         cert=None, timeout=None, proxies=None, proxy=None, **kwargs):

        # 对异常进行捕获
        try:
            """
                封装request请求,将请求方法、请求地址,请求参数、请求头等信息入参。
                注 :verify: True/False,默认为True,认证SSL证书开关;cert: 本地SSL证书。如果不需要ssl认证,可将这两个入参去掉
            
                使用session管理器
                requests.session(): 维持会话,跨请求的时候保存参数   
            """

            # 处理代理
            proxies = None
            if proxy:
                proxies = {
                    'http://': 'http://' + proxy,
                    'https://': 'https://' + proxy,
                }
            #  使用requests.session().request 请求
            re_data = requests.session().request(method, url, params=params, data=data, json=json, headers=headers,
                                                 files=files, cert=cert, timeout=timeout, verify=verify,
                                                 proxies=proxies, **kwargs)
        # 异常处理 报错显示具体信息
        except Exception as e:
            re_data = None
            # 打印异常
            print("请求失败:{0}".format(e))
            logger.error("Error occurred: %s", str(e), exc_info=True)
            # 重新抛出异常,触发 retry 机制
            raise e
        # 返回响应结果
        return re_data

封装httpx

@retry(stop_max_attempt_number=5, retry_on_result=lambda re_data: re_data is None, wait_fixed=2000)
    def httpx_request(self, method, url, is_http2=False, content=None, data=None, files=None, json=None, params=None,
                      headers=None, cookies=None, timeout=None, extensions=None, proxy=None, **kwargs):

        # 对异常进行捕获
        try:
            """
                使用client  
                method.upper() 请求方法都转为大写
            """
            # 处理代理
            proxies = None
            if proxy:
                proxies = {
                    'http://': 'http://' + proxy,
                    'https://': 'https://' + proxy,
                }

            re_data = httpx.Client(http2=is_http2, proxies=proxies).request(method.upper(), url, content=content,
                                                                            data=data, files=files, json=json,
                                                                            params=params, headers=headers,
                                                                            cookies=cookies, timeout=timeout,
                                                                            extensions=extensions, **kwargs)
        # 异常处理 报错显示具体信息
        except Exception as e:
            re_data = None
            # 打印异常
            print("请求失败:{0}".format(e))
            logger.error("Error occurred: %s", str(e), exc_info=True)
            # 重新抛出异常,触发 retry 机制
            raise e
        # 返回响应结果
        return re_data

将两个请求封装在一个方法里

@retry(stop_max_attempt_number=5, retry_on_result=lambda re_data: re_data is None, wait_fixed=2000)
    def request(self, method, url, is_http2=False, params=None, data=None, json=None, headers=None, files=None,
                verify=False, cert=None, timeout=None, proxies=None, content=None, cookies=None, extensions=None,
                **kwargs):

        try:
            if is_http2:
                re_data = self.httpx_request(method=method.upper(), url=url, is_http2=is_http2, content=content,
                                             data=data, files=files, json=json, params=params, headers=headers,
                                             cookies=cookies, timeout=timeout, extensions=extensions, **kwargs)
            else:
                re_data = self.requests_request(method=method, url=url, params=params, data=data, json=json,
                                                headers=headers, files=files, cert=cert, timeout=timeout, verify=verify,
                                                proxies=proxies, **kwargs)

        # 异常处理 报错显示具体信息
        except Exception as e:
            re_data = None
            # 打印异常
            print("请求失败:{0}".format(e))
            logger.error("Error occurred: %s", str(e), exc_info=True)
            # 重新抛出异常,触发 retry 机制
            raise e
        # 返回响应结果
        return re_data

通过is_http2来区分

测试代码如下文章来源地址https://www.toymoban.com/news/detail-713743.html

if __name__ == '__main__':

    # request_requests 使用requests请求
    request_data = request_main.requests_request("get", 'https://spa16.scrape.center/')
    if request_data:
        print(request_data.text)
        print(request_data.status_code)

    # httpx 请求HTTP/2.0
    # response = re.httpx_request('GET', 'https://spa16.scrape.center/', True)
    # httpx 一般请求
    # headers = {'User-Agent': 'my-app/0.0.1'}
    # response = re.httpx_request('get', 'https://www.httpbin.org/get',params={'name': 'germey'})
    # print(response.text)
    # print(response.status_code)

    print(datetime.datetime.now())

到了这里,关于【python爬虫】设计自己的爬虫 1. request封装的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【100天精通python】Day42:python网络爬虫开发_HTTP请求库requests 常用语法与实战

    目录 1 HTTP协议 2  HTTP与HTTPS 3 HTTP请求过程  3.1 HTTP请求过程 3.2 GET请求与POST请求

    2024年02月12日
    浏览(62)
  • 爬虫怎么在requests中设置自己clash软件的代理ip

    在使用Python的requests库时,可以通过设置代理来使用Clash软件提供的代理IP。以下是设置代理IP的步骤: 首先,需要确保Clash软件已经安装并且启动,并且在Clash软件中已经添加了需要使用的代理。 然后,在Python中使用requests库发送请求时,可以通过设置proxies参数来设置代理。

    2024年02月12日
    浏览(44)
  • 小程序开发指南-TS封装wx.request

    大家好,我是Aliom252181,一个佛系且资质平平的前端coder,今天分享下我是如何使用 Typescript 封装 wx.request 的。 本篇文章适合有封装TS版本小程序请求需求的coder,通过本篇阅读,你将会了解到: TS代码提示; 单例模式; 每个接口都可以灵活配置请求头、超时时间等; 取消原

    2024年02月09日
    浏览(30)
  • Python+requests+pytest+allure封装接口自动化1-项目结构目录创建,requests库封装

    api: 这是一个package,用来各个接口的类封装,按照你的业务可以将其分为多个package common: 这是一个package,用来封装底层公共方法,比如requests库封装、文件操作封 装、加解密封装、redis封装、数据库封装、随机数据封装、日志封装 testcases: 这是一个package,用来编写封装我们

    2024年02月12日
    浏览(65)
  • Python接口自动化之request请求封装

    我们在做自动化测试的时候,大家都是希望自己写的代码越简洁越好,代码重复量越少越好。那么,我们可以考虑将request的请求类型(如:Get、Post、Delect请求)都封装起来。这样,我们在编写用例的时候就可以直接进行请求了。 我们先来看一下Get、Post、Delect等请求的源码,

    2024年02月13日
    浏览(50)
  • python-网络爬虫.Request

    Request python中requests库使用方法详解: 一简介:         Requests 是Python语言编写,基于urllib,         采用Apache2 Licensed开源协议的 HTTP 库。         与urllib相比,Requests更加方便,处理URL资源特别流畅。         可以节约我们大量的工作,建议爬虫使用Requests库

    2024年02月14日
    浏览(53)
  • python爬虫—requests

    类型 : models.Response r.text : 获取网站源码 r.encoding :访问或定制编码方式 r.url :获取请求的 url r.content :响应的字节类型 r.status_code :响应的状态码 r.headers :响应的头信息 找登录接口  找参数的值 python代码 登录超级鹰官网:超级鹰验证码识别-专业的验证码云端识别服务

    2024年02月10日
    浏览(40)
  • 【Python爬虫】requests库

    1.requests库的介绍 ​ requests 是 Python 语言编写,基于 urllib3 ,采用 Apache2 Licensed 开源协议的HTTP库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。是 Python 实现的简单易用的 HTTP 库。 Requests 中文文档:http://docs.pythonrequests.org/zh_CN/latest/index.html ​ 解决

    2024年02月16日
    浏览(41)
  • Python爬虫之requests模块

    requests文档http://docs.python-requests.org/zh_CN/latest/index.html 1、requests模块的作用: 发送http请求,获取响应数据 2、requests模块是一个第三方模块,需要在你的python(虚拟)环境中额外安装 pip/pip3 install requests 3、requests模块发送get请求 需求:通过requests向百度首页发送请求,获取该页面

    2024年02月09日
    浏览(44)
  • python爬虫——request模块讲解,Python详解

    对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据); 而对于POST, 浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。 (二)http常见请求参数 url:请求url地址 headers:请求头 **data:发送编码为表

    2024年04月26日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包