学习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.mzph.cn/web/8791.shtml

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

相关文章

uniapp读取项目本地文件/json文件/txt文件

uniapp读取项目本地文件/json文件/txt文件 文件必须放在static目录下 方法&#xff1a; /*** 访问static里面的文件* param url 文件路径 必须在static目录下*/ function localFetch(url) {return new Promise((resolve, reject) > {plus.io.resolveLocalFileSystemURL(_ww…

阿里云VOD视频点播流程(2)

二、视频点播 1、入门代码 基于OSS原生SDK上传 &#xff0c;参考文档&#xff1a;https://help.aliyun.com/zh/vod/user-guide/upload-media-files-by-using-oss-sdks?spma2c4g.11186623.0.0.1f02273fj4lxNJ 视频点播面向开发者提供了丰富的上传方式&#xff0c;其中上传SDK&…

从零开始的软件测试学习之旅(八)jmeter线程组参数化及函数学习

jmeter线程组参数化及函数学习 Jmeter基础基本使用流程组件与元件 线程组线程的执行方式Jmeter组件执行顺序 常见属性设置查看结果数的作用域举例 Jmeter参数化实现方式1.用户定义参数2.用户参数3.函数4.csv数据文件设置 每日复习 Jmeter基础 基本使用流程 启动项目案例 启动…

DUX 主题 版本:8.2 WordPress主题优化版

主题下载地址&#xff1a;DUX 主题优化版.zip 支持夜间模式、快讯、专题、百度收录、人机验证、多级分类筛选&#xff0c;适用于垂直站点、科技博客、个人站&#xff0c;扁平化设计、简洁白色、超多功能配置、会员中心、直达链接、自动缩略图

添砖Java之路其三——自增自减运算符,数据转换与原码反码补码。

目录 运算符&#xff1a; 转换&#xff1a; 隐式转换&#xff1a; 小范围数据可以直接可以给大范围数据&#xff1a; 这里做了一张图范围向下兼容表​编辑 运算时&#xff0c;数据范围小的和数据范围大的&#xff0c;需要讲运算范围小的提升为运算范围大的同类&#xff0c…

全球AI新闻速递

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是「奇点」&#xff0c;江湖人称 singularity。刚工作几年&#xff0c;想和大家一同进步&#x1f91d;&#x1f91d; 一位上进心十足的【Java ToB端大厂…

C/C++开发,opencv-features2d模块,SIFT等特征检测器应用

目录 一、OpenCV-features2d 模块简介 1.1 features2d 模块信息 1.2 features2d 模块应用流程 二、features2d 模块编码案例 2.1 实现逻辑 2.2 features2d 模块应用程序代码 2.3 程序编译及运行 一、OpenCV-features2d 模块简介 1.1 features2d 模块信息 features2d 是…

炒美股怎么开户?

近年来&#xff0c;随着国内投资者对境外投资需求的不断增长&#xff0c;炒美股逐渐成为许多投资者的选择。然而&#xff0c;随着监管政策的不断完善&#xff0c;传统的互联网券商开户方式已经不再适用。那么&#xff0c;对于想要入场美股市场的投资者来说&#xff0c;该如何开…

Angular中的路由

Angular中的路由 文章目录 Angular中的路由前言一、创建路由二、创建多个组件路由三、创建子路由四、创建多个组件子路由 前言 在Angular中&#xff0c;路由是用于在不同的视图和组件之间导航的机制。Angular提供了一种强大的路由机制来管理单页应用&#xff08;SPA&#xff0…

vue2项目升级到vue3经历分享4

后端重构&#xff0c;如果接口做好抽象封装&#xff0c;只需要考虑jar之间的兼容性问题&#xff0c;jdk版本不变&#xff0c;基本不用做太大的调整&#xff0c;但是前端就不一样&#xff0c;除了vue框架本身&#xff0c;css的调整&#xff0c;改起来更是让人头疼。前面写了vue2…

Android 开机启动扫描SD卡apk流程源码分析

在开机的时候&#xff0c;装在SD卡的apk和装在系统盘的apk扫描过程不一样&#xff0c;系统盘apk在系统启动过程中扫描&#xff0c;而SD卡上的就不是&#xff0c;等系统启动好了才挂载、扫描&#xff0c;下面就说下SD扫描的流程&#xff1a; 在SystemServer启动MountService&am…

【Hadoop】MapReduce (七)

MapReduce 执行流程 MapTask执行流程 Read&#xff1a;读取阶段 MapTask会调用InputFormat中的getSplits方法来对文件进行切片切片之后&#xff0c;针对每一个Split&#xff0c;产生一个RecordReader流用于读取数据数据是以Key-Value形式来产生&#xff0c;交给map方法来处理…

02_SpringBoot程序快速启动

目录 打包命令启动启动成功测试结果 打包 点击package打包命令&#xff0c;会生成target目录&#xff0c;目录下会有生成的jar包 命令启动 打开cmd命令窗口&#xff0c;进入子项目的target目录下,输入命令后&#xff0c;回车… java -jar .\note-boot-core-1.0-SNAPSHOT.j…

C++新手村指南:入门基础

目录 C概念 C发展史 C关键字&#xff08;C98&#xff09; 命名空间 命名空间的定义 命名空间的使用 C中的输入&&输出 缺省参数 缺省参数的概念 缺省参数的分类 函数重载 函数重载概念 函数重载实现 引用 引用的概念 引用的特性 常引用 引用的使用场景…

【Python图像分类系列】建立CNN模型实现猫狗图像分类(案例+源码)

这是我的第275篇原创文章。 一、引言 基于CNN卷积神经网络在图像识别领域的应用&#xff1a;猫狗图像识别。主要内容包含&#xff1a; 数据创建和预处理 神经网络模型搭建 神经网络模型的训练和拟合 文中使用的深度学习框架是Keras。部分数据展示&#xff1a; 猫&#xf…

基于opencv的车辆统计

车辆统计&#xff09; 一、项目背景二、整体流程三、常用滤波器的特点四、背景减除五、形态学开运算闭运算 六、项目完整代码七、参考资料 一、项目背景 检测并识别视频中来往车辆的数量 最终效果图&#xff1a; 二、整体流程 加载视频图像预处理&#xff08;去噪、背景减除…

C++类和对象中篇

&#x1f407; &#x1f525;博客主页&#xff1a; 云曦 &#x1f4cb;系列专栏&#xff1a;[C] &#x1f4a8;路漫漫其修远兮 吾将而求索 &#x1f49b; 感谢大家&#x1f44d;点赞 &#x1f60b;关注&#x1f4dd;评论 文章目录 &#x1f4d4;前言&#x1f4d4;1、类的六个…

视频汇聚边缘网关EasyCVR硬件设备无法访问域名,解析失败该如何处理?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。视频汇聚融合管理平台EasyCVR既具备传统安防视…

小麦穗检测数据集VOC+YOLO格式6508张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;6508 标注数量(xml文件个数)&#xff1a;6508 标注数量(txt文件个数)&#xff1a;6508 标注…

实践指南:如何将SpringBoot项目无缝部署到Tomcat服务器

序言 SpringBoot 是一个用来简化 Spring 应用初始搭建以及开发过程的框架&#xff0c;我们可以通过内置的 Tomcat 容器来轻松地运行我们的应用。但在生产环境中&#xff0c;我们可能需要将应用部署到独立的 Tomcat 服务器上。本文给大家介绍 SpringBoot 项目部署到独立 Tomcat…