Scrapy:简单使用、xpath语法

简单使用

简介

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

架构

  • 组件

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

简单使用

爬取 起点中文网月票榜 的小说名称、作者、类型

安装

java 复制代码
pip install scrapy

创建项目

java 复制代码
scrapy startproject qidian_yuepiao

目录结构


实现

spiders目录下创建爬虫源文件qidian_yuepiao_spider.py

java 复制代码
scrapy genspider dingdian_xuanhuan https://www.xiaoshuopu.com/

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

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

java 复制代码
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
            
java 复制代码
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元素

java 复制代码
xpath("/html")

获取网页编码格式

java 复制代码
xpath("//meta/@charset")

获取div的id属性值

java 复制代码
xpath("//div/@id")

获取属性id为abc的div元素

java 复制代码
xpath("//div[@id='abc']")

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

java 复制代码
xpath("//div[@class]")

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

java 复制代码
xpath("//div/p[1]/text()")

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

java 复制代码
xpath("//div/p[last()]/text()")
相关推荐
麦麦大数据7 天前
scrapy爬取汽车、车评数据【上】
scrapy·汽车
A~taoker12 天前
scrapy爬虫基础
爬虫·scrapy
jiaoxingk14 天前
不会JS逆向也能高效结合Scrapy与Selenium实现爬虫抓取
javascript·爬虫·python·selenium·scrapy
计算机学姐14 天前
基于大数据可视化的化妆品推荐及数据分析系统
vue.js·hadoop·spring boot·python·scrapy·mysql·信息可视化
2401_8725149717 天前
Scrapy爬虫IP代理池:提升爬取效率与稳定性
爬虫·tcp/ip·scrapy