Scrapy:简单使用、xpath语法

简单使用

简介

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()")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无知的小菜鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值