当前位置: 首页 > news >正文

【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 = Noneif 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 = Noneif 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来区分

测试代码如下

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封装

通过requests.session().request 封装request方法 考虑到请求HTTP/2.0 同时封装httpx 来处理HTTP/2.0的请求 封装requests # 遇到请求失败的情况时 重新请求,请求5次等待2s retry(stop_max_attempt_number5, retry_on_resultlambda re_data: re_data is None, wai…...

8.0 新特性 - innodb_ddl_threads

前言 MySQL 8.0.27 引入了一个新变量来控制 InnoDB 可用于创建(排序和构建)二级索引的最大并行线程数:innodb_ddl_threads 通过调整该参数,可以提升二级索引的创建速度。 参数介绍 1. innodb_ddl_threads 创建二级索引时&…...

pgAdmin 4 v7.8 发布,PostgreSQL 开源图形化管理工具

导读pgAdmin 是 PostgreSQL 领先的开源图形化管理工具。pgAdmin 4 旨在满足新手和有经验的 Postgres 用户的需求,提供强大的图形界面,简化了数据库对象的创建、维护和使用。 pgAdmin 开发团队日前发布了 pgAdmin 4 v7.8 版本,这个版本包括 21…...

Realrek 2.5G交换机 8+1万兆光RTL8373-VB-CG方案简介

新一代2.5G交换机方案RTL8373-VB-CG可以提供4中不同形态 a. 52.5G 电口110G光》RTL8373 b. 52.5G 电口110G电》RTL83738261 c. 82.5G 电口110G光》RTL83738224 d.82.5G 电口110G电口》RTL837382248261 1.概述 Realtek RTL8373-CG是一款低功耗、高性能、高度集成的八端口2.5G和一…...

Linux命令随笔

文章目录 grep命令 grep命令 例如,在Linux系统中,要在当前目录下的所有文件中搜索包含字符串"hello"的行,并显示文件名,可以使用以下命令: grep -r "hello" .其中,"."表示…...

最新版scene-builder安装

JavaFX Scene Builder是一个可视化的布局工具,用于设计JavaFX用户界面。它允许开发人员使用拖放和可视化的方式创建和编辑JavaFX界面,而无需直接编写代码。 JavaFX Scene Builder提供了一个直观的界面,让开发人员可以轻松地创建和修改JavaFX…...

直击电商商城内核!一站式解决方案

作为一家深耕电商运营多年的软件开发公司,我们拥有先进的轻量级电商中台系统,且100%开源,包含B2C、B2B2C、S2B2C、O2O和社区团购等多种商业模式,无论在技术、业务架构、功能、设计还是售后支持上,我们都秉承着追求极致…...

rabbitmq安装、基本使用

docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.12-management docker会自己下载,然后运行 进入docker: docker exec -it rabbitmq bash 进入容器,重启rabbitmq:rabbitmq-server restart 感觉所有的…...

Amaon CloudFront助力出海业务访问优化

企业的展示网站需要面向多个国家的客户时,由于地理位置的原因。往往会出现一个痛点,网络延迟太高,以至于图片、视频播放时会非常卡顿。客户的访问体验非常差,直接影响到企业收益。此篇文章九河云综合分析Amaon CloudFront&#xf…...

python实现ModBusRTU服务端

python实现基于串口通信的ModBusRTU服务端是一件简单的事情,只要通过pymodbus模块和Serial模块就可以实现。...

yum安装node,npm

node官网 yum -y install nodejs npm 查看版本 npm -v node -v卸载 yum -y remove nodejs npm修改镜像源 4.1. 修改淘宝镜像源 set registry https://registry.npm.taobao.org npm config get registr4.2. 修改华为云镜像源 npm config set registry https://mirrors.huaweicl…...

ESM蛋白质语言模型系列

模型总览 第一篇《Biological structure and function emerge from scaling unsupervised learning to 250 million protein sequences 》ESM-1b 第二篇《MSA Transformer》在ESM-1b的基础上作出改进,将模型的输入从单一蛋白质序列改为MSA矩阵,并在Tran…...

RHCE-------Day1

存储管理 标准存储管理 1、分区 fdisk /dev/nume0n1 交互式指令 2、格式化 mkfs.xfs /dev/nume0n1p1 直接指定分区类型 mkfs -t xfs /dev/nume0n1p1 3、挂载 mount /dev/nume0n1p1 /mnt 取消挂载: umont …...

Linux(Centos7)防火墙端口操作记录

1、nginx -t #Nginx配置文件检查 上述截图代表检查没问题 上述截图检查配置文件配置错误,并提示错误文件位置 2、systemctl restart nginx #重启Nginx 重启Nginx失败 3、systemctl status nginx.service #查看Nginx服务状态 80端口被占导致服务启动失败 4、n…...

【MySQL数据库】初识MySQL数据库、安装MySQL

文章目录 前言一、什么是 MySQL?二、MySQL 的强大之处三、Ubuntu安装MySQL步骤 1: 更新包列表步骤 2: 安装 MySQL步骤 3: 启动 MySQL 服务步骤 4: 验证 MySQL 安装步骤 5: 确保 MySQL 安全性 总结 前言 在今天的数字化世界中,数据是企业和个人的重要资产…...

Keil Map信息解析

基本功能: 1.在Keil里面,通过App.Map复制所有信息。然后解析剪辑版内容。 2.随意输入一个函数内存地址,即可遍历出该内存地址属于哪个.c或者函数名。或者能遍历出变量。 强化功能: 1.通过Keil5 命令 Save xxxxxxx\1.Hex 0x200173…...

在重生奇迹MU中如何选择最佳的挂机点?

如何寻找最适合自己的挂机地点呢?小编建议玩家朋友从以下几点着手加以抉择。 怪物的等级不能过高 你的最佳挂机点要结合自己的实际情况来定,如果你刷怪比较吃力的话,那么此游戏地图并不适合你挂机,一旦挂机过程中,你…...

IT行业中的热门职业及前景展望

目录 一、IT技术发展背景及历程 二、IT行业热门职业 三、前景展望 一、IT技术发展背景及历程 随着科技的不断发展和创新,IT技术也在不断更新和完善。从计算机的出现到互联网的普及,再到现代云计算、人工智能等技术的兴起,IT技术已经成为了…...

linux练习

linux练习 vim编辑器有哪几种工作模式? 命令模式、末行模式、编辑模式 yum的配置文件在什么目录下?具体有哪些字段? 目录:cat /etc/yum.repos.d/*.repo 字段: [] name baseurl enabled gpgcheck 规划分区的命令是什么…...

【【带有握手信号的无符号数乘法verilog+ testbench 代码】】

带有握手信号的无符号数乘法verilog testbench 代码 uumultiplier.v module uumultiplier #(parameter NUMBER1 8 ,parameter NUMBER2 …...

vscode里如何用git

打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…...