手写myscrapy(五)

项目地址:https://gitee.com/wyu_001/myscrapy

我们继续完成返回的处理类 MyResponse的实现
先上类图:
MyResponse
主要功能:
json() 方法解析返回的json格式内容,转换为 python 的json对象

xpath()方法解析返回的html格式的内容,使用etree转换成MyNode对象

follow() 方法解析需要继续访问的url;
get_xpath_node() : 获取节点下(包括子节点)的文本内容
get_xpath_text(): 获取节点下的文本内容

代码如下:

# !/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
  @author: spring.wang
  @license: 
  @contact: wyu_01@163.com
  @software: myscrapy
  @file: myresponse.py
  @time: 2022/3/22 8:48
  @description: 
  
  '''
from lxml import etree
from utils.json import ConvertFromJson
from utils.tool import reduce,ltos
from urllib.parse import urljoin
from common.myobject import MyObject
from common.log import loger
import traceback
from config import setting
from common.myrequest import MyRequest
from common.mynode import MyNode

class MyResponse(MyObject):

    def __init__(self,response = None,content = None):
        '''
        :param  response-> response returned by request
        :param  content-> content of response

        '''

        self._response = response
        self.request_url = self._response.url
        self._content = content

        self._etree = None
    def xpath(self,path,**kwargs):
        '''
        :param  path-> xpath
        :param  **kwargs  dict parameter for etree's xpath parameter
        :return MyNode Object List or MyNode or bool or String
        :rtype
        '''
        if self._etree is not None:
            pass
        else:
            self._etree= etree.HTML(self._content)

        nodes = self._etree.xpath(path,**kwargs)

        if isinstance(nodes,str) or isinstance(nodes,bool):
            return nodes
        _nodes = []
        if isinstance(nodes,list):
            if len(nodes):
                if isinstance(nodes[0],str):
                    return MyNode(nodes)
                else:
                    for node in nodes:
                        _nodes.append(MyNode(node))
                    return _nodes
            else:
                return MyNode([])
        # return self._etree.xpath(path,**kwargs)


    def json(self):
        '''
        :return json text convert into dict object
        :rtype  dict object
        '''
        json_dic = ConvertFromJson(self._content)
        return json_dic

    def get_xpath_text(self,path,node= None,**kwargs):
        '''
        :param  path-> xpath
        :param  node-> element of node in document
        :return  text of element of node
        '''

        if self._etree is not None:
            pass
        else:
            self._etree = etree.HTML(self._content)

        if node is not None:
            return ltos(node.xpath(path))

        return ltos(self._etree.xpath(path,**kwargs))

    def get_xpath_node(self,path,node=None,**kwargs):
        '''
        :param  path-> xpath
        :param  node-> element of node in document
        :return text of node (include child node) was handled by reduce function
                excluding '\n',{},<>,//
        '''

        content = ''
        if self._etree is not None:
            pass
        else:
            self._etree = etree.HTML(self._content)

        if node is not None:
            for u in node.xpath(path):
                content = content + u.xpath('string(.)')

            return reduce(content)
        else:
            for u in self._etree.xpath(path):
                content = content + u.xpath('string(.)')

            return reduce(content)

    def get_xpath_node1(self,path,node=None,**kwargs):
        '''
        :param  path-> xpath
        :param  node-> element of node in document
        :return text of node (include child node) was handled by reduce function
                excluding '\n',{},<>,//
        '''

        content = ''
        if self._etree is not None:
            pass
        else:
            self._etree = etree.HTML(self._content)

        if node is not None:
            content = node.xpath(path+'//*[name() != "script" and name() != "style"]/text()')
            return reduce(ltos(content))
        else:
            content = self._etree.xpath(path+'//*[name() != "script" and name() != "style"]/text()')
            return reduce(ltos(content))


    def base_url_join(self,link,base_url=None):
        '''
        :param link-> url of http
        :param base_url->  base url of http
        '''
        if base_url and link:
            return urljoin(base_url,link)

        if link:
            return urljoin(self._response.url,link)
        else:
            return link

    def follow(self, url=None, callback=None, cb_kwargs=None, **rq_kwargs):
        '''
        :param  url -> request http url
        :param  callback-> callback method's name
        :param  cb_kwargs-> callback method's parameters , dict object key is parameter's name
                values is instance of parameter
        :param  **re_kwargs -> parameter of requests.request
        '''
        if cb_kwargs is None:
            cb_kwargs = {}

        if url is None:
            raise ValueError("url cannot be empty")

        if callback is not None and not callable(callback):
            raise TypeError(f'callback must be a callable, got {type(callback).__name__}')

        url = urljoin(self._response.url, url)

        if setting.URL_DUPLICATE:
            if url in self._key_url:
                loger.info(f'request url:{url} is duplicate ')
                return

        loger.info(f'request url:{url}')

        response,content = MyRequest.request(url, **rq_kwargs)
        if response is None:
            loger.info("response is None,following request failed!!")
            return

        myresponse = MyResponse(response,content)
        '''  
         if 'response' in inspect.getfullargspec(callback)[0] :
             kwargs={'response':response}

         for k,v in cb_kwargs.items():
             kwargs.setdefault(k, v)
        '''

        try:
            callback(myresponse, **cb_kwargs)
        except:
            loger.error(traceback.format_exc())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/404594.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++标准库与Boost库:功能丰富的开发工具集

C标准库与Boost库&#xff1a;功能丰富的开发工具集 C是一种强大的编程语言&#xff0c;而C标准库和Boost库则为C开发者提供了广泛的工具和功能。本文将深入探讨C标准库和Boost库&#xff0c;介绍它们的特点、提供的功能以及如何在项目中使用它们来加速开发过程和提高代码质量。…

腾讯云宝塔Linux安装Mysql5.7

一、下载官方mysql包 wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm二、安装mysql包 rpm -ivh mysql-community-release-el7-5.noarch.rpm三、安装mysql yum install mysql-community-server -y四、启动数据库 systemctl start mysqld.service…

JAVA工程师面试专题-Mysql篇

一、基础 1、mysql可以使用多少列创建索引&#xff1f; 16 2、mysql常用的存储引擎有哪些 存储引擎Storage engine&#xff1a;MySQL中的数据、索引以及其他对象是如何存储的&#xff0c;是一套文件系统的实现。常用的存储引擎有以下&#xff1a; Innodb引擎&#xff1a;In…

spark 少量key倾斜的join优化

背景 在使用spark join时&#xff0c;我们经常遇到少量key拥有大量的数据而导致的数据倾斜的问题&#xff0c;这导致了task任务数据处理非常不均匀而影响最终时效 少量key数据倾斜的join优化 这里有一个前提&#xff0c;join的另一边的表没有数据倾斜问题&#xff0c;也就是…

C语言----字符数组指针

1.char arr[] {a,b,c,d,e,f}; sizeof分析类型就可以计算所占的内存空间的大小&#xff1b; &#xff08;1&#xff09;printf("%d\n", sizeof(arr)); 数组名单独放进里面&#xff0c;计算整个数组大小&#xff0c;所以是6字节&#xff1b; &#xff08;2&#xff…

R语言【base】——abs(),sqrt():杂项数学函数

Package base version 4.2.0 Description abs(x) 计算 x 的绝对值&#xff0c;sqrt(x) 计算 x 的正平方根。 Usage abs(x) sqrt(x) Arguments 参数【x】&#xff1a;一个数值或复数向量或数组。 Details 这些都是内部泛型原语函数:可以为它们单独定义方法&#xff0c;也可以…

Elasticsearch从入门到精通-01认识Elasticsearch

Elasticsearch从入门到精通-01认识Elasticsearch &#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是程序员行走的鱼 &#x1f342;博主从本篇正式开始ES学习&#xff0c;希望小伙伴可以一起探讨 &#x1f4d6; 本篇主要介绍和大家一块简单认识下ES并了解ES中的主要角色…

鸿蒙自定义侧滑菜单布局(DrawerLayout)

前言 为了实现安卓中的侧滑菜单布局效果&#xff0c;通过查找鸿蒙的布局控件&#xff0c;发现SideBarContainer控件有点像&#xff0c;但是使用中发现并不是很符合我们的UI交互效果&#xff0c;因此我在鸿蒙中通过自定义布局的方式实现&#xff0c;本文主要介绍该自定义控件如…

第3.6章:StarRocks数据导入——DataX StarRocksWriter

一、Datax 1.1 DataX 3.0概述 DataX3.0是一个异构数据源离线同步工具&#xff0c;可以方便的对各种异构数据源进行高效的数据同步。 其github地址为&#xff1a; https://github.com/alibaba/DataX/blob/master/introduction.mdhttps://github.com/alibaba/DataX/blob/mast…

【Java代码审计】XSS漏洞

1. XSS漏洞 XSS&#xff08;Cross Site Scripting&#xff0c;为了和层叠样式表&#xff08;Cascading Style Sheet,CSS&#xff09;有所区分&#xff0c;故称XSS&#xff09;跨站脚本攻击是一种针对网站应用程序的安全漏洞攻击技术。它可以实现用户会话劫持、钓鱼攻击、恶意重…

罗克韦尔AB的PLC实现ModbusTCP和ModbusRTU协议标签方式通讯

本文是通过IGT-DSER智能网关读写AB罗克韦尔Compact、Control系列PLC的标签数据缓存并转为Modbus从站协议&#xff0c;与上位机通讯的案例。 打开智能网关的参数软件(下载地址)&#xff0c;通过功能->数据转发与平台对接&#xff0c;再选择数据转发与缓存’&#xff0c;进入以…

浏览器录屏技术:探索网页内容的视觉记录之道

title: 浏览器录屏技术&#xff1a;探索网页内容的视觉记录之道 date: 2024/2/23 14:32:49 updated: 2024/2/23 14:32:49 tags: 浏览器录屏技术原理Web API应用场景用户体验在线教育产品演示 在当今数字化时代&#xff0c;浏览器录屏技术已经成为了一种强大的工具&#xff0c;…

基于springboot+vue的视频网站系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

力扣随笔之按奇偶排序数组(简单905)

思路1&#xff1a;根据双指针对撞指针的思路&#xff0c;定义一个左指针从数组前端开始遍历&#xff0c;定义一个右指针从后端开始遍历&#xff0c;这时候有四种情况 左奇右偶&#xff1a;这种情况需要将其位置交换&#xff0c;将偶数提前&#xff0c;奇数后移左奇右奇&#xf…

【Lazy ORM】 小工具 acw 本地客户端 你负责点击页面,他负责输出代码

介绍 wu-smart-acw-client 简称acw-client&#xff0c;是一个基于Lazy ORM定制的客户端代码生成小工具 Lazy ORM 小工具 acw 本地客户端 你负责点击页面&#xff0c;他负责输出代码安装 <dependency><groupId>top.wu2020</groupId><artifactId>wu-sma…

Qt_快速安装指南

下载Qt在线安装程序&#xff08;不仔细介绍&#xff09;注册Qt账号&#xff08;不仔细介绍&#xff09;使用快速运行的命令&#xff0c;按照指定的下载地址下载 在Qt指定目录打开cmd命令窗口.\eqt-unified-windows-x86-4.0.1-1-online. exe --mirror https://mirrors.ustc.edu.…

计算机设计大赛 深度学习卷积神经网络垃圾分类系统 - 深度学习 神经网络 图像识别 垃圾分类 算法 小程序

文章目录 0 简介1 背景意义2 数据集3 数据探索4 数据增广(数据集补充)5 垃圾图像分类5.1 迁移学习5.1.1 什么是迁移学习&#xff1f;5.1.2 为什么要迁移学习&#xff1f; 5.2 模型选择5.3 训练环境5.3.1 硬件配置5.3.2 软件配置 5.4 训练过程5.5 模型分类效果(PC端) 6 构建垃圾…

Cesium 展示——加载 tileset.json 格式的模型数据

文章目录 需求分析需求 已给 tileset.json 文件,现需加载该模型文件, 该模型特点:模型上的各模块均可以进行点击设置,且相机视角拉近后可以看到内部隐藏的物件模块 分析 tileset.json :模型数据【模型加载】方法export function init3dTileLayer (option) {var tilesetMo…

【SpringBoot3】Spring Security 常用配置总结

注&#xff1a;本文基于Spring Boot 3.2.1 以及 Spring Security 6.2.1 相关文章 【SpringBoot3】Spring Security 核心概念 【SpringBoot3】Spring Security 常用注解 【SpringBoot3】Spring Security 详细使用实例&#xff08;简单使用、JWT模式&#xff09; 【SpringBoot3】…

ChatGPT调教指南 | 咒语指南 | Prompts提示词教程(二)

在我们开始探索人工智能的世界时&#xff0c;了解如何与之有效沉浸交流是至关重要的。想象一下&#xff0c;你手中有一把钥匙&#xff0c;可以解锁与OpenAI的GPT模型沟通的无限可能。这把钥匙就是——正确的提示词&#xff08;prompts&#xff09;。无论你是AI领域的新手&#…