Scrapy:简单使用、xpath语法

embedded/2024/10/10 17:26:14/

简单使用

简介

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 scrapyclass 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.ppmy.cn/embedded/125475.html

相关文章

【ECMAScript 从入门到进阶教程】第四部分:项目实践(项目结构与管理,单元测试,最佳实践与开发规范,附录)

第四部分:项目实践 第十四章 项目结构与管理 在构建现代 Web 应用程序时,良好的项目结构和管理是确保代码可维护性、高效开发和部署成功的关键因素。这一章将深入讨论项目初始化与配置,以及如何使用构建工具来简化和优化项目建设过程。 14…

『网络游戏』客户端发送消息到服务器【17】

将上一章服务器的协议PEProtocol的.dll文件重新生成导入unity客户端中 命名为Net 点击生成 另一种导入.dll文件方式 在客户端粘贴即可 此时Net文件夹的.dll文件就导入进来了 创建脚本:NetSvc.cs 编写脚本:NetSvc.cs 修改脚本:GameRoot.cs 在…

llama3 implemented from scratch 笔记

github地址:https://github.com/naklecha/llama3-from-scratch?tabreadme-ov-file 分词器的实现 from pathlib import Path import tiktoken from tiktoken.load import load_tiktoken_bpe import torch import json import matplotlib.pyplot as plttokenizer_p…

探索 GraphRAG:从存储到查询,深入解析 NebulaGraph 与传统 SQL 的对比

近年来,图数据库逐渐成为大数据和人工智能领域的热议话题。特别是随着 GraphRAG 技术的火爆,如何高效存储和查询大规模图数据成为很多开发者关心的问题。出于好奇,我最近尝试了 GraphRAG 并研究其存储结构,因此决定进一步探索图数…

SafeLine - 雷池 - 不让黑客越过半步

👋 项目介绍 SafeLine,中文名 “雷池”,是一款简单好用, 效果突出的 Web 应用防火墙(WAF),可以保护 Web 服务不受黑客攻击。 雷池通过过滤和监控 Web 应用与互联网之间的 HTTP 流量来保护 Web 服务。可以保护 Web 服务免受 SQL …

Docker部署如何修改本地mysql,redis连接信息

要修改数据库 MySQL 和缓存 Redis 的地址为 ruoyi-mysql 和 ruoyi-redis,通常需要在 Spring Boot 项目的配置文件中进行相应的修改。 ### 修改 MySQL 数据库地址为 ruoyi-mysql 1. **在 Spring Boot 项目中找到 application.properties 或 application.yml 文件**…

Solidity优质例子(二)物流的增删改查智能合约(附truffle测试)

本合约非常适合新手学习,其包含了基本的增删改查功能以及各个方式的不同之处的总结,本套合约我也编写了truffle测试,学习truffle测试的小伙伴也有福了~ 该合约的主要作用是通过区块链技术实现物流追踪系统的透明化、自动化与防篡改特性&#…

TryHackMe 第6天 | Web Fundamentals (一)

这一部分我们要简要介绍以下 Web Hacking 的基本内容,预计分三次博客。 在访问 Web 应用时,浏览器提供了若干个工具来帮助我们发现一些潜在问题和有用的信息。 比如可以查看网站源代码。查看源代码可以 右键 网页,然后选择 查看网站源代码&…