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

news/2024/5/19 5:53:11

请求对象

请求对象参数

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.mrgr.cn/p/64824022

相关文章

数字旅游以科技创新为核心:推动旅游服务的智能化、精准化、个性化,为游客提供更加贴心、专业、高效的旅游服务

目录 一、引言 二、数字旅游以科技创新推动旅游服务智能化 1、智能化技术的应用 2、提升旅游服务的效率和质量 三、数字旅游以科技创新推动旅游服务精准化 1、精准化需求的识别与满足 2、精准化营销与推广 四、数字旅游以科技创新推动旅游服务个性化 1、个性化服务的创…

HTUCTF2024 河南师范大学招新赛

CRYPTO easyMath 题目 中国古代有很多人同名譬如同样叫孙子,有的人会兵法,有的人会数学你能帮我求解出这道题的答案吗?请开启容器后下载对应输出文件难度:简单 from secret import flag from Crypto.Util.number import *def s2n(string):return int(string.encode("u…

2024 年 5 月 1 日 周三 小雨 冷(384 字)

正文祖父见到我和见长,第一句话是好久都没看到我们的孙子了。然后第二句话直接把我们俩都干懵了。“你们有没有阿托品啊?”我第一反应是懵,第二反应是想笑。上哪儿给你找这种处方药去…… 这种 M 受体阻断剂管得还严,严重有机磷中毒的时候,一掰就是几十支。而且这药不是最…

安装库后JupyterLab一直报ModuleNotFoundError问题解决

背景&#xff1a; 先安装的Python3.10&#xff0c;安装在默认路径&#xff1a; C:\Users\#用户名省略#\AppData\Local\Programs\Python\Python310\ 后安装的Anaconda&#xff0c;更改过路径在D盘&#xff1a; D:\ProgramData\anaconda3 此时C盘Python安装路径下Scripts文件…

linux搭建个人博客wordpress(LNMP)

目录 准备阶段&#xff1a; 1.部署LNMP环境 2.配置数据库 3.上线WordPress博客平台 4.来到web界面安装博客平台 5.WordPress博客平台优化 总结&#xff1a; 利用LNMPWordPress搭建博客网站平台 WordPress是一款使用PHP语言开发的博客平台 1.易用性高&#xff1a;操作简单…

linuxI2C驱动核心梳理

参考文章《linux设备驱动开发详解》第15章 【linux iic子系统】i2c整体框图【精髓部分】(五)_bus_for_each_drv-CSDN博客 linux设备驱动程序——i2c总线的添加与实现_如何填充i2c_client-CSDN博客 【linux iic子系统】i2c设备与驱动匹配过程(三)_i2c_add_driver 如何和clen…

Python异步Redis客户端与通用缓存装饰器

前言 这里我将通过 redis-py 简易封装一个异步的Redis客户端&#xff0c;然后主要讲解设计一个支持各种缓存代理&#xff08;本地内存、Redis等&#xff09;的缓存装饰器&#xff0c;用于在减少一些不必要的计算、存储层的查询、网络IO等。 具体代码都封装在 HuiDBK/py-tools: …

Java web第五次作业

1.在idea中配置好数据源 2、视频案例中只给出了查询所有结果的示例&#xff0c;请自己完成添加、删除、修改操作的代码。以下供参 考。 Delete("delete from emp where id#{id}") public void delete(Integer id); 测试代码 Test public void testDelete(){ empMa…

mac安装虚拟机linux系统

需要下载的有&#xff1a;centos8镜像 , 虚拟器 VMware 软件包 , Termius 或者xshell 1. CentOS系统下载 linux系统一般有&#xff1a; CentOS、ubuntu、redhat&#xff0c;选择一种进行安装就可以 CentOS 2024 年开始停止维护和发布 CentOS8的下载与安装(windows下安装) 镜…

【初中英语提分神器】中考高频词汇大全001-A开头单词高频,轻松掌握,考试无忧!速来围观!

PDF格式公众号回复关键字:ZKGCH001副词 1 already 已经 She has already finished her homework. (她已经完成了她的作业。) 2 also 也,同样地,而且 They went to the movies, and I also went. (他们去看了电影,我也去了。) 3 almost 几乎,差不多 Ive almost finished…

循环神经网络模块介绍(Pytorch 12)

到目前为止&#xff0c;我们遇到过两种类型的数据&#xff1a;表格数据和图像数据。对于图像数据&#xff0c;我们设计了专门的卷积神经网络架构(cnn)来为这类特殊的数据结构建模。换句话说&#xff0c;如果我们拥有一张图像&#xff0c;我们 需要有效地利用其像素位置&#xf…

双向链表的简单实现

目录 1. 双向链表的结构 2.双向链表的实现 2.1 初始化 2.2 增 2.2.1 尾插 ​编辑 2.2.2 头插 3.删 2.3.1 尾删 2.3.2 头删 4. 找 5.任意位置插入 5.1 任意位置前插入 ​编辑 5.2 任意位置后插入 ​编辑 6. 任意位置删除 ​编辑 7. 改 8. 链表的销毁 3. 顺序…

Python编程——ModuleNotFoundError: No module named learning logs

Python编程:从入门到实践(2)第18章-从Django入手 执行命令 python manage.py makemigrations learning_logs 时报错,如图: 问题原因:learning_logs 错写成 learning logs正确代码如下:INSTALLED_APPS = [# 我的应用程序learning_logs,# 默认添加的应用程序django.contr…

Python第三方库的安装和导入

Python第三方库的安装和导入是Python编程中常见的操作,下面我将为您详细解释这两种操作,并提供相关案例。 Python中最常用的包管理工具是pip,可以方便地安装和管理第三方库。以下是几种常用的安装方法。目录一、Python第三方库的安装1. 使用pip命令行安装2. 使用PyCharm进行…

Python的国内安装源(也称为镜像源)

Python的国内安装源(也称为镜像源)数量会随着时间而增加或减少,因为新的镜像源可能会建立,而一些旧的镜像源可能会停止服务或不再更新。以下是一些常用的Python国内安装源(也称为PyPI镜像源)Python的国内安装源(也称为镜像源)数量会随着时间而增加或减少,因为新的镜像…

关于pycharm打不开这件事

一开始是因为pycharm社区版有些程序跑不出来,打算换成破解的专业版本,结果不仅没用成,还导致社区版用不了了 不管怎么双击他都没反应 通宵达旦得解决,隐约知道问题在哪里但就是找不到,熬到凌晨五点,早上10点醒了继续搞…… 只能说,网络的虚假教程害人不浅() 在pycharm…

Java线程基础 - 线程状态

线程状态转换新建(New) 创建后尚未启动,也就是初始状态 可运行(Runnable) 可能正在运行,也可能正在等待 CPU 时间片。 包含了操作系统线程状态中的 Running 和 Ready。 阻塞(Blocking) 阻塞状态是指线程因为等待某个条件(通常是I/O操作、获取锁、等待某些资源或者其他同步机…

《代码随想录》-1.数组理论基础

特点: 1.内存空间-连续存放 ——> 增删元素麻烦 2.数据-相同类型 3.下标从0开始 注意:数组的元素采用覆盖的形式 二维数组在内存的空间地址: 1.C++中二维数组在地址空间上是连续的2.Java中二维数组每一行的头节点的地址是没有规则的

LLM大语言模型原理、发展历程、训练方法、应用场景和未来趋势

LLM&#xff0c;全称Large Language Model&#xff0c;即大型语言模型。LLM是一种强大的人工智能算法&#xff0c;它通过训练大量文本数据&#xff0c;学习语言的语法、语义和上下文信息&#xff0c;从而能够对自然语言文本进行建模。这种模型在自然语言处理&#xff08;NLP&am…

手写Spring框架

1. 手写Spring框架 @目录1. 手写Spring框架每博一文案2. 反射机制的回顾3. 开始手写 Spring 框架3.1 第一步:使用 IDE 创建模块myspring3.2 第二步:准备好我们要管理的Bean3.3 第三步:准备myspring.xml配置文件3.4 第四步:编写ApplicationContext接口3.5 第五步:编写Class…