千家信息网

python的scrapy requests与response对象怎么用

发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这篇文章主要介绍了python的scrapy requests与response对象怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python的scrapy req
千家信息网最后更新 2025年01月19日python的scrapy requests与response对象怎么用

这篇文章主要介绍了python的scrapy requests与response对象怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python的scrapy requests与response对象怎么用文章都会有所收获,下面我们一起来看看吧。

Request 对象

在 scrapy 中 Request 对象代表着请求,即向服务器发送数据,该对象的构造函数原型如下所示:

def __init__(self, url, callback=None, method='GET', headers=None, body=None,                 cookies=None, meta=None, encoding='utf-8', priority=0,                 dont_filter=False, errback=None, flags=None, cb_kwargs=None)

其中只有 url为必填参数,具体说明如下:

  • callback:页面解析函数,当 Request 请求获取到 Response 响应之后,设定的函数会被调用,默认是 self.parse 方法;

  • method:请求类型,默认为 GET,所以使用 Request 是可以发送 POST 的请求的,FormRequest 类是 Request 类的子类;

  • headers:请求头,字典类型;

  • body:请求的正文,需要 bytes 类型或 str 类型;

  • cookies:Cookie 字典,dict 类型;

  • meta:元数据字典,dict 类型,可以给其它组件传递信息;

  • encoding:url和body参数的编码,注意不是数据响应编码;

  • priority:请求的优先级,默认为0,数值越大,优先级越高;

  • dont_filter:默认值为 False,该参数表示是否重复请求相同地址;

  • errback:请求异常时的回调函数。

Response 对象

scrapy中,Response对象表示请求响应对象,即服务器返回给爬虫的数据,其构造函数原型如下:

def __init__(self,url,status=200,headers=None,body=b"",    flags=None, request=None,certificate=None,ip_address=None,protocol=None,)

与 Request 一致,该方法中仅 url 为必填参数,不过一般很少用到手动创建一个 Response 对象实例的场景。

Response 类衍生出来一个子类 TextResponse,然后 TextResponse又衍生出来 HtmlResponseXmlResponse

Response 包括的属性和方法如下:

属性清单:

  • url:响应地址;

  • status:响应状态码;

  • headers:响应头;

  • encoding:响应正文的编码;

  • body:响应正文,bytes 类型;

  • text:文本形式的响应正文,将 body 进行编码之后的数据;

  • request:获取请求对象;

  • meta:元数据字典,dict 类型,请求传递过来的参数;

  • selector:选择器对象。

方法清单:

  • xpath():XPath 选择器;

  • css():CSS 选择器;

  • urljoin():就是 urllib.parse 模块的 urljoin()

  • json():将响应数据序列化为 JSON 格式;

关于 Request 和 Response 类的相关源码,可以在 scrapy\http 目录查看。

ItemPipeline

数据管道在 scrapy 中主要对数据进行处理,在实际开发过程中需要注意一个 ItemPipeline,只负责一种功能的数据处理,当然在 scrapy 中你可以创建多个 ItemPipeline

ItemPipeline的使用场景:

  • 数据清洗,例如去重,去除异常数据;

  • 数据保存方式编写,例如存储 Mongodb,MySQL,Redis 数据库。

在编写ItemPipeline类的时候,不需要其继承特定类,只需要实现固定名称的方法即可,在之前的博客中已经反复提及,自定义ItemPipeline类需要实现 process_item()open_spider()close_spider()方法,其中 process_item()必须实现。

process_item()返回值是 Item 或者字典,也可以返回一个 DropItem类型的数据,此时该项 item 会被忽略,不会被后面的 ItemPipeline处理。

过滤数据的逻辑实现

如果希望在 ItemPipeline实现过滤数据,使用集合即可,发现集合中已经存在数据了,抛出 DropItem即可。

LinkExtractor 提取链接

scrapy 编写的爬虫在提取大量链接时,使用LinkExtractor会更加便捷。 使用 from scrapy.linkextractors import LinkExtractor导入 LinkExtractor,该类的构造函数如下所示:

def __init__(self, allow=(), deny=(),allow_domains=(),deny_domains=(),restrict_xpaths=(),        tags=('a', 'area'),attrs=('href',),canonicalize=False,unique=True,process_value=None,        deny_extensions=None,restrict_css=(),strip=True,restrict_text=None,    )

其中各个参数说明如下:

  • allow:一个正则表达式或正则表达式列表,提取正则表达式匹配的 url,默认全部提取;

  • deny:与 allow 相反;

  • allow_domains:字符串或者列表,domain 限制;

  • deny_domains:与上面相反;

  • restrict_xpaths:按照 xpath 提取;

  • restrict_css:安装 css 选择器提取;

  • tags:提取指定标签内的链接;

  • attrs:提取指定属性内的链接;

  • process_value:函数类型,传入该参数之后,LinkExtractor 会将其匹配到的所有链接,都传入该函数进行处理。

下面的代码是提取 Response 对象中的链接,需要使用 extract_links() 方法。

def parse(self, response):    link = LinkExtractor()    all_links = link.extract_links(response)    print(all_links)
  • 创建一个LinkExtractor对象;

  • 使用构造器参数描述提取规则;

  • 调用LinkExtractor对象的 extract_links 方法传入一个Response对象,返回一个列表;

  • 使用列表中的任意元素调用 .url 或者 .text 获取链接和链接文本。

爬虫编码时间

本次的目标站点是:淘数据-行业报告

完整代码编写如下所示,使用 LinkExtractor 提取页面超链接。

import scrapyfrom tao.items import TaoItemfrom scrapy.linkextractors import LinkExtractorclass TaoDataSpider(scrapy.Spider):    name = 'tao_data'    allowed_domains = ['taosj.com']    start_urls = [f'https://www.taosj.com/articles?pageNo={page}' for page in range(1, 124)]    def parse(self, response):        link_extractor = LinkExtractor(allow=r'www\.taosj\.com/articles/\d+', restrict_css='a.report-page-list-title')        links = link_extractor.extract_links(response)        for l in links:            item = {                "url": l.url,                "text": l.text            }            yield item

关于"python的scrapy requests与response对象怎么用"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"python的scrapy requests与response对象怎么用"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。

数据 对象 类型 链接 函数 参数 方法 字典 编码 正文 处理 选择 属性 正则 爬虫 知识 表达式 代码 优先级 内容 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 python连接数据库代理 软件开发和工程项目的区别 wcf数据库实例 黄河科技学院互联网创新创业大赛 青少年网络安全知识试题 延庆区数据网络技术诚信服务 软件开发培训机构南宁 开展网络安全和信息化培训 评价好的直销软件开发 博客代码片段如何存进数据库 毕业论文软件开发网上商城 关于网络安全的动漫人物绘画 漳州市国家网络安全宣传 数据库聚集索引文件结构 承担维护网络安全的部门 旧服务器柜子回收价格 软件开发企业培训市场前景 福建网络技术服务常见问题 数据库cdc同步 南关区智能网络技术诚信服务 农安通用网络技术质量保证 物理服务器网卡 喀什市软件开发 数据库优化需要做什么 霞浦县聂区网络技术服务部 中职网络技术题库 网络安全宣传周心得50字 家里建云服务器会影响 三菱PLC怎么发送数据给数据库 腾讯涉不涉及网络安全板块
0