flask+scrapy

news2024/11/27 21:43:12

管道数据库

class SpiderBookPipeline:
    def __init__(self):
        host = 'localhost'
        user = 'root'
        password = '@hdp020820'
        db = '警察大学信息检索'
        self.conn = pymysql.connect(host=host, user=user, password=password, db=db)
        self.cursor = self.conn.cursor()

    def process_item(self, item, spider):
        if isinstance(item, SpiderBookItem):
            # Define your SQL query
            query = """
                        INSERT INTO my_table
                        (big_category, big_category_link, book_author, book_name, book_price, small_category, small_category_link)
                        VALUES
                        (%s, %s, %s, %s, %s, %s, %s)
                    """

            self.cursor.execute(query, (
                item['big_category'],
                item['big_category_link'],
                item['book_author'],
                item['book_name'],
                item['book_price'],
                item['small_category'],
                item['small_category_link']
            ))
        if isinstance(item, NewItems):
            sql = 'insert into news (id, title, link, date) VALUES (null, %s, %s, %s)'
            self.cursor.execute(sql, [item['title'], item['link'], item['date'], ])
        # Commit the transaction
        self.conn.commit()
        return item

要定义SpiderBookPipeline的数据库表结构,你可以创建两个表:my_table和news。

my_table表结构:您可以使用以下SQL语句创建my_table表:

列:

big_category(VARCHAR):书籍的大类别。

big_category_link(VARCHAR):与大类别相关联的链接。

book_author(VARCHAR):书籍的作者。

book_name(VARCHAR):书籍的名称。

book_price(VARCHAR):书籍的价格。

small_category(VARCHAR):书籍的小类别。

small_category_link(VARCHAR):与小类别相关联的链接。

CREATE TABLE my_table (
    id INT AUTO_INCREMENT PRIMARY KEY,
    big_category VARCHAR(255),
    big_category_link VARCHAR(255),
    book_author VARCHAR(255),
    book_name VARCHAR(255),
    book_price VARCHAR(255),
    small_category VARCHAR(255),
    small_category_link VARCHAR(255)
);

news表结构:您可以使用以下SQL语句创建news表:

列:

id(INT):每个新闻项的自增ID。

title(VARCHAR):新闻的标题。

link(VARCHAR):与新闻相关联的链接。

date(VARCHAR):新闻的日期。

CREATE TABLE news (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255),
    link VARCHAR(255),
    date VARCHAR(255)
);

根据您的需求,确保调整列的数据类型和长度。上述示例假设使用VARCHAR(255)进行简化,但您可以根据需要进行修改。

注意:在执行SQL语句之前,请确保您具有必要的权限,并在MySQL服务器中创建了数据库警察大学信息检索

redies数据库

服务器的redies数据库配置https://www.jianshu.com/p/990cdf530a58

Redis是什么

Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:

  • 基于内存运行,性能高效
  • 支持分布式,理论上可以无限扩展
  • key-value存储系统
  • 开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API

相比于其他数据库类型,Redis具备的特点是:

  • C/S通讯模型
  • 单进程单线程模型
  • 丰富的数据类型
  • 操作具有原子性
  • 持久化
  • 高并发读写
  • 支持lua脚本

哪些大厂在使用Redis?

  • github
  • twitter
  • 微博
  • Stack Overflow
  • 阿里巴巴
  • 百度
  • 美团
  • 搜狐

Redis的应用场景有哪些?

Redis 的应用场景包括:缓存系统(“热点”数据:高频读、低频写)、计数器、消息队列系统、排行榜、社交网络和实时系统。

Redis的数据类型及主要特性

Redis提供的数据类型主要分为5种自有类型和一种自定义类型,这5种自有类型包括:String类型、哈希类型、列表类型、集合类型和顺序集合类型。

String类型:

它是一个二进制安全的字符串,意味着它不仅能够存储字符串、还能存储图片、视频等多种类型, 最大长度支持512M。

对每种数据类型,Redis都提供了丰富的操作命令,如:

  • GET/MGET
  • SET/SETEX/MSET/MSETNX
  • INCR/DECR
  • GETSET
  • DEL

哈希类型:

该类型是由field和关联的value组成的map。其中,field和value都是字符串类型的。

Hash的操作命令如下:

  • HGET/HMGET/HGETALL
  • HSET/HMSET/HSETNX
  • HEXISTS/HLEN
  • HKEYS/HDEL
  • HVALS

列表类型:

该类型是一个插入顺序排序的字符串元素集合, 基于双链表实现。

List的操作命令如下:

  • LPUSH/LPUSHX/LPOP/RPUSH/RPUSHX/RPOP/LINSERT/LSET
  • LINDEX/LRANGE
  • LLEN/LTRIM

集合类型:

Set类型是一种无顺序集合, 它和List类型最大的区别是:集合中的元素没有顺序, 且元素是唯一的。

Set类型的底层是通过哈希表实现的,其操作命令为:

  • SADD/SPOP/SMOVE/SCARD
  • SINTER/SDIFF/SDIFFSTORE/SUNION

Set类型主要应用于:在某些场景,如社交场景中,通过交集、并集和差集运算,通过Set类型可以非常方便地查找共同好友、共同关注和共同偏好等社交关系。

顺序集合类型:

ZSet是一种有序集合类型,每个元素都会关联一个double类型的分数权值,通过这个权值来为集合中的成员进行从小到大的排序。与Set类型一样,其底层也是通过哈希表实现的。

ZSet命令:

  • ZADD/ZPOP/ZMOVE/ZCARD/ZCOUNT
  • ZINTER/ZDIFF/ZDIFFSTORE/ZUNION

Redis的数据结构

Redis的数据结构如下图所示:

关于上表中的部分释义:

  1. 压缩列表是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项,并且每个列表项要么就是小整数,要么就是长度比较短的字符串,Redis就会使用压缩列表来做列表键的底层实现
  2. 整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现

如下是定义一个Struct数据结构的例子:

简单动态字符串SDS (Simple Dynamic String)

基于C语言中传统字符串的缺陷,Redis自己构建了一种名为简单动态字符串的抽象类型,简称SDS,其结构如下:

SDS几乎贯穿了Redis的所有数据结构,应用十分广泛。

SDS的特点

和C字符串相比,SDS的特点如下:

1. 常数复杂度获取字符串长度

Redis中利用SDS字符串的len属性可以直接获取到所保存的字符串的长
度,直接将获取字符串长度所需的复杂度从C字符串的O(N)降低到了O(1)。

2. 减少修改字符串时导致的内存重新分配次数

通过C字符串的特性,我们知道对于一个包含了N个字符的C字符串来说,其底层实现总是N+1个字符长的数组(额外一个空字符结尾)

那么如果这个时候需要对字符串进行修改,程序就需要提前对这个C字符串数组进行一次内存重分配(可能是扩展或者释放)

而内存重分配就意味着是一个耗时的操作。

Redis巧妙的使用了SDS避免了C字符串的缺陷。在SDS中,buf数组的长度不一定就是字符串的字符数量加一,buf数组里面可以包含未使用的字节,而这些未使用的字节由free属性记录。

与此同时,SDS采用了空间预分配的策略,避免C字符串每一次修改时都需要进行内存重分配的耗时操作,将内存重分配从原来的每修改N次就分配N次——>降低到了修改N次最多分配N次。

如下是Redis对SDS的简单定义:

要设置Redis数据库,您需要按照以下步骤进行操作:

安装Redis:首先,您需要安装Redis数据库。您可以从Redis官方网站(https://redis.io/)下载适合您操作系统的安装程序或者通过包管理器进行安装。

启动Redis服务器:安装完成后,您需要启动Redis服务器。在命令行中,输入以下命令来启动Redis服务器:

redis-server

默认情况下,Redis将在本地主机上的默认端口6379上运行。

  1. 连接到Redis服务器:在您的应用程序中,您需要使用Redis客户端库来连接到Redis服务器。根据您选择的编程语言和Redis客户端库,您可以使用相应的方法来建立连接。下面是Python中使用redis-py库连接到Redis服务器的示例:
import redis

# 创建Redis连接
r = redis.Redis(host='localhost', port=6379)

# 测试连接
try:
    r.ping()
    print("成功连接到Redis服务器")
except redis.ConnectionError:
    print("无法连接到Redis服务器")

在上述示例中,host和port参数指定了Redis服务器的地址和端口。根据您的实际情况进行修改。

  1. 使用Redis数据库:连接到Redis服务器后,您可以使用Redis提供的各种命令和功能来操作数据。以下是一些常用的Redis命令示例:根据您的具体需求,您可以使用适当的Redis命令和功能来操作数据。
    • 存储和检索数据:
    • 设置过期时间:
    • 设置哈希数据:
    • 发布与订阅消息:
# 存储数据
r.set('key', 'value')

# 检索数据
value = r.get('key')
print(value)

# 存储带有过期时间的数据(10秒后过期)
r.setex('key', 10, 'value')

# 存储哈希数据
r.hset('hash_key', 'field', 'value')

# 获取哈希数据
value = r.hget('hash_key', 'field')
print(value)

# 发布消息
r.publish('channel', 'message')

# 订阅消息
pubsub = r.pubsub()
pubsub.subscribe('channel')
for message in pubsub.listen():
    print(message)

这些是Redis设置的基本步骤。根据您的应用程序需求,您还可以配置更高级的功能,例如设置密码、配置持久化、设置主从复制等。有关更多详细信息,请参阅Redis官方文档或适用于您所使用的Redis版本的文档。

环境安装教程

redies可视化管理工具

Redis Desktop Manager(Redis可视化工具)安装及使用教程_redisdesk_南风孤梦晓辰星的博客-CSDN博客

demo

fake_useragent是一个Python库,用于生成随机的用户代理(User-Agent)字符串。用户代理是一个HTTP请求头部的一部分,用于标识发起请求的客户端(通常是Web浏览器)的类型、版本和操作系统等信息。

fake_useragent库的主要功能是生成随机的用户代理字符串,以模拟不同类型的浏览器、设备和操作系统的请求。它可以用于以下情况:

  1. 网络爬虫:在编写网络爬虫时,使用不同的用户代理字符串可以使爬虫看起来更像真实的用户请求。通过随机选择用户代理,可以降低被目标网站识别和阻止的风险。
  2. 数据采集和测试:在进行数据采集、API测试或模拟用户行为时,使用随机的用户代理可以提高请求的多样性,模拟不同类型的客户端访问。
  3. 匿名性和隐私保护:有时候,您可能希望隐藏自己的真实身份或IP地址。通过使用随机的用户代理,您可以增加一定程度的匿名性,使请求更难被追踪。

fake_useragent库提供了一个简单的API,使您可以轻松地生成随机的用户代理字符串。您可以使用它来获取随机的浏览器、操作系统和设备类型等信息,或者从预定义的用户代理池中选择特定类型的用户代理。

请注意,尽管使用随机的用户代理可以提高匿名性和请求多样性,但某些网站可能仍然能够检测到并限制此类行为。在使用fake_useragent或任何用户代理相关技术时,请始终遵守目标网站的规则和法律法规,并确保遵循适当的爬取道德准则。

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

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

相关文章

【Python】Python系列教程-- Python3 元组(十三)

文章目录 前言访问元组修改元组删除元组元组运算符元组索引,截取元组内置函数关于元组是不可变的 前言 往期回顾: Python系列教程–Python3介绍(一)Python系列教程–Python3 环境搭建(二)Python系列教程–…

项目中的Echarts图表统计

数据可视化 一、Echarts二、前端(VueEcharts)HomeView.vue(完整代码) 三、后端(SpringBootMyBatis)BorrowController.javaIBorrowService.javaBorrowService.javadatetimeToDateStr()函数countList()函数 B…

同样是产品经理 段位差别大

同样是产品经理,段位差别大 趣讲大白话:做人的差距大 【趣讲信息科技189期】 **************************** 市场越内卷 对产品的要求越来越高 不管叫不叫产品经理这个头衔 产品开发的重要性不会降低 《人人都是产品经理》总结的段位 姑且一看&#xff…

java线程多线程并发

文章目录 对java线程的认识wait()和sleep()区别?wait,notify为什么要放在同步代码块中? 多线程**什么时候使用多线程**:**多线程的优缺点**:**线程安全问题**&#xff1a…

MATLAB应用

目录 网站 智能图像色彩缩减和量化 网站 https://yarpiz.com/ 智能图像色彩缩减和量化 使用智能聚类方法:(a)k均值算法,(b)模糊c均值聚类(FCM)和(c)自组织神…

Mysql—存储过程

简介 存储过程就是类似于MySQL触发器,经过事先编写好相应语句,通过编译后存储在数据库上。触发器不需要手动调用即可实现相应SQL功能。MySQL存储过程,需要自己去调用得到相应的结果。 语法 创建存储过程 CREATE DEFINER CURRENT_USER PR…

git---->团队开发神器,一篇文章直接掌握

git---->团队开发神器,一篇文章直接掌握 一 学习git的原因概念版本的概念1 版本控制软件的基础功能2 集中式版本控制软件3 分布式版本控制 二 git的安装三 GitHub Desktop的使用四 团队操作五 中央服务器--github从github上下载文件到本地仓库传输文件 六 国内中…

chatgpt赋能python:Python如何实现自增

Python如何实现自增 在Python编程中,自增是一种非常常用的操作,它可以让我们在循环、计数等场景中更加方便地进行操作。实际上,在Python中,实现自增非常简单,本文将介绍Python中常用的自增操作,并分享自增…

时间复杂度 空间复杂度

概览 时间复杂度与空间复杂度的作用是在衡量一个算法的优劣性,以及在二者之间进行权衡,寻找二者的平衡点。 时间复杂度是指执行算法所需时间的增长率,而空间复杂度则是指执行算法所需存储空间的增长率。 高时间复杂度的算法可能需要在短时间…

LayUI前框框架普及版

LayUI 一、课程目标 1. 【了解】LayUI框架 2. 【理解】LayUI基础使用 3. 【掌握】LayUI页面元素 4. 【掌握】LayUI内置模块二、LayUI基本使用 2.1 概念 layui(谐音:类UI) 是一款采用自身模块规范编写的前端 UI 框架&#xff0…

Nginx+Tomcat 负载均衡、动静分离

目录 一、Nginx代理服务器概念 1.正向代理 2.反向代理 二、动静分离 三、负载均衡 四、Nginx七层代理实验 1.部署Nginx服务 2. 部署Tomcat服务 2.1在192.168.88.50 虚拟机上部署双实例 2.2在192.168.88.60 上部署Tomcat服务器3 3.动静分离配置 3.1Tomcat1 server 配…

RecyclerView的回收缓存均由内部类Recycler完成

1. RecyclerView的三级缓存 通常在RecyclerView中存在着四级缓存,从低到高分别为: 可直接重复使用的临时缓存(mAttachedScrap/mChangedScrap) mAttachedScrap中缓存的是屏幕中可见范围的ViewHoldermChangedScrap只能在预布局状态…

Material—— 常用材质节点

目录 Coordinates Absolute World Position Actor Position Object Position Utility SphereMask Coordinates 表示坐标类的节点; Absolute World Position 别名为WorldPosition,此节点输出当前像素在世界空间内的位置;常用于查找相机到…

作为过来人:有什么话想对当年高考前的自己说

目录 引言千人千面-有什么话想对当年高考前的自己说怀念高中,数学太难多考一分,人生就会不一样一定要勇敢,不止高考别把高考不当回事6的我没话说想到啥就去做别选**大学/专业强烈想出名的拖鞋哥英语全选C,理综要细心会的全做对当时…

Spring - 注解开发

文章目录 Spring的注解开发一、Bean 基本注解开发1.1 Component Bean的配置1.2 其他注解配置Bean1.3 Component 衍生注解 二、Bean依赖注入注解开发2.1 Value2.2 Autowired2.3 Qualifier2.4 Resource 三、非自定义注解开发3.1 无参非自定义注解开发3.2 有参非自定义注解开发 四…

Domino 14新内核

大家好,才是真的好。 还记得去年,我们不断跟进而放出的Notes/Domino产品路线图吗?是的,HCL正在按照产品路线图稳步推进,而很多人提出的idea,也逐步加入到产品中,等会我们也会聊到。 我最喜欢这…

MySQL安装-Linux版

MySQL-Linux版安装 1、准备一台Linux服务器 云服务器或者虚拟机都可以; Linux的版本为 CentOS7; 2、 下载Linux版MySQL安装包 下载地址 3、上传MySQL安装包 使用FinalShell软件上传即可! 4、 创建目录,并解压 mkdir mysqltar -xvf my…

【Web服务器】Nginx网站服务

文章目录 一、Nginx 概述1.什么是 Nginx2.Nginx 的特点3.Nginx 应用场景 二、Nginx 服务基础1.编译安装 Nginx 服务1.1 布置环境1.2 安装依赖包1.3 创建运行用户、组1.4 编译安装 2.Nginx 的运行控制2.1 检查配置文件2.2 启动、停止 Nginx2.3 日志分割以及升级 Nginx 服务2.4 添…

调用腾讯API实现图片滤镜

目录 1. 作者介绍2. 图像滤波介绍3. 实验过程及结果(附完整代码)3.1 准备工作3.2 实验代码3.3 实验结果 1. 作者介绍 班梦威,男,西安工程大学电子信息学院,2022级研究生 研究方向:模式识别与人工智能 电子…

企业如何有效制定企业信息化发展规划?(附信息化模板)

如何有效制定企业信息化发展规划?企业信息化发展规划是一个宏大而又复杂的命题,这篇来掰开揉碎讲一下企业应该如何有效制定信息化发展规划。 这里不给大家灌鸡汤,也不给大家画大饼,就说些实在的。 如果你想找经验方法&#xff0…