Scrapy:简单使用、xpath语法

news2024/10/10 15:44:40

简单使用

简介

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.coloradmin.cn/o/2202399.html

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

相关文章

APP的命令和monkey压力测试

一、命令的使用: 1.dos下链接:adb connect 127.0.0.1:62001 2.所附设备清单:adb devices device:已识别的设备,表示连接成功 unauthorized:没有授权需要手机授权才能连接 unkown:未识别设备 offline:离线设备 3.版本:…

基于LORA的一主多从监测系统_BMP280气压传感器

关联:LORA 、HAL、气压传感器 这个传感器也是比较常见的,但灵敏度什么的都没啥问题,不过气压传感器不是很好去观察这个变化,毕竟一个地方的大气压基本不会有太大波动,我们可以在百度搜索所在地的平均大气压&#xff0…

bladex漏洞思路总结

Springblade框架介绍: SpringBlade是一个基于Spring Boot和Spring Cloud的微服务架构框架,它是由商业级项目升级优化而来的综合型项目。 0x1 前言 最近跟一些大佬学习了blade的漏洞,所以自己总结了一下,在渗透测试过程中&#x…

frp+windows+宝塔+域名使用

先讲一下frp的相关概念 1. 什么是 FRP? FRP (Fast Reverse Proxy) 是一款开源的反向代理工具,支持多种协议(如 TCP、UDP、HTTP 和 HTTPS)的内网穿透。它能够帮助你将位于内网或防火墙后面的服务映射到外网,方便外网用…

产品经理想转行做大模型AI产品经理,建议看看这篇文章!(文末福利)

如果你想转行做大模型,作为一名AI产品经理,你可以怎么做呢?或许,你可以先进行自我检测,看看自己是否真的适合转行做大模型。这篇文章里,作者便给想转行做大模型的AI产品经理们提出了一些建议,不…

【进阶版】如何实现一个基于 HTML+CSS+JS 的任务进度条

创建一个动态任务进度条:进阶版实现 在现代网页开发中,任务进度条是用户交互中非常重要的组件,它能够直观地展示任务的进展情况。本文将向你展示如何使用 HTML、CSS 和 JavaScript 创建一个动态的任务进度条。在这个进阶版本中,用…

三网话费折扣api怎么对接合作?如何变现?

三网优惠话费充值接口对接的操作步骤通常包括以下几个阶段: 注册账号:在API服务提供商的控制台注册账号,例如微客云控制台 。添加店铺:在控制台中添加店铺,并保存店铺ID或只勾选CMS 。申请API密钥:联系客服…

临时提高电压的常用方法电荷泵、自举升压电路

一、临时提高电压 爽死*子了,*子也硬玩一把临时重组器……(雷总音)。临时提高星级或者电压真的是一件很爽的事情,小钱办大事轻松拿捏。常用的临时提高电压的方式主要有两种,电荷泵和自举升压电路,你的某米手…

Nvidia在AI峰会上发布了七项重大技术公告

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

文档大师:打造一站式 Word 报告解决方案

最新技术资源(建议收藏) https://www.grapecity.com.cn/resources/ 前言 在政府、医院、银行、财务以及销售等领域,常常需要创建各种报告文件来展开工作汇报,譬如季度销售报告、年度总结报告、体检报告和保险合同等。在没有报表工…

一个月学会Java 第7天 字符串与键盘输入

Day7 字符串与键盘输入 字符串作为所有程序都很重要的东西,这个东西必须好好的学习,在Java中String会比较好学习,比起C和C里面会更加的简单, 在Java之中也是很好理解的,因为底层已经封装好了char数组,也就是…

《深入浅出LLM基础篇》(五):Propmt工程优化

🎉AI学习星球推荐: GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料,配有全面而有深度的专栏内容,包括不限于 前沿论文解读、…

【C++】AVL树(AVLTree)

目录 一、AVL树概念: 二、定义: 三、AVL树的插入: 四、AVL树的旋转: 1、左单旋: 2、右单旋: 3、右左双旋: 4、左右双旋: 五、AVL树的检验: 一、AVL树概念&#x…

重离子+数字化,肿瘤治疗的新路

大国之重器,当为大国之民生。 医用重离子加速器装置,被誉为肿瘤放疗领域的大国重器。在河西走廊东侧的甘肃省武威肿瘤医院(以下简称:武威肿瘤医院),我国首台拥有自主知识产权的医用重离子加速器装置坐落此。自建成投入使用以来&a…

新手教学系列——爬虫异步并发注意事项

引言 爬虫是网络数据采集中不可或缺的工具,很多程序员在入门时会遇到这样的问题:为什么我的爬虫这么慢?尤其在面对大量数据时,单线程爬虫的速度可能让人捶胸顿足。随着爬虫规模的增大,异步并发成为了提高爬取效率的关键。然而,异步并发并不像表面看起来那么简单,如果没…

有哪些可靠的算力租赁平台推荐

作为一名炼丹师,在炼丹过程中使用过不少 GPU 算力租用平台,也有很多心得体会~为了让道友们少走弯路,我打算把近期在市场上用过的几家热门的 GPU 算力平台比较比较,以便其他炼丹师选择适合自己的算力平台。话不多说看! …

Python简介与入门

如果你要用计算机做很多工作,最后你会发现有一些任务你更希望用自动化的方式进行处理。比如,你想要在大量的文本文件中执行查找/替换,或者以复杂的方式对大量的图片进行重命名和整理。也许你想要编写一个小型的自定义数据库、一个特殊的 GUI …

2025年人工智能行业的发展趋势预测以及中小企业的应对策略

大家好,我是Shelly,一个专注于输出AI工具和科技前沿内容的AI应用教练,体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具,拥抱AI时代的到来。 ​ 进入2024年的第四季度,人工…

python数据分析与可视化工具介绍-numpy库

NumPy(Numerical Python的简称),是科学计算基础的一个库,提供了大量关于科学计算的相关功能,例如,线性变换,数据统计,随机数生成等。其提供的最核心的类型为多维数组类型&#xff08…

Android Studio 打包混淆失效问题

项目场景: 通过 Python 脚本运行打包 Apk ,实现动态配置各个版本的 Apk。 问题描述 通过 Python 脚本打包编译 Apk,开启混淆后,打包成功,反编译出来的 Apk 并没有被混淆。 原因分析: 首先确认打包混淆…