学习3:scrapy请求对象、模拟登录、POST请求、管道的使用、crawlspider爬虫类

请求对象

请求对象参数

scrapy.Request(url[],callback,method="GET",headers,body,cookies,meta,dont_filter=False)
  • callback 表示当前的url响应交给那个函数去处理
  • method 指定请求方式
  • headers 接受一个字典,其中不包括cookies
  • body 接收json字符串,为POST请求的数据,发送payload_post请求时使用
  • cookies 接收一个字典,专门放置cookies
  • meta 实现数据在不同的解析函数中传递,meta默认带有部分数据,比如下载延迟,请求深度
  • dont_filter 默认为False,会过来请求的url地址,即请求过的url地址不会继续被请求。对需要重复请求的url地址可以把他设置为True,比如贴吧的翻页请求,页面的数据总是在变化。start_urls中的地址会被反复请求,否则程序不会启动。

meta参数的使用

meta可以实现数据在不同的解析函数中的传递。具体作用包括:

  • 数据传递:可以在一个解析函数中抓取到的部分数据,通过meta传递给下一个回调函数继续处理,尤其适用于需要多步流程才能完全获取到所需数据的情况。
  • 状态标志:可以传递一些布尔值或标记,告诉后续的回调函数如何处理响应数据,比如是否已登录、是否需要特殊处理等。
  • 请求关联:可以用来关联多个请求,比如将同一个项目的不同部分关联在一起,便于最后聚合组装完整数据项。
  • 指定回调函数:有时候还可以通过meta中的callback键来动态指定响应应该由哪个函数来处理。

示例

def parse(self, response):item = Item()# ... 抓取部分数据填充到item中 ...next_url = response.css('a.next::attr(href)').get()yield Request(next_url, callback=self.parse_next_page, meta={'item': item})def parse_next_page(self, response):item = response.meta['item']  # 从上一步传递过来的item# ... 在这里继续抓取并更新item ...yield item  # 最终输出完整的item

模拟登录

这里主要是利用 cookiescrapycookie不能放在headers中,需要在构造请求的时候有专门的cookies参数。并且需要在setting文件中设置ROBOTS协议、USER_AGENT

创建项目

scrapy startproject github

创建爬虫

scrapy genspider git1 github.com

在浏览器控制台里选择一个地址做登录请求,比如:https://github.com/exile-morganna
并从浏览器里拿到对应的cookie
在这里插入图片描述

class Git1Spider(scrapy.Spider):name = "git1"allowed_domains = ["github.com"]start_urls = ["https://github.com/exile-morganna"]# 默认的请求不会携带cookie,需要重写请求def start_requests(self):# 处理cookie字符串为字典temp = "你的cookie"# 分割字符串cookies = {data.split("=")[0]: data.split("=")[-1] for data in temp.split("; ")}for url in self.start_urls:yield scrapy.Request(url=url, cookies=cookies)def parse(self, response):# 获取标题title = response.xpath("/html/head/title/text()").extract_first()print(title)

如果运行时提示下面的内容说明,网站不允许爬取。需要修改settings.py里的内容

# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0"# Obey robots.txt rules
#ROBOTSTXT_OBEY = True

在这里插入图片描述
请求成功
在这里插入图片描述

POST请求

scrapy中一般使用scrapy.FormRequest()来发送post请求

获取到请求地址,可以点击登录按钮,获取到请求地址https://github.com/session

创建爬虫

scrapy genspider git2 github.com

获取的post请求的参数
在这里插入图片描述
从请求页中获取到token
在这里插入图片描述

class Git2Spider(scrapy.Spider):name = "git2"allowed_domains = ["github.com"]start_urls = ["https://github.com/login"]def parse(self, response):# 从登录页面响应中解析出post数据# 从登录页获取到tookentoken = response.xpath("//input[@name='authenticity_token']/@value").extract_first()# 你的账号和密码post_data = {"commit": "Sign in","authenticity_token": token,"login": "1111","password": "1111","webauthn-support": "supported",}# print(post_data)# 针对登录URL发送post请求yield scrapy.FormRequest(url="https://github.com/session",formdata=post_data,callback=self.after_login,)# 登录后续操作def after_login(self, response):# 请求案例1中的yield scrapy.Request("https://github.com/exile-morganna", callback=self.check_login)# 校验是否登录成功def check_login(self, response):# 获取标题title = response.xpath("/html/head/title/text()").extract_first()print("标题是:", title)

在这里插入图片描述

管道的使用

pipeline中常用的方法

  • process_item(self,item,spider)

    • 管道类中必须有的函数
    • 实现对item数据的处理
    • 必须return item
  • open_spider(self,spider) 在爬虫开启的时候仅执行一次

  • close_spider(selef,spider) 在爬虫关闭的时候仅执行一次

study1项目里我们使用了__init____del__ 方法来进行文件操作。在这里可以使用open_spiderclose_spider 来替换

 def open_spider(self, spider):if spider.name == "itcast":print("itcast爬虫开启")self.file = open("itcast.json", "w", encoding="utf-8")

我们可以通过爬虫名,来对某一个爬虫执行一些独有的操作。

crawlspider爬虫类

简介

CrawlSpider 是 Scrapy 网络爬虫框架中的一个高级爬虫类,它是 Spider 类的子类,专为大规模和半结构化网站的爬取而设计。相较于基础的 Spider 类,CrawlSpider 引入了自动化链接跟踪的能力,使得它非常适合进行整个站点或部分站点的深度爬取。

主要特点和功能:

  1. Link Extractors(链接提取器)

    • CrawlSpider 强调使用 Link Extractors 来自动发现并跟随网页中的链接。这些链接可以基于 CSS 选择器、正则表达式等规则来提取。这意味着你可以定义规则来自动抓取与初始请求相关的页面,实现对网站的深度爬取。
  2. Rules(规则)

    • 规则是 CrawlSpider 的核心特性,它定义了如何处理从网页中提取的链接。每个规则包含一个 Link Extractor 用于提取链接,以及一个可选的回调函数(callback)用于处理匹配链接抓取回来的响应。此外,规则还可以指定是否应跟进提取的链接(follow=True 或 follow=False),以及对链接进行预处理的函数(如 process_linksprocess_request)。
  3. 自动化Request生成

    • 一旦定义了规则,CrawlSpider 会自动处理从响应中提取链接、生成新的请求、并调度这些请求的过程,大大简化了对多页数据爬取的编程工作。
  4. 广泛适用性

    • CrawlSpider 特别适合那些有明确模式可循的网站爬取,比如新闻网站、论坛或者产品目录等,尤其是当你想要遍历多个页面并提取相似结构的信息时。

使用方法:

  • 创建 CrawlSpider 实例时,通常需要覆盖或添加规则(rules 属性)来指导爬虫如何抓取。
  • 使用 scrapy genspider -t crawl <爬虫名> <域名> 命令可以快速生成基于 CrawlSpider 的爬虫模板。
  • 在爬虫类中定义 start_requests() 方法来指定起始URL,以及规则(rules)来定义链接的提取逻辑和处理方式。

总之,CrawlSpider 通过集成链接提取和自动请求生成的机制,为开发者提供了一种高效且灵活的方式来实施复杂的爬取任务,特别是在处理大型网站数据抓取时表现出色。

基本使用

创建爬虫

scrapy genspider -t crawl 爬虫名 域名
class TencentCrawlSpider(CrawlSpider):name = "tencent_crawl"allowed_domains = ["chinaz.com"]start_urls = ["https://sc.chinaz.com/jianli/"]rules = (# 使用Rule类生成链接提取规则,生成LinkExtractor对象# LinkExtractor 用于设置链接提取规则# allow参数,接收正则表达式# callback参数,回调函数,值是函数名的字符串# follow参数,决定是否在链接提取器提取的链接对应的响应中继续应用链接提取器提取链接,类似于递归# 在正则里.要用\.进行转移Rule(LinkExtractor(allow=r"https://sc.chinaz.com/jianli/\d+\.html?"),callback="parse_item",follow=False,),# 翻页规则Rule(LinkExtractor(allow=r"https://sc.chinaz.com/jianli/index_\d+\.html"),callback="parse_page",follow=False, # 设置为true时会一致递归下去,数据太多了),)def parse_item(self, response):item = {}item["url"] = response.urlitem["title"] = response.xpath("//h1/text()").get()print("建立模板:", item)return itemdef parse_page(self, response):print("翻页:", response.url)

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

原来spring也可以AI

最近大模型是相当的火&#xff0c;尤其是在自然语言处理&#xff08;NLP&#xff09;、图像识别、语音识别等领域的应用&#xff0c;那对于工程同学来说应该如何接住这波破天的富贵呢&#xff1f; 想啥来啥&#xff0c;前段时间LangChain给我们整了一套钢铁战甲&#xff0c;让…

javascript 练习 写一个简单 另类录入 电脑组装报价表 可打印

数据格式 &#xff08;1代表cpu、2代表主板、3代表内存、。。。&#xff09; 1i3 12100 630 2H610 480 3DDR4 3200 16G 220 4500G M.2 299 5300W电源 150 6小机箱 85 7GT 730G 4G 350 8WD 2T 399 9飞利浦 24Led 580 主代码 Html JS <!DOCTYPE html> <html lang&qu…

tomcat+maven+java+mysql图书管理系统1-配置项目环境

目录 一、软件版本 二、具体步骤 一、软件版本 idea2022.2.1 maven是idea自带不用另外下载 tomcat8.5.99 Javajdk17 二、具体步骤 1.新建项目 稍等一会&#xff0c;创建成功如下图所示&#xff0c;主要看左方目录相同不。 给maven配置国外镜像 在左上…

【通信中间件】Fdbus HelloWorld实例

Fdbus实例教程 Fdbus简介 Fdbus 全称 Fast Distributed Bus&#xff08;高速分布式总线&#xff09;&#xff0c;提供IPCRPC功能。适用于多种OS&#xff1a; LinuxQNXAnroidOSWindow Fdbus本质是Socket&#xff0c;IPC基于Unix domain socket&#xff0c;RPC基于TCP。使用G…

【数据结构初阶】直接插入排序

最近浅学了直接插入排序&#xff0c;写个博客做笔记&#xff01;笔记功能除外若能对读者老爷有所帮助最好不过了&#xff01; 直接插入排序是插入排序的一种&#xff0c;那么介绍直接插入排序之前先介绍一下常见的排序算法&#xff01; 目录 1.常见的排序算法 2.直接插入排…

详解LLMOps,将DevOps用于大语言模型开发

大家好&#xff0c;在机器学习领域&#xff0c;随着技术的不断发展&#xff0c;将大型语言模型&#xff08;LLMs&#xff09;集成到商业产品中已成为一种趋势&#xff0c;同时也带来了许多挑战。为了有效应对这些挑战&#xff0c;数据科学家们转向了一种新型的DevOps实践LLM-OP…

FFmpeg学习记录(四)——SDL音视频渲染实战

1.SDL使用的基本步骤 SDL Init/sDL _Quit()SDL_CreateWindow()/SDL_DestoryWindow()SDL CreateRender() SDL_Windows *windows NULL;SDL_Init(SDL_INIT_VIDEO);window SDL_CreateWindow("SDL2 Windows",200,200, 640,480,SDL_WINDOW_SHOWN);if(!window) {printf(&…

QtWindows任务栏

目录 引言任务栏进度右键菜单缩略图工具栏完整代码 引言 针对Windows系统的任务栏&#xff0c;Qt基于系统的原生接口封装有一些非常见类&#xff0c;如QWinTaskbarButton、QWinTaskbarButton、QWinThumbnailToolBar等&#xff0c;用于利用工具栏提供更多的信息&#xff0c;诸如…

C 认识指针

目录 一、取地址操作符&#xff08;&&#xff09; 二、解引用操作符&#xff08;*&#xff09; 三、指针变量 1、 指针变量的大小 2、 指针变量类型的意义 2.1 指针的解引用 2.2 指针 - 整数 2.3 调试解决疑惑 认识指针&#xff0c;指针比较害羞内敛&#xff0c;我们…

使用jdbc方式操作ClickHouse

1、创建测试表&#xff0c;和插入测试数据 create table t_order01(id UInt32,sku_id String,total_amount Decimal(16,2),create_time Datetime ) engine MergeTreepartition by toYYYYMMDD(create_time)primary key (id)order by (id,sku_id);insert into t_order01 values …

ctfshow 框架复现

文章目录 web 466web 467web 468web469web 470web 471web 472web 473web 474web 475web 476 web 466 Laravel5.4版本 &#xff0c;提交数据需要base64编码 代码审计学习—Laravel5.4 - 先知社区 (aliyun.com) 用第二条链子 反序列化格式 /admin/序列化串base64<?php na…

Flutter笔记:Widgets Easier组件库(11)- 使用提示吐丝

Flutter笔记 Widgets Easier组件库&#xff08;11&#xff09;使用提示吐丝 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this …

【Java】基本程序设计结构(二)

前言&#xff1a;上一篇我们详细介绍了Java基本程序设计结构中前半部分&#xff0c;一个简单的Java应用&#xff0c;注释&#xff0c;数据类型&#xff0c;变量与常量&#xff0c;运算符&#xff0c;字符串。包括本篇将延续上篇内容介绍后续内容&#xff0c;包括输入输出&#…

「 网络安全常用术语解读 」通用配置枚举CCE详解

1. 背景介绍 NIST提供了安全内容自动化协议&#xff08;Security Content Automation Protocol&#xff0c;SCAP&#xff09;为漏洞描述和评估提供一种通用语言。SCAP组件包括&#xff1a; 通用漏洞披露(Common Vulnerabilities and Exposures, CVE)&#xff1a;提供一个描述…

2024年 Java 面试八股文——SpringCloud篇

目录 1.Spring Cloud Alibaba 中的 Nacos 是如何进行服务注册和发现的&#xff1f; 2.Spring Cloud Alibaba Sentinel 的流量控制规则有哪些&#xff1f; 3.Spring Cloud Alibaba 中如何实现分布式配置管理&#xff1f; 4.Spring Cloud Alibaba RocketMQ 的主要特点有哪些&…

2024“天一永安杯“宁波第七届网络安全大赛极安云科战队部分WP

“天一永安杯”2024 宁波第七届网络安全大赛暨第九届大学生网络技术与信息安全大赛 大赛竞赛形式 一、线上初赛 参赛人员&#xff1a;各单位自行选拔3人&#xff08;设队长1名&#xff09;组成团队&#xff0c;不足3人不允许参赛。 竞赛时间&#xff1a;8&#xff1a;30-12&…

ES集群数据备份与迁移

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、文章涉及概念讲解二、操作步骤1.创建 snapshot repository操作主机hadoop1分别操作从机hadoop2和hadoop3 2. 查看仓库信息3. 备份索引&#xff0c;生成快照…

【精品毕设推荐】基于JSP物流信息网的设计与实现

点击免费下载原文及代码、PPT 摘要 本文讲述了基于JSP物流信息网的设计与实现。该系统使用java语言开发&#xff0c;使系统具有更好的平台性和可扩展性。 该系统实现了用户登录、注册、查询快递信息、快递公司注册成为合作伙伴以及系统管理员对信息进行管理等功能。系统的主…

Android 音视频基础知识

本系列文章会介绍两个 Android NDK Demo&#xff0c;拉流端会实现一个基于 FFmpeg 的视频播放器 Demo&#xff0c;推流端会实现一个视频直播 Demo&#xff0c;当然在做 Demo 之前会介绍音视频的基础知识。以下是本系列文章的目录&#xff1a; Android 音视频基础知识 Android 音…

第二代增强-创建采购申请时的增强

文章目录 第二代增强-创建采购申请时的增强业务要求实现过程创建项目编写代码激活增强 维护消息类运行效果断点关键点另一种形式的错误提示-出口函数EXIT_SAPLMEREQ_005运行结果 第二代增强-创建采购申请时的增强 业务要求 实现过程 创建项目 编写代码 "AFNAM&#xff0c…