学习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数据
        # 从登录页获取到tooken
        token = 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.url
        item["title"] = response.xpath("//h1/text()").get()
        print("建立模板:", item)
        return item

    def parse_page(self, response):
        print("翻页:", response.url)

在这里插入图片描述

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

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

相关文章

OpenCV的周期性噪声去除滤波器(70)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇:OpenCV如何通过梯度结构张量进行各向异性图像分割(69) 下一篇 :OpenCV如何为我们的应用程序添加跟踪栏(71) 目录 目标 理论 如何消除傅里叶域中的周期性噪声&#xff1f; 源代码 解释 结果 目…

IDEA--debug

1. 单点调试的三个级别 Step into&#xff1a;在单步执行时&#xff0c;遇到子函数就进入并且继续单步执行。Step over&#xff1a;在单步执行时&#xff0c;在函数内遇到子函数时不会进入子函数内单步执行&#xff0c;而是将子函数整个执行完再停止&#xff0c;也就是把子函数…

用树莓派2B当web服务器

树莓派2&#xff0c;卡片大小&#xff0c;arm 32位cpu&#xff0c;512G内存。我找了一下购买记录&#xff0c;2013年12月15日买的。带网线接头。属于树莓派2B。以前下载的操作系统还在。是2014年的操作系统&#xff0c;文件名是&#xff1a;2014-09-09-wheezy-raspbian_shumeip…

C语言之整形提升和算术转换

目录 前言 一、整形提升 二、算术转换 总结 前言 本文主要介绍C语言中的整形提升和算术转换的概念和意义&#xff0c;以及例题帮助理解&#xff0c;了解之后&#xff0c;我们就能知道在C语言中&#xff0c;字符型变量如何计算以及如果变量的类型、字节大小不一致的情况下&am…

前端工程化06-JavaScript模块化CommonJS规范ES Module

7、JavaScript模块化 在js开发中&#xff0c;他并没有拆分的概念&#xff0c;并不像java一样他可以拆分很多的包&#xff0c;很多的类&#xff0c;像搭积木一样完成一个大型项目的开发&#xff0c;所以js在前期的时候并不适合大型后端的项目开发&#xff0c;但是这些问题在后来…

Android 10.0 Launcher3 app页面调整workspace边距app行距变小功能实现

1.前言 在10.0的系统rom定制化开发中,在launcher3的一些开发定制功能中,在对于大分辨率比如1600*2560的设备进行开发的时候, 会在竖屏的时候,在默认7*4的布局的时候,显得行距有点宽,这样就需要调整整个CellLayout的上下左右边距,然后就 会显得行距会小一点,接下来具体…

ASP.NET网上书店

摘要 本设计尝试用ASP.NET在网络上架构一个电子书城&#xff0c;以使每一位顾客不用出门在家里就能够通过上网来轻松购书。本文从理论和实践两个角度出发&#xff0c;对一个具有数据挖掘功能电子书城进行设计与实现分析。论文首先较为详尽地介绍了面向对象分析与设计的有关概念…

基于Springboot的房屋租赁管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的房屋租赁管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

图中有几个三角形

让我们先把三角形进行分类&#xff1a;1块组成的三角形、2块组成的三角形、依此类推。 1块组成的三角形有4个&#xff1a; 2块组成的三角形有&#xff1a;12,13,14,23,24,34.其中&#xff0c;14&#xff0c;23构不成三角形. 3块组成的三角形有&#xff1a;123,124,134,234。但…

贪心算法(活动选择、分数背包问题)

一、贪心算法 贪心算法是指&#xff1a;在对问题求解时&#xff0c;总是做出在当前看来是最好的选择&#xff0c;而不从整体最优考虑&#xff0c;做出的仅是在某种意义上的局部最优解。 …

流畅的Python阅读笔记

五一快乐的时光总是飞快了&#xff0c;不知多久没有拿起键盘写文章了&#xff0c;最近公司有Python的需求&#xff0c;想着复习下Python吧&#xff0c;然后就买了本Python的书籍 书名&#xff1a; 《流畅的Python》 下面是整理的一个阅读笔记&#xff0c;大家自行查阅&#xf…

Python 全栈系列241 GFGo Lite迭代

说明 随着整个算网开发逐渐深入&#xff0c;各个组件、微服务的数量、深度在不断增加。由于算网是个人项目&#xff0c;我一直按照MVP(Minimum Viable Product )的原则在推进。由于最初的时候对架构、算法和业务的理解并没有那么深刻&#xff0c;所以MVP的内容还是在不断变化&…

选择深度学习框架:TensorFlow 2 vs PyTorch

TensorFlow 2 vs PyTorch 选择深度学习框架&#xff1a;TensorFlow 2 vs PyTorchTensorFlow 2概述TensorFlow 2的优点TensorFlow 2的缺点 PyTorch概述PyTorch的优点PyTorch的缺点 选择建议对于选择困难症的人&#xff0c;我给你们的答案——PyTorch选择理由&#xff1a;结论&am…

数据结构(C):玩转链表

&#x1f37a;0.前言 言C之言&#xff0c;聊C之识&#xff0c;以C会友&#xff0c;共向远方。各位博友的各位你们好啊&#xff0c;这里是持续分享数据结构知识的小赵同学&#xff0c;今天要分享的数据结构知识是链表&#xff0c;在这一章&#xff0c;小赵将会向大家展开聊聊链表…

常用语音识别开源四大工具:Kaldi,PaddleSpeech,WeNet,EspNet

无论是基于成本效益还是社区支持&#xff0c;我都坚决认为开源才是推动一切应用的动力源泉。下面推荐语音识别开源工具&#xff1a;Kaldi&#xff0c;Paddle&#xff0c;WeNet&#xff0c;EspNet。 1、最成熟的Kaldi 一个广受欢迎的开源语音识别工具&#xff0c;由Daniel Pove…

Servlet框架

简介 Servlet是运行在web服务器或应用服务器上的程序&#xff0c;他是作为来自web浏览器或其他http客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。 使用Servlet可以手机来自网页表单的用户输入&#xff0c;呈现来自数据库或者其他源记录&#xff0c;还可以动态创…

IDEA访问不到静态资源

背景 我在resources下创建static文件夹&#xff0c;再创建front文件夹放前端资源&#xff0c;里面有index.html&#xff0c;游览器输入localhost:8011/front没反应。&#xff08;resources/static/front/index.html&#xff09; 解决办法 重启idea&#xff0c;清楚idea缓存&am…

设计模式之服务定位器模式

想象一下&#xff0c;你的Java应用是一座庞大的迷宫&#xff0c;里面藏着无数宝贵的服务宝藏&#xff0c;而你正需要一张精确的藏宝图来指引方向&#xff0c;迅速找到并利用这些宝藏。服务定位器模式&#xff0c;正是这样一张神奇的地图&#xff0c;它帮你动态定位并获取应用中…

stl容器 string类的基本操作

目录 一.string类的构造 二.string类的输出 1.传统字符串输出 2.通过迭代器进行输出 ​编辑 3.C11标准的范围for输出加auto推导类型 三.string类的各种迭代器 begin(&#xff09;和end() 利用迭代器遍历输出 利用迭代器修改字符串的字符 rbgin()和rend() 利用迭代器遍…

[论文阅读]Adversarial Autoencoders(aae)和代码

In this paper, we propose the “adversarial autoencoder” (AAE), which is a probabilistic autoencoder that uses the recently proposed generative adversarial networks (GAN) to perform variational inference by matching the aggregated posterior of the hidden …