当前位置: 首页 > news >正文

网络爬虫 多任务采集

一、JSON文件存储

JSON,全称为 JavaScript 0bject Notation,也就是JavaSript 对象标记,它通过对象和数组的组合来表示数据,构造简洁但是结构化程度非常高,是一种轻量级的数据交换格式。本节中,我们就来了解如何利用 Python 保存数据到SON 文件中。

(一)对象和数组

在avaScript 语言中,一切都是对象。因此,任何支持的类型都可以通过SON 来表示,例如如字串、数字、对象、数组等,但是对象和数组是比较特殊且常用的两种类型,下面简要介绍一下它们。

对象:

它在JavaScript 中是使用花括号 包裹起来的内容,数据结构为{key1: value1,key2: value2,.}的键值对结构。在面向对象的语言中,key 为对象的属性,value 为对应的值,键名可以使用整数和字符串来表示。值的类型可以是任意类型。

数组:

数组在JavaScript 中是方括号包裹起来的内容,数据结构为["Java""JavaScript",“vb”...] 的索引结构在Javascript 中,数组是一种比较特殊的数据类型,它也可以像对象那样使用键值对,但还是索引用得多。同样,值的类型可以是任意类型。

所以,一个JSON 对象可以写为如下形式:

[{"name": "张三","age": "24","birthday": "1999-07-12"},{"name": "李四","age": "26","birthday": "1999-08-12"}
]

由中括号包围的就相当于列表类型,列表中的每个元素可以是任意类型,这个示例中它是字典类型,由大括号包围。
JSON 可以由以上两种形式自由组合而成,可以无限次嵌套,结构清晰,是数据交换的极佳方式。

(二)数据写入规范

可以看到,中文字符都变成了 Unicode 字符,这并不是我们想要的结果。

为了输出中文,还需要指定参数 ensure_ascii 为 False,另外还要规定文件输出的编码:

import jsondate = [{'name':'李绍幸','age':'24','birthday':'1999-07-12'
}]
# w写 r读 a追加
with open('D:\桌面\date.json','w',encoding='utf-8') as file:# dumps通常是指json.dumps方法,它来源于内置的json模块。# 该方法用于将Python对象序列化为JSON格式的字符串。# 序列化是指将数据结构或对象状态转换成可存储或传输的格式的过程。#indent指定缩进级别为2,# ensure_ascii: 默认为 True,# 意味着所有非ASCII字符都会被转义成 \uXXXX 序列。如果设置为 False,这些字符将原样输出。file.write(json.dumps(date,indent=2,ensure_ascii=False))

二、CSV文件存储

        CSV,全称为(Comma-Separated Values,中文可以叫作逗号分隔值或字符分隔值,其文件以纯文本形式存储表格数据。该文件是一个字符序列,可以由任意教目的记录组成,记录间以某种换行符分隔。每条记录由字段组成,字段间的分隔符是其他字符或字符串,最常见的是逗号或制表符。不过所有记录都有完全相同的字段序列,相当于一个结构化表的纯文本形式,它比 Excel 文件更加简洁,XLS 文本是电子表格,它包含了文本、数值、公式和格式等内容,而 CSV 中不包合这些内容,就是特定字符分的纯文本,结构简单清晰。所以,有时候用 CSV 来保存数据是比较方便的。本节中,我们来进解 Pvthon 读取和写入CSV 文件的过程。

(一)写入

简单例子:

import csv# 以列表形式写入
with open('data.csv', 'w') as csvfile:writer = csv.writer(csvfile)writer.writerow(['id', 'name', 'age'])writer.writerow(['10001','Mike',20])writer.writerow(['10002','Bob',22])writer.writerow(['10003','Jordan',21])import pandas
dic = {'1':'张三','2':'李四','3':'王五'}
df = pd.DataFrame(dic)
df.to_csv('demo.csv',index=None)

    首先,打开 data.csv 文件,然后指定打开的模式为 w (即写入),获得文件句柄,随后调用 csv 库的 writer 方法初始化写入对象,传入该句柄,然后调用 writerow 方法传入每行的数据即可完成写入。

如果想修改列与列之间的分隔符,可以传入 delimiter 参数,其代码如下:

import csv# 以列表形式写入
with open('data.csv', 'w') as csvfile:writer = csv.writer(csvfile,delimiter='')writer.writerow(['id', 'name', 'age'])writer.writerow(['10001','Mike',20])writer.writerow(['10002','Bob',22])writer.writerow(['10003','Jordan',21])

(二)多行写入

调用 writerows 方法同时写入多行,此时参数就需要为二维列表,例如:

import csv# 以列表形式写入
with open('data.csv', 'w') as csvfile:writer = csv.writer(csvfile,delimiter='')writer.writerow(['id', 'name', 'age'])writer.writerows([['10001','Mike',20],['10002','Bob',22],['10003','Jordan',21]])

(三)字典写入

用字典来表示。在 csv 库中也提供了字典的写入方式,示例如下:

import csv
with open('data.csv','w') as csvfile:fieldnames =['id','name','age']# 定义一个列表 fieldnames,其中包含我们希望出现在 CSV 文件第一行的字段名,# 它们作为列标题。writer = csv.DictWriter(csvfile,fieldnames=fieldnames)# 调用 writer.writeheader() 方法写入列标题。# 这会基于 fieldnames 列表中的字段名在 CSV 文件中创建第一行writer.writeheader ()writer.writerow({'id': '10001','name':'Mike','age': 203})writer.writerow({'id': '10002','name':'Bob','age' : 22})writer.writerow({'id':'10003','name':'jordan','age': 21})

这段代码执行完成后,将会在当前目录下创建(或覆盖)一个名为 data.csv 的文件,内容如下:

id,name,age
10001,Mike,20
10002,Bob,22
10003,Jordan,21

(四)excel写入

from openpyxl import Workbook
import random'''
数据写入格式
列表嵌套列表 数据按列表的行写入第一列表示第一行,第二列表示第二行[[],[],[]]
'''
#空白文件
wb = Workbook()
# 空白页 内容插入工作簿中索引为 0 的位置
ws = wb.create_sheet('第一页',index=0)
ws.append(['编号','姓名','年龄'])
for i in range(10):id = str(i)name = str('li'+ str(i))age = random.randint(18,30)ws.append([id,name,age])
wb.save('li.xlsx')

(五)爬虫采集入库

import httpx
import csv
res = httpx.get('https://careers.tencent.com/tencentcareer/api/post/Query?timestamp=1702977319532&countryId=&cityId=&bgIds=&productId=&categoryId=&parentCategoryId=&attrId=&keyword=python&pageIndex=2&pageSize=10&language=zh-cn&area=cn')# 将数据变成字典格式
items = res.json()data = []
# 或者data = list()
item = items.get('Data')['Posts']#列表形式
for i in item:title = i.get('RecruitPostName')time = i.get('LastUpdateTime')data.append([title,time])
print(data)with open('date.csv','w',encoding='gbk')as csvfile:writer = csv.writer(csvfile,delimiter=',')writer.writerow(['title','time'])writer.writerows(data)print('写入成功')

三 关系型数据库

关系型数据库是基于关系模型的数据库,而关系模型是通过二维表来保存的,所以它的存储方式就是行列组成的表,每一列是一个字段每一行是一条记录。表可以看作某个实体的集合,而实体之间存在联系,这就需要表与表之间的关联关系来体现,如主键外键的关联关系。多个表组成一个数据库,也就是关系型数据库。

关系型数据库有多种,如 SQLite、MySQL、Oracle、SQL Server、DB2等.

(一)安装数据库使其正常运行,并安装pymysql第三方库

(二)连接数据库

这里,首先尝试连接一下数据库。假设当前的 MVSQL运行在本地,用户名为 root,密码为 123456,运行端口为 3306,这里利用PyMySQL 先连接 MySQL,然后创建一个新的数据库,名字叫作 spiders,代码如下:

import pymysql
db = pymysql.connect(host='localhost',user='root',password='123456',port=3306)
cursor = db.cursor()
cursor.execute('select version()')
# 使用fetchone获取SQL语句执行结果的第一行数据
data = cursor.fetchone()
print('database version:',data)
cursor.execute('create database if not exists spiders default character set utf8')
cursor.execute('use spiders')
sql = "CREATE TABLE If NOT EXISTS students(id VARCHAR(255)NOT NULL,NAME VARCHAR(255)NOT NULL,age INT NOT NULL,PRIMARY KEY(id))"
cursor.execute(sql)
db.close()

(三)创建数据表

import pymysql
db = pymysql.connect(host='localhost',user='root',password='123456',port=3306)
cursor = db.cursor()
cursor.execute('create database if not exists spiders default character set utf8')
cursor.execute('use spiders')
sql = "CREATE TABLE If NOT EXISTS students(id VARCHAR(255)NOT NULL,NAME VARCHAR(255)NOT NULL,age INT NOT NULL,PRIMARY KEY(id))"
cursor.execute(sql)
db.close()

(四)插入数据

插入、更新和删除操作都是对数据库进行更改的操作,而更改操作都必须为一个事务,所以这些操作的标准写法就是:

具体的参照:mysql第14天之TCL(事务控制语言)-CSDN博客

import pymysql
id = '1'
user = 'lili'
age = 20
# 连接数据库
db = pymysql.connect(host='localhost',user='root',password='123456',port=3306)
cursor = db.cursor()
sql = 'INSERT INTO students VALUES(%s,%s,%s)'try:cursor.execute(sql,(id,user,age))# 提交db.commit()
except:# 回滚db.rollback()
db.close()

(五)字典数据插入

import pymysql
data = {'id':'20220315','name':'菲菲','age':20}
db = pymysql.connect(host='localhost', user='root', password='123456', port=3306, db='spiders')
cursor = db.cursor()
keys  = ','.join(data.keys())
values = ','.join(['%s'])*len(data)
sql = 'INSERT INTO students({keys}) VALUES({values})'.format(keys=keys,values=values)
try:if cursor.execute(sql,tuple(data.values())):print("Successful!")db.commit()
except:print("Failed")db.rollback()
db.close()

四 Elasticsearch搜索引擎存储

Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文博索引擎,基RESTful web接口,Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

重要特性:

分布式的实时文件存储,每个字段都被索引并可被搜索

实时分析的分布式搜索引擎

可以扩展到上百台服务器,处理PB级别结构化或非结构化数据

基本概念:

索引(indlices)-----------database数据库

类型(type)----------------Table表

文档(Document)---------Row行

字段(Field)-----------------Columns列

要注意的是:Elastiearch 本身就是分布式的,因此便你只有一个节点,Elasticsearch 认也会对你的教据进行分片和副本操作,当你向集群添加新数据时,数据也会在新加入的节点中进行平衡。

(一)安装服务端

地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearch

相关文章:

网络爬虫 多任务采集

一、JSON文件存储 JSON,全称为 JavaScript 0bject Notation,也就是JavaSript 对象标记,它通过对象和数组的组合来表示数据,构造简洁但是结构化程度非常高,是一种轻量级的数据交换格式。本节中,我们就来了解如何利用 P…...

真实并发编程问题-1.钉钉面试题

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring源码、JUC源码、Kafka原理、分布式技术原理、数据库技术🔥如果感觉博主的文章还不错的…...

基于vue+element-plus+echarts制作动态绘图页面(柱状图,饼图和折线图)

前言 我们知道echarts是一个非常强大的绘图库,基于这个库,我们可以绘制出精美的图表。对于一张图来说,其实比较重要的就是配置项,填入不同的配置内容就可以呈现出不同的效果。 当然配置项中除了样式之外,最重要的就是…...

2312llvm,02前端

前端 编译器前端,在生成目标相关代码前,把源码变换为编译器的中间表示.因为语言有独特语法和语义,所以一般,前端只处理一个语言或一组类似语言. 比如Clang,处理C,C,objective-C源码. 介绍Clang Clang项目是C,C,Objective-C官方的LLVM前端.Clang的官方网站在此. 实际编译器(…...

【MATLAB源码-第101期】基于matlab的蝙蝠优化算BA)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境: MATLAB 2022a 1、算法描述 蝙蝠算法(BA)是一种基于群体智能的优化算法,灵感来源于蝙蝠捕食时的回声定位行为。这种算法模拟蝙蝠使用回声定位来探测猎物、避开障碍物的能力。在蝙蝠算法中,每只虚拟蝙蝠代表…...

【数据结构】二叉树的模拟实现

前言:前面我们学习了堆的模拟实现,今天我们来进一步学习二叉树,当然了内容肯定是越来越难的,各位我们一起努力! 💖 博主CSDN主页:卫卫卫的个人主页 💞 👉 专栏分类:数据结构 👈 &…...

open3d bug:pcd转txt前后位姿发生改变

1、open3d bug:pcd转txt前后位姿发生改变 open3d会对原有结果进行一个微小位姿变换 import open3d as o3d import numpy as np# 读取PCD点云文件 pcd o3d.io.read_point_cloud(/newdisk/darren_pty/zoom_centered_s2.pcd)# 获取点云坐标 points pcd.points# 指定…...

持续集成交付CICD:Jenkins使用GitLab共享库实现基于Ansible的CD流水线部署前后端应用

目录 一、实验 1.部署Ansible自动化运维工具 2.K8S 节点安装nginx 3.Jenkins使用GitLab共享库实现基于Ansible的CD流水线部署前后端应用 二、问题 1.ansible安装报错 2.ansible远程ping失败 3. Jenkins流水线通过ansible命令直接ping多台机器的网络状态报错 一、实验 …...

OpenAI 疑似正在进行 GPT-4.5 灰度测试!

‍ 大家好,我是二狗。 今天,有网友爆料OpenAI疑似正在进行GPT-4.5灰度测试! 当网友询问ChatGPT API调用查询模型的确切名称是什么时? ChatGPT的回答竟然是 gpt-4.5-turbo。 也有网友测试之后发现仍然是GPT-4模型。 这是有网友指…...

DC-6靶场

DC-6靶场下载: https://www.five86.com/downloads/DC-6.zip 下载后解压会有一个DC-3.ova文件,直接在vm虚拟机点击左上角打开-->文件-->选中这个.ova文件就能创建靶场,kali和靶机都调整至NAT模式,即可开始渗透 首先进行主…...

单片机应用实例:LED显示电脑电子钟

本例介绍一种用LED制作的电脑电子钟(电脑万年历)。其制作完成装潢后的照片如下图: 上图中,年、月、日及时间选用的是1.2寸共阳数码管,星期选用的是2.3寸数码管,温度选用的是0.5寸数码管,也可根据…...

会议剪影 | 思腾合力受邀出席首届CCF数字医学学术年会

首届CCF数字医学学术年会(CCF Digital Medicine Symposium,DMS)于2023年12月15日-17日在苏州CCF业务总部召开。这次会议的成功召开,标志着数字医学领域进入了一个新的时代,计算机技术和人工智能在医学领域的应用和发展…...

node.js mongoose中间件(middleware)

目录 简介 定义模型 注册中间件 创建doc实例,并进行增删改查 方法名和注册的中间件名相匹配 执行结果 分析 错误处理中间件 手动抛出错误 注意点 简介 在mongoose中,中间件是一种允许在执行数据库操作前(pre)或后&…...

[Toolschain cpp ros cmakelist python vscode] 记录写每次项目重复的设置和配置 不断更新

写在前面 用以前的设置,快速配置项目,以防长久不用忘记,部分资料在资源文件里还没有整理 outline cmakelist 复用vscode 找到头文件vscode debug现有代码直接关联远端gitros杂记repo 杂记glog杂记 cmakelist 复用 包含了根据系统路径找库…...

【每日OJ—有效的括号(栈)】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 1、有效的括号题目: 1.1方法讲解: 1.2代码实现: 总结 前言 世上有两种耀眼的光芒,一种是正在升起的太阳&#…...

.gitignore和git lfs学习

The ninth day——12.18 1. .gitignore 忽略规则优先级 从命令行中读取可用的忽略规则当前目录定义的规则父级目录定义的规则,依次递推$GIT_DIR/info/exclude 文件中定义的规则core.excludesfile中定义的全局规则 忽略规则匹配语法 空格不匹配任意文件&#xff…...

2023-12-18 C语言实现一个最简陋的B-Tree

点击 <C 语言编程核心突破> 快速C语言入门 C语言实现一个最简陋的B-Tree 前言要解决问题:想到的思路:其它的补充: 一、C语言B-Tree基本架构: 二、可视化总结 前言 要解决问题: 实现一个最简陋的B-Tree, 研究B-Tree的性质. 对于B树, 我是心向往之, 因为他是数据库的基…...

vite与webpack?

vite对比react-areate-app 1、构建速度 2、打包速度 3、打包文件体积...

距离矩阵路径优化Python Dijkstra(迪杰斯特拉)算法和冲突驱动子句学习

Dijkstra算法 Dijkstra 算法是一种流行的寻路算法&#xff0c;通常用于基于图的问题&#xff0c;例如在地图上查找两个城市之间的最短路径、确定送货卡车可能采取的最短路径&#xff0c;甚至创建游戏地图。其背后的直觉基于以下原则&#xff1a;从起始顶点访问所有相邻顶点&am…...

Selenium安装WebDriver:ChromeDriver与谷歌浏览器版本快速匹配_最新版120

最近在使用通过selenium操作Chrome浏览器时&#xff0c;安装中遇到了Chrome版本与浏览器驱动不匹配的的问题&#xff0c;在此记录安装下过程&#xff0c;如何快速找到与谷歌浏览器相匹配的ChromeDriver驱动版本。 1. 确定Chrome版本 我们首先确定自己的Chrome版本 Chrome设置…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

SpringAI实战:ChatModel智能对话全解

一、引言&#xff1a;Spring AI 与 Chat Model 的核心价值 &#x1f680; 在 Java 生态中集成大模型能力&#xff0c;Spring AI 提供了高效的解决方案 &#x1f916;。其中 Chat Model 作为核心交互组件&#xff0c;通过标准化接口简化了与大语言模型&#xff08;LLM&#xff0…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...

Python训练营-Day26-函数专题1:函数定义与参数

题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一个名为 calculate_circle_area 的函数&#xff0c;该函数接收圆的半径 radius 作为参数&#xff0c;并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求&#xff1a;函数接收一个位置参数 radi…...

【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统

Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...

人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型

在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重&#xff0c;适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解&#xff0c;并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...