scrapy--json结构数据-存储

news2024/11/14 1:53:26

免责声明:本文仅做演示与分享...

目录

基于命令存储的解析方法:

settings.py

blibli.py

基于管道存储的解析方法:

  1-在爬虫文件中进行数据解析

  2-在items.py定义相关属性

  3-在 爬虫文件中 把 解析的数据存储封装到item类型对象中

  4-把item类型对象提交给管道

  5-在管道文件中,接收爬虫文件提交过来的item类型对象

保存到Excel中:

保存到数据库(mysql)中:

 

  6-配置文件中开启管道


b站热度排行榜

基于命令存储的解析方法:

--只需修改图中画圈的文件即可.

settings.py

根据需要自己设置.

(伪装头,君子协议,日志输出)...

blibli.py

import scrapy
from scrapy_demo1.items import ScrapyDemo1Item


# 找到数据所在的URL
# 执行项目
class BlibliSpider(scrapy.Spider):
    name = "blibli"
    # allowed_domains = ["blibli.com"]
    start_urls = [
        "https://api.bilibili.com/x/web-interface/ranking/v2?rid=0&type=all&web_location=333.934&w_rid=6d0af3cab734841a471545ef10d2a0f0&wts=1724383027"
    ]

    # 基于命令存储的解析方法
    def parse(self, response):
        ls = []
        # pass
        # 如果请求的url的响应内容为json数据,也可以直接调用json()方法获取数据
        # print(response.json())  # 字典类型
        data = response.json()

        # print(data)
        for d in data["data"]["list"]:
            aid = d["aid"]
            desc = d["desc"]
            title = d["title"]
            name = d["owner"]["name"]
            # print(aid, desc, title, name)
            # 一次性返回100条数据, [{},{},{},{}]
            dict = {
                "视频id": aid,
                "视频标题": title,
                "视频描述": desc,
                "视频作者": name,
            }
            ls.append(dict)
        return ls

---返回一个对象之后,直接 scrapy crawl blibli -o blibli.csv 即可. 


基于管道存储的解析方法:

复杂点 -->

  1-在爬虫文件中进行数据解析

import scrapy
from scrapy_demo1.items import ScrapyDemo1Item

# 找到数据所在的URL
# 执行项目
class BlibliSpider(scrapy.Spider):
    name = "blibli"
    # allowed_domains = ["blibli.com"]
    start_urls = [
        "https://api.bilibili.com/x/web-interface/ranking/v2?rid=0&type=all&web_location=333.934&w_rid=6d0af3cab734841a471545ef10d2a0f0&wts=1724383027"
    ]

    # 基于管道存储的解析方法
    def parse(self, response):
        data = response.json()
        for d in data["data"]["list"]:
            aid = d["aid"]
            desc = d["desc"]
            title = d["title"]
            name = d["owner"]["name"]
            # 类名() ScrapyDemo1Item() 实例化
            item = ScrapyDemo1Item()
            # 把解析出来的数据存入到对象中: 对象名.属性名 = 数据
            # !!!!!!!!!!!
            # 不能按对象的属性添加. 而要放到字典中, 然后再把字典传给item对象.
            item["bvid"] = aid
            item["title"] = title
            item["desc"] = desc
            item["name"] = name
            # 调用yield将数据传递给管道; return则不会传递给管道. return,yield

            yield item  # 数据有多少条就提交多少次.

  2-在items.py定义相关属性

(你要保存什么数据,就定于什么属性.)

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html

import scrapy

class ScrapyDemo1Item(scrapy.Item):  # 类名可以自定义,但是必须继承scrapy.Item
    # define the fields for your item here like:
    # 类中定义属性,定义几个属性,取决于你
    bvid = scrapy.Field()  # 字段
    # 属性名可以自定义,建议和解析时的一样.
    title = scrapy.Field()
    desc = scrapy.Field()
    name = scrapy.Field()

  3-在 爬虫文件中 把 解析的数据存储封装到item类型对象中

 

  4-把item类型对象提交给管道

yield item  # 数据有多少条就提交多少次.

  5-在管道文件中,接收爬虫文件提交过来的item类型对象

  (默认的类只针对保存到txt里面.)

保存到 Excel / 数据库 中 需要自己定义类.

 

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html


# useful for handling different item types with a single interface
from itemadapter import ItemAdapter


class ScrapyDemo1Pipeline:  # 如果自定义类名,在配置文件中也要修改.
    # 打开 , 写入 , 关闭.
    def open_spider(self, spider):
        print("爬虫开始")
        # 打开文件: 只能用 open

        # 添加属性:当对象中没有该属性时,才会添加.  修改属性:当对象中有f属性时.
        self.f = open("b站2.txt", "w", encoding="utf-8")

    def process_item(self, item, spider):  # item 是爬取的item, spider 是爬虫对象.
        # yield 提交多少次,就会执行多少次process_item函数.
        # print(1)
        # 保存到记事本文件中    w :覆盖模式   a :追加模式
        # 浪费资源 ---多次打开和关闭.
        # with open("b站.txt", "a", encoding="utf-8") as f:
        #     # item 不是字符串.  write() 方法需要字符串参数.
        self.f.write(f"{item['bvid']}\n{item['title']}\n{item['desc']}\n{item['name']}")

        return item  # 是否提交给下一个管道类 (优先级)
        # print(3)
        # pass

    # 一次打开,多次写入:

    def close_spider(self, spider):
        self.f.close()
        print("爬虫结束")

保存到Excel中:

后面的设置别忘了配置一下.

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html


# useful for handling different item types with a single interface
from itemadapter import ItemAdapter


import openpyxl


# 自定义管道类--保存到excel文件中.
class ExcelPipeline:
    # 创建工作薄对象 1
    # 选择工作表    1
    # 添加表头    1
    # 写入数据    多
    # 保存文件    1
    def open_spider(self, spider):
        self.wb = openpyxl.Workbook()
        self.sheet = self.wb.active
        self.sheet.append(["视频id", "视频标题", "描述", "作者"])

    def process_item(self, item, spider):
        self.sheet.append([item["bvid"], item["title"], item["desc"], item["name"]])

    def close_spider(self, spider):
        self.wb.save("b站排行榜数据.xlsx")


保存到数据库(mysql)中:

后面的设置别忘了配置一下.

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html


# useful for handling different item types with a single interface
from itemadapter import ItemAdapter


# 保存到数据库中:
import pymysql

# utf8mb4 解决表情包问题.
class MySQLPipeline:
    # 创建连接对象 1
    # 创建游标对象 1
    # 插入数据 多
    # 提交事务 1
    # 关闭游标 1
    # 关闭连接 1
    conn = ""
    cur = ""

    def open_spider(self, spider):

        # 连接数据库
        self.conn = pymysql.connect(
            host="127.0.0.1", user="root", password="root", port=3306, database="test"
        )
        # 创建游标
        self.cursor = self.conn.cursor()

    def process_item(self, item, spider):
        try:
            # 插入数据
            sql = 'INSERT INTO blibli VALUES (NULL,"%s", "%s", "%s", "%s")' % (
                item["title"],
                item["desc"],
                item["bvid"],
                item["name"],
            )
            self.cursor.execute(sql)  # 执行后 出现有的数据插不进去,火星文.
            # 数据库中title字段默认使用的utf8 ,无法保存表情包,-->用utf8mb4.
            # 提交事务
            self.conn.commit()
        except Exception as e:
            print(sql)
            print(e)
            # 回滚事务
            self.conn.rollback()

    def close_spider(self, spider):
        if self.conn != "" and self.cur != "":
            # 关闭游标
            self.cursor.close()
            # 关闭连接
            self.conn.close()
        print("结束-------------")

 


  6-配置文件中开启管道


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2071539.html

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

相关文章

软件设计之MySQL(6)

软件设计之MySQL(6) 此篇应在JavaSE之后进行学习: 路线图推荐: 【Java学习路线-极速版】【Java架构师技术图谱】 Navicat可以在软件管家下载 使用navicat连接mysql数据库创建数据库、表、转储sql文件,导入sql数据 MySQL数据库入门到大牛,my…

【吊打面试官系列-Memcached面试题】memcached 能接受的 key 的最大长度是多少?

大家好,我是锋哥。今天分享关于 【memcached 能接受的 key 的最大长度是多少?】面试题,希望对大家有帮助; memcached 能接受的 key 的最大长度是多少? key 的最大长度是 250 个字符。需要注意的是,250 是 m…

KEIL中分散加载文件基础知识

一、分散加载文件基本概念 1、分散加载文件:(即scatter file 后缀为.scf)是一个文本文件,通过编写一个分散加载文件来指定ARM连接器在生成映像文件时如何分配RO,RW,ZI等数据的存放地址。如果不用分散加载文件指定,那么…

区域形态学demo发布

demo实现了halcon中threshold、connection、fill_up、union、difference、intersection、dilation、erosion、opening、closing等算子功能,区域使用行程编码表示。目前可选择的结构元有圆形、矩形、十字(实际接口没有限制),所有结…

Flutter-->Widget上屏之路

本文主要介绍Flutter中创建一个Widget到屏幕上渲染出Widget内容的路程. 拾用本文您将获得: Widget是什么Element是什么RenderObject是什么 附加Buff: Widget直接渲染成图片文本String的绘制图片ui.Image的绘制 这一切都要从runApp方法开始说起, 如果你还不知道runApp是什么…

【非常简单】 猿人学web第一届 第12题 入门级js

这一题非常简单,只需要找到数据接口,请求参数 m生成的逻辑即可 查看数据接口 https://match.yuanrenxue.cn/api/match/12 查看请求对应的堆栈中的 requests 栈 list 为对应的请求参数 list 是由 btoa 函数传入 ‘yuanrenxue’ 对应的页码生成的 bto…

安装torchvision==0.5.0

安装pytorch 1.4 但是在当前配置的镜像源中找不到 torchvision0.5.0 这个版本的包。 直接找资源下载 网址添加链接描述 直接运行该命令,成功。 然后重复运行上面的命令就可以了 # CUDA 9.2 conda install pytorch1.4.0 torchvision0.5.0 cudatoolkit9.2 -c pyto…

Spring Boot(快速上手)

Spring Boot 零、环境配置 1. 创建项目 2. 热部署 添加依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional> </dependency&…

Linux下进程间的通信--消息队列

System V IPC的概念 System V IPC&#xff08;System V Interprocess Communication&#xff09;是Unix和类Unix操作系统中一套传统的进程间通信机制&#xff0c;它包括三种主要的通信方式&#xff1a;消息队列、信号量和共享内存。这些机制提供了一种在不同进程之间交换数据和…

llamaindex+Internlm2 RAG实践 #书生谱语大模型实战营#

1.打卡任务&#xff1a; 本次的打卡任务是llamaindexInternlm2 RAG实践&#xff0c;我们需要基于 LlamaIndex 构建自己的 RAG 知识库&#xff0c;寻找一个问题 A 在使用 LlamaIndex 之前InternLM2-Chat-1.8B模型不会回答&#xff0c;借助 LlamaIndex 后 InternLM2-Chat-1.8B 模…

Axure设计之下拉单选框教程(中继器)

在Axure RP中&#xff0c;使用中继器&#xff08;Repeater&#xff09;可以实现许多复杂而动态的用户界面组件&#xff0c;比如下拉单选框。本文将详细介绍如何通过中继器创建一个美观且功能丰富的下拉单选框。 一、案例预览 预览地址&#xff1a;https://1zvcwx.axshare.com …

如何使用ssm实现基于JAVA的网上药品售卖系统

TOC ssm133基于JAVA的网上药品售卖系统jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规…

什么是堡垒机

堡垒机&#xff0c;即在一个特定的网络环境下&#xff0c;为了保障网络和数据不受来自外部和内部用户的入侵和破坏&#xff0c;而运用各种技术手段监控和记录运维人员对网络内的服务器、网络设备、安全设备、数据库等设备的操作行为&#xff0c;以便集中报警、及时处理及审计定…

鹏城杯 2022 取证writeup

简单取证 我们进去首先使用imageinfo pslist screenshot clipboard filescan 等等插件查看相关信息。 这里找到一个password姑且先留着 然后使用filescan找到了一个jpg文件 我们先dump下来 vol -f file.raw --profileWinXPSP2x86 dumpfiles -Q 0x000000000207e3d8 -D . 然…

Generating Query Recommendations via LLMs 【阅读笔记】

背景 主要去进行query的相关搜索补充&#xff1b; 例如 我们引入生成查询推荐&#xff08;GQR&#xff09;系统。 GQR以大语言模型为基础&#xff0c;利用大语言模型的提示能力&#xff0c;通过提示中提供的几个例子&#xff08;检索或手工&#xff09;来理解推荐任务。 方案…

主机监控与审计系统是什么?这个功能让您的效率翻倍!

天下之事&#xff0c;皆需明察秋毫&#xff0c;方能运筹帷幄&#xff0c;决胜千里。 于信息之海&#xff0c;主机者&#xff0c;犹若疆土之基石&#xff0c;承载着数据之重&#xff0c;运行着系统之脉。 然&#xff0c;世事如棋局局新&#xff0c;网络之域&#xff0c;暗流涌…

惠海H6432 dcdc升压恒压支持IC 3.7V 7.4V升压9V12V15V24V3A大电流 摄影灯光电源

1. 产品描述 H6432是一款电流模式B00ST异步升压恒压控制驱动芯片&#xff0c;适用于2.7-24V输入电压范 围的升压恒压电源应用领域&#xff0c;启动电压低至2. 5V。芯片根据负载的大小自动切换PWM&#xff0c;PFM和BURST模式以提高各个负载端的电源系统效率。芯片通过EN脚实现…

kali2022重置密码

在如下系统选择界面&#xff0c;按‘E’&#xff0c; 进入到编辑界面&#xff0c;将“ro quiet”修改为“rw init/bin/bash”。修改完成后ctrl X保存编辑并继续引导ctrlx进行引导&#xff0c;passwd修改密码&#xff0c;成功后重启&#xff0c;用root和新密码登录。

Adversarial Diffusion Distillation

sd turbohttps://static1.squarespace.com/static/6213c340453c3f502425776e/t/65663480a92fba51d0e1023f/1701197769659/adversarial_diffusion_distillation.pdf#page5.83https://github.com/Stability-AI/generative-models 问题引入 1-4 steps fast diffusion model samp…

软件测试最全面试题,了解一下

一、前言 近期有不少同学&#xff0c;朋友问我什么是软件测试&#xff0c;它是干什么的&#xff0c;我适不适合做、这行发展前景、工资怎么样等等等…在这里我把问题总结一下&#xff0c;整理一篇文章出来。 我也看过很多贴吧、论坛&#xff0c;在入行之前对这块都是迷茫的&a…