Scrapy:简单使用、xpath语法

news/2024/10/7 15:26:40 标签: scrapy

简单使用

简介

Scrapy 是一个为了爬取网站信息,提取结构性数据而编写的应用框架,可以用于数据挖掘、检测和自动化测试。

架构

  • 组件

    • ·引擎,指挥其他组件协同工作
    • 调度器 ,接收引擎发过来的请求,按照先后顺序,压入队列中,同时去除重复的请求
    • 下载器,用于下载网页内容,并将网页内容返回给爬虫
    • 爬虫,用于从特定网页中提取需要的信息
    • 项目管道,负责处理爬虫从网页中抽取的实体,主要的功能是持久化、验证实体的有效性、清除不需要的信息
    • 下载器中间件,介于引擎和下载器之间,主要处理Scrapy引擎与下载器之间的请求及响应
    • 爬虫中间件,介于引擎和爬虫之间,主要工作是处理爬虫的响应输入和请求输出
  • 数据流

简单使用

爬取 起点中文网月票榜 的小说名称、作者、类型
在这里插入图片描述
安装

pip install scrapy

创建项目

scrapy startproject qidian_yuepiao

目录结构

在这里插入图片描述
实现
spiders目录下创建爬虫源文件qidian_yuepiao_spider.py

scrapy genspider dingdian_xuanhuan https://www.xiaoshuopu.com/

其中scrapy genspider创建爬虫的命令,dingdian_xuanhuan爬虫名称,https://www.xiaoshuopu.com/要爬取的网站

想爬取起点的,但是有反爬,改成爬取 https://www.xiaoshuopu.com/class_1/

在这里插入图片描述

import scrapy


class DingdianXuanhuanSpider(scrapy.Spider):
    # 爬虫名称
    name = "dingdian_xuanhuan"
    # 允许的域名
    allowed_domains = ["www.xiaoshuopu.com"]
    # 起始URL列表
    start_urls = ["https://www.xiaoshuopu.com/class_1/"]

    def parse(self, response):
        # 小说列表
        novel_list = response.xpath("//table/tr[@bgcolor='#FFFFFF']")
        print("小说数量是:", len(novel_list))
        # 循环获取小说名称、最新章节、作者、字数、更新、状态
        for novel in novel_list:
            # 小说名称
            name = novel.xpath("./td[1]/a[2]/text()").extract_first()
            # 最新章节
            new_chapter = novel.xpath("./td[2]/a/text()").extract_first()
            # 作者
            author = novel.xpath("./td[3]/text()").extract_first()
            # 字数
            word_count = novel.xpath("./td[4]/text()").extract_first()
            # 更新
            update_time = novel.xpath("./td[5]/text()").extract_first()
            # 状态
            status = novel.xpath("./td[6]/text()").extract_first()
            
            # 将小说内容保存到字典中
            novel_info = {
                "name": name,
                "new_chapter": new_chapter,
                "author": author,
                "word_count": word_count,
                "update_time": update_time,
                "status": status
            }
            print("小说信息:",novel_info)
            
            # 使用yield返回数据
            yield novel_info
            

scrapy crawl dingdian_xuanhuan -o 玄幻.json

scrapy crawl爬虫的运行命令,dingdian_xuanhuan爬虫的名称,-o 玄幻.json输出格式,这个可以省略

支持的输出格式有:'json', 'jsonlines', 'jsonl', 'jl', 'csv', 'xml', 'marshal', 'pickle'

在这里插入图片描述

为什么使用yield返回数据

  • 内存效率
    • 节省内存:当处理大量数据时,如果直接将所有数据存储在列表或其他容器中再一次性返回,可能会消耗大量的内存。而使用 yield 可以逐个生成和处理数据项,这样可以大大减少内存的占用。
    • 按需生成:生成器只在需要的时候生成下一个值,这使得程序更加高效,尤其是在处理大数据集时。
  • 并发性和异步处理
    • 非阻塞:Scrapy 是基于 Twisted 异步网络库构建的,支持并发请求。使用 yield 可以使爬虫在等待某个请求响应时去处理其他任务,从而提高抓取效率。
    • 事件驱动:Scrapy 使用事件循环来管理多个请求和响应,yield 语句可以暂停当前函数的执行,让出控制权给事件循环,这样可以实现高效的异步操作。
  • 数据流处理
  • 管道化处理:在 Scrapy 中,你可以通过 yield 将数据传递到 Item Pipeline 进行进一步处理(如清洗、验证、存储等)。这种方式使得数据处理流程更加模块化和灵活。

xpath语法

简介

xpath 是一门在xml文档中查找信息的语言。htmlxml结构类似,因此也可以用在html

常用路径表达式

表达式描述示例
节点名称选取此节点的所有子节点div,p,h1
/从根节点选取(描述绝对路径)/html
//不考虑位置,选取页面中所有子孙节点//div
.选取当前节点./div
..选取当前节点的父节点h1/…/
@属性名选取属性的值@href
text()获取元素中的文本节点//h1/text()

示例

获取html元素

xpath("/html")

获取网页编码格式

xpath("//meta/@charset")

获取div的id属性值

xpath("//div/@id")

获取属性id为abc的div元素

xpath("//div[@id='abc']")

获取所有带有class属性的div元素

xpath("//div[@class]")

获取div节点中第一个p元素的文本

xpath("//div/p[1]/text()")

获取div节点中最后一个p元素的文本

xpath("//div/p[last()]/text()")

http://www.niftyadmin.cn/n/5692973.html

相关文章

51单片机的水质检测系统【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温度传感器ph传感器浑浊度传感器蓝牙继电器LED、按键和蜂鸣器等模块构成。适用于水质监测系统,含检测和调整水温、浑浊度、ph等相似项目。 可实现功能: 1、LCD1602实时显示水温、水体ph和浑浊度 2、温…

HBase 性能优化 详解

HBase 是基于 Hadoop HDFS 之上的分布式 NoSQL 数据库,具有高伸缩性和强大的读写能力。然而,由于其分布式架构和复杂的数据存储模式,在高并发、大规模数据场景下,HBase 性能优化至关重要。从底层原理和源代码层面理解 HBase 的特性…

ThinkPHP5基础入门

文章目录 ThinkPHP5基础入门一、引言二、环境搭建1、前期准备2、目录结构 三、快速上手1、创建模块2、编写控制器3、编写视图4、编写模型 四、调试与部署1、调试模式2、关闭调试模式3、隐藏入口文件 五、总结 ThinkPHP5基础入门 一、引言 ThinkPHP5 是一个基于 MVC 和面向对象…

论文阅读笔记-How to Fine-Tune BERT for Text Classification?

前言 How to Fine-Tune BERT for Text Classification? 预训练语言模型很强,通过微调可以给你的任务模型带来明显的提升,但是针对具体的任务如何进行微调使用,就涉及到了考经验积累的tricks,最近在打文本相关的比赛,正好用预训练模型为基础构建下游任务模型,所以着重的…

CSS——文字打字机效果

CSS——文字打字机效果 本文通过纯 CSS 实现文字的打字机效果&#xff0c;然后借助 JS 实现了扩展。 typewriter 基本思路 使用伪元素覆盖原文字&#xff0c;并且使用伪元素模拟闪烁的光标效果。 具体流程 首先是一些基本的设置 <!DOCTYPE html> <html lang"…

RabbitMQ入门3—virtual host参数详解

在 RabbitMQ 中&#xff0c;创建 Virtual Host 时会涉及到一些参数配置&#xff0c;比如 tags 和 Default Queue Type。下面是对这两个参数的详细解释&#xff1a; 1. Tags Tags 是 Virtual Host 的标记&#xff0c;用来为 Virtual Host 添加元数据&#xff0c;帮助你管理和组…

MoveIt2-humble----在 RViz 中实现可视化

官方文档上的教程&#xff0c;从moveit1的melodic到moveit2的foxy基本一致&#xff0c;但是从最新的humble开始有了很大的变化&#xff0c;其中之一便是 lambda表达式 的广泛使用。 本节为教程的第二节&#xff0c;会介绍一个工具&#xff08;moveit_visual_tools&#xff09;…

allegro 不同页面相同网路的连接

一、cadence学习笔记&#xff08;1&#xff09;-原理图库制作 绘制好各个界面 放置OFFPAGE 绘制好单个界面是这个样子的&#xff0c;并将剩下的界面进行相同的操作 所有界面完成后&#xff0c;进入设计界面 右键design1.dsn选择Annotate… 点击OK后可以看到WiFi界面OFFPAGE旁边…