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

Python库 - Scrapy

Scrapy 是一个用于爬取网站数据、提取结构性数据的开源和协作框架。它最初是为网页抓取设计的,但也可以用于获取 API 提供的数据或作为通用的网络爬虫。


文章目录

      • 主要特性
      • 主要组件
      • 使用流程
      • 1. 安装 Scrapy
      • 2. 创建 Scrapy 项目
      • 3. 定义 Item(数据)
      • 4. 创建和编写 Spiders 文件
      • 5. 修改 settings.py 文件
      • 6. 运行 Scrapy 爬虫
      • 运行项目生成文件说明
        • 1. `scrapy.cfg`
        • 2. `myproject/`
          • a. `__init__.py`
          • b. `items.py`
          • c. `middlewares.py`
          • d. `pipelines.py`
          • e. `settings.py`
        • 3. `myproject/spiders/`
          • a. `__init__.py`
        • b. `myspider.py`
      • 数据存储
      • 1. 文件存储
        • a. JSON 文件
        • b. CSV 文件
      • 2. 数据库存储
        • a. SQLite
        • b. MySQL
        • c. MongoDB
      • 3. 其他存储方式
        • a. Elasticsearch
        • b. Amazon S3


主要特性

  1. 异步处理:Scrapy 使用 Twisted 异步网络库,可以高效处理多个并发请求。
  2. 内置支持选择器:Scrapy 内置支持 XPath 和 CSS 选择器来提取数据。
  3. 数据管道:提供数据处理管道,可以对抓取的数据进行清洗、验证和存储。
  4. 中间件:支持下载中间件和爬虫中间件,可以在请求和响应处理过程中插入自定义逻辑。
  5. 扩展性:可以通过编写扩展和中间件来扩展 Scrapy 的功能。
  6. 支持多种输出格式:可以将抓取的数据导出为 JSON、CSV、XML 等格式。
  7. 自动限速:内置支持自动限速,可以防止对目标网站造成过大压力。

主要组件

  1. Spider(爬虫):定义如何抓取某个网站或一组网站,包括如何执行抓取(即跟进链接)以及如何从页面中提取结构化数据。
  2. Item(项目):定义抓取的数据结构,类似于 Python 中的字典,但提供了更强的类型检查和验证。
  3. Item Pipeline(项目管道):负责处理被抓取的项目,通常包括数据清洗、验证和存储。
  4. Downloader Middleware(下载中间件):处理请求和响应的钩子框架,可以用于修改、丢弃或重试请求。
  5. Spider Middleware(爬虫中间件):处理爬虫的输入(响应)和输出(请求和项目)的钩子框架。

使用流程

Scrapy 是一个强大的 Python 爬虫框架,用于从网站中提取数据。以下是从创建项目到运行爬虫的详细步骤:

1. 安装 Scrapy

首先,需要安装 Scrapy。可以使用 pip 进行安装:

pip install scrapy

2. 创建 Scrapy 项目

使用以下命令创建一个新的 Scrapy 项目:

scrapy startproject myproject

这将在当前目录下创建一个名为 myproject 的文件夹,包含 Scrapy 项目的结构。

3. 定义 Item(数据)

Item 是用来定义要从网页中提取的数据结构。在 myproject/items.py 文件中定义 Item:

import scrapyclass MyItem(scrapy.Item):# 定义字段name = scrapy.Field()description = scrapy.Field()

4. 创建和编写 Spiders 文件

Spider 是 Scrapy 中用于定义如何抓取网站的类。在 myproject/spiders 目录下创建一个新的 Spider 文件,例如 myspider.py

import scrapy
from myproject.items import MyItemclass MySpider(scrapy.Spider):name = "myspider"start_urls = ['http://example.com',]def parse(self, response):for item in response.css('div.item'):my_item = MyItem()my_item['name'] = item.css('h1::text').get()my_item['description'] = item.css('p::text').get()yield my_item

5. 修改 settings.py 文件

myproject/settings.py 文件中,可以配置 Scrapy 的各种设置,例如 USER_AGENT、ROBOTSTXT_OBEY 等:

BOT_NAME = 'myproject'SPIDER_MODULES = ['myproject.spiders']
NEWSPIDER_MODULE = 'myproject.spiders'USER_AGENT = 'Mozilla/5.0 (compatible; MyProject/1.0; +http://example.com)'ROBOTSTXT_OBEY = True

6. 运行 Scrapy 爬虫

使用以下命令运行的 Spider:

scrapy crawl myspider

这将启动 myspider 并开始抓取数据。


运行项目生成文件说明

1. scrapy.cfg

这是项目的配置文件,通常位于项目的根目录下。它主要用于定义项目的部署配置。

[settings]
default = myproject.settings[deploy]
#url = http://localhost:6800/
project = myproject
2. myproject/

这是项目的主目录,包含了项目的所有代码和配置文件。

a. __init__.py

这是一个空文件,用于标识 myproject 目录是一个 Python 包。

b. items.py

这个文件用于定义爬虫抓取的数据结构,即 Item。Item 类似于数据库中的表结构,用于存储爬取到的数据字段。

import scrapyclass MyItem(scrapy.Item):name = scrapy.Field()description = scrapy.Field()
c. middlewares.py

这个文件用于定义自定义的中间件。中间件可以用于处理请求和响应,例如添加自定义的 HTTP 头、处理重定向等。

class MyCustomMiddleware(object):def process_request(self, request, spider):request.headers['User-Agent'] = 'MyCustomUserAgent'return None
d. pipelines.py

这个文件用于定义数据处理管道。管道用于在数据被爬取后进行处理,例如清洗数据、验证数据、存储数据等。

class MyPipeline(object):def process_item(self, item, spider):# 处理 item 的逻辑return item
e. settings.py

这个文件包含了项目的所有配置。可以在这里设置爬虫的行为,例如设置 User-Agent、启用中间件、配置管道等。

BOT_NAME = 'myproject'SPIDER_MODULES = ['myproject.spiders']
NEWSPIDER_MODULE = 'myproject.spiders'USER_AGENT = {}
ROBOTSTXT_OBEY = TrueITEM_PIPELINES = {'myproject.pipelines.MyPipeline': 300,
}
3. myproject/spiders/

这个目录用于存放爬虫的代码。可以在这里创建多个爬虫文件,每个文件定义一个爬虫。

a. __init__.py

这是一个空文件,用于标识 spiders 目录是一个 Python 包。

b. myspider.py

这是一个示例爬虫文件,用于定义如何抓取网站的数据。

import scrapyclass MySpider(scrapy.Spider):name = "myspider"start_urls = ['http://example.com',]def parse(self, response):for item in response.css('div.item'):yield {'name': item.css('h1::text').get(),'description': item.css('p::text').get(),}

数据存储

1. 文件存储

a. JSON 文件

JSON 是一种轻量级的数据交换格式,易于阅读和编写。

import jsondef process_item(item):with open('data.json', 'a') as f:line = json.dumps(dict(item)) + "\n"f.write(line)return item
b. CSV 文件

CSV 文件是一种简单的表格数据存储格式。

import csvdef process_item(item):with open('data.csv', 'a', newline='') as f:writer = csv.writer(f)writer.writerow(item.values())return item

2. 数据库存储

a. SQLite

SQLite 是一种嵌入式数据库,适合小型项目。

import sqlite3def process_item(item):conn = sqlite3.connect('data.db')c = conn.cursor()c.execute("INSERT INTO items VALUES (?, ?)", (item['name'], item['description']))conn.commit()conn.close()return item
b. MySQL

MySQL 是一种流行的关系型数据库,适合大型项目。

import mysql.connectordef process_item(item):conn = mysql.connector.connect(user='user', password='password', host='host', database='database')c = conn.cursor()c.execute("INSERT INTO items (name, description) VALUES (%s, %s)", (item['name'], item['description']))conn.commit()conn.close()return item
c. MongoDB

MongoDB 是一种 NoSQL 数据库,适合存储非结构化数据。

from pymongo import MongoClientdef process_item(item):client = MongoClient('localhost', 27017)db = client['mydatabase']collection = db['items']collection.insert_one(dict(item))return item

3. 其他存储方式

a. Elasticsearch

Elasticsearch 是一个基于 Lucene 的搜索引擎,适合存储和搜索大量数据。

from elasticsearch import Elasticsearchdef process_item(item):es = Elasticsearch()es.index(index='items', doc_type='item', body=dict(item))return item
b. Amazon S3

Amazon S3 是一种云存储服务,适合存储大量文件。

import boto3def process_item(item):s3 = boto3.client('s3')s3.put_object(Bucket='mybucket', Key='data.json', Body=json.dumps(dict(item)))return item

相关文章:

Python库 - Scrapy

Scrapy 是一个用于爬取网站数据、提取结构性数据的开源和协作框架。它最初是为网页抓取设计的,但也可以用于获取 API 提供的数据或作为通用的网络爬虫。 文章目录 主要特性主要组件使用流程1. 安装 Scrapy2. 创建 Scrapy 项目3. 定义 Item(数据&#xff…...

函数(实参以及形参)

实际参数(实参) 实际参数就是在调用函数时传递给函数的具体值。这些值可以是常量、变量、表达式或更复杂的数据结构。实参的值在函数被调用时传递给对应的形参,然后函数内部就可以使用这些值来执行相应的操作。 int main() {int a 0;int b …...

ArcGIS Pro SDK (八)地理数据库 8 拓扑

ArcGIS Pro SDK (八)地理数据库 8 拓扑 文章目录 ArcGIS Pro SDK (八)地理数据库 8 拓扑1 开放拓扑和进程定义2 获取拓扑规则3 验证拓扑4 获取拓扑错误5 标记和不标记为错误6 探索拓扑图7 找到最近的元素 环境:Visual …...

uniapp如何发送websocket请求

方法1: onLoad() {uni.connectSocket({url: ws://127.0.0.1:8000/ws/stat/realTimeStat/,success: (res) > {console.log(connect success, res);}});uni.onSocketOpen(function (res) {console.log(WebSocket连接已打开!);uni.sendSocketMessage({d…...

RabbitMQ的工作模式

RabbitMQ的工作模式 Hello World 模式 #mermaid-svg-sbc2QNYZFRQYbEib {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-sbc2QNYZFRQYbEib .error-icon{fill:#552222;}#mermaid-svg-sbc2QNYZFRQYbEib .error-text{fi…...

自建搜索引擎-基于美丽云

Meilisearch 是一个搜索引擎,主程序完全开源,除了使用官方提供的美丽云服务(收费)进行对接之外,还可以通过自建搜索引擎来实现完全独立的搜索服务。 由于成本问题,本博客采用自建的方式,本文就…...

2024辽宁省大学数学建模竞赛试题思路

A题 (1) 建立模型分析低空顺风风切变对起飞和降落的影响 模型假设 飞机被视为质点,忽略其尺寸和形状对风阻的影响。风切变仅考虑顺风方向的变化,忽略其他方向的风切变。飞机的飞行速度、高度和姿态(如迎角、俯仰角)是变化的&am…...

循环结构(一)——for语句【互三互三】

文章目录 🍁 引言 🍁 一、语句格式 🍁 二、语句执行过程 🍁 三、语句格式举例 🍁四、例题 👉【例1】 🚀示例代码: 👉【例2】 【方法1】 🚀示例代码: 【方法2】…...

【深度学习基础】MacOS PyCharm连接远程服务器

目录 一、需求描述二、建立与服务器的远程连接1. 新版Pycharm的界面有什么不同?2. 创建远程连接3. 建立本地项目与远程服务器项目之间的路径映射4.设置保存自动上传文件 三、设置解释器总结 写在前面,本人用的是Macbook Pro, M3 MAX处理器&am…...

微调Qwen2大语言模型加入领域知识

目录 试用Qwen2做推理安装LLaMA-Factory使用自有数据集微调Qwen2验证微调效果 试用Qwen2做推理 参考:https://qwen.readthedocs.io/en/latest/getting_started/quickstart.html from transformers import AutoModelForCausalLM, AutoTokenizer device "cuda…...

【Linux】内核文件系统系统调用流程摸索

内核层可以看到当前调用文件处理的进程ID 这个数据结构是非常大的: 我们打印的pid,tgid就是从这里来的,然后只需要找到pid_t的数据类型就好了。 下图这是运行的日志信息: 从上述日志,其实我也把write的系统调用加了入口的打印信…...

【HZHY-AI300G智能盒试用连载体验】文档资料

感谢电子发烧友和北京合众恒跃科技有限公司提供的的产品试用机会。 HZHY-AI300G工业级国产化智盒,采用RK3588工业级芯片组适应-40℃-85℃工业级宽温网关。 以前测试过其他厂家的RK3568产品,对瑞芯微的工具也比较了解。 在合众恒跃的网站上可以看到基本…...

Linux--深入理与解linux文件系统与日志文件分析

目录 一、文件与存储系统的 inode 与 block 1.1 硬盘存储 1.2 文件存取--block 1.3 文件存取--inode 1.4 文件名与 inode 号 ​编辑 1.5 查看 inode 号码方法 1.6 Linux 系统文件的三个主要的时间属性 1.7 硬盘分区结构 1.8 访问文件的简单了流程 1.9 inode 占用 1.…...

Postman 中的 API 安全性测试:最佳实践与技巧

在当今快速发展的数字化世界中,API(应用程序编程接口)已成为软件系统之间通信的桥梁。然而,随着API使用的增加,安全风险也随之上升。本文将详细介绍如何在 Postman 中进行 API 的安全性测试,帮助开发者和测…...

PTC可复位保险丝 vs 传统型保险丝:全面对比分析

PTC可复位保险丝,又称为自恢复保险丝、自恢复熔断器或PPTC保险丝,是一种电子保护器件。它利用材料的正温度系数效应,即电阻值随温度升高而显著增加的特性,来实现电路保护。 当电路正常工作时,PTC保险丝呈现低阻态&…...

深入了解Rokid UXR2.0 SDK内置的Unity AR Glass开发组件

本文将了解到Rokid AR开发组件 一、RKCameraRig组件1.脚本属性说明2.如何使用 二、PointableUI组件1.脚本属性说明2.如何使用 三、PointableUICurve组件1.脚本属性说明2.如何使用 四、RKInput组件1.脚本属性说明2.如何使用 五、RKHand组件1.脚本属性说明2.如何使用3.如何禁用手…...

Lottery 分布式抽奖(个人向记录总结)

1.搭建(DDDRPC)架构 DDD——微服务架构(微服务是对系统拆分的方式) (Domain-Driven Design 领域驱动设计) DDD与MVC同属微服务架构 是由Eric Evans最先提出,目的是对软件所涉及到的领域进行建…...

我的AI音乐梦:ChatGPT帮我做专辑

​🌈个人主页:前端青山 🔥系列专栏:AI篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来ChatGPT帮我做音乐专辑 嘿,朋友们! 想象一下,如果有个超级聪明的机器人能帮你写…...

新手-前端生态

文章目录 新手的前端生态一、概念的理解1、脚手架2、组件 二、基础知识1、HTML2、css3、JavaScript 三、主流框架vue3框架 四、 工具(特定框架)1、uinapp 五、组件库()1、uView如何在哪项目中导入uView 六、应用(各种应…...

C#中的类

声明类 public class MyClass{ ​} 注意 类里面 的属性可以输入prop之后再按Tab键 然后再按Tab进行修改属性的名称等等 Random rnd new Random(); int arnd.Next(3); 范围是0-3的整数 但是不包含3 Random rnd new Random(); int arnd.Next(2,3); 只包含2一个数 int?[]…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

从物理机到云原生:全面解析计算虚拟化技术的演进与应用

前言&#xff1a;我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM&#xff08;Java Virtual Machine&#xff09;让"一次编写&#xff0c;到处运行"成为可能。这个软件层面的虚拟化让我着迷&#xff0c;但直到后来接触VMware和Doc…...

Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解

文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一&#xff1a;HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二&#xff1a;Floyd 快慢指针法&#xff08;…...

echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式

pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图&#xff0c;如果边框加在dom上面&#xff0c;pdf-lib导出svg的时候并不会导出边框&#xff0c;所以只能在echarts图上面加边框 grid的边框是在图里…...

SQL注入篇-sqlmap的配置和使用

在之前的皮卡丘靶场第五期SQL注入的内容中我们谈到了sqlmap&#xff0c;但是由于很多朋友看不了解命令行格式&#xff0c;所以是纯手动获取数据库信息的 接下来我们就用sqlmap来进行皮卡丘靶场的sql注入学习&#xff0c;链接&#xff1a;https://wwhc.lanzoue.com/ifJY32ybh6vc…...

【版本控制】GitHub Desktop 入门教程与开源协作全流程解析

目录 0 引言1 GitHub Desktop 入门教程1.1 安装与基础配置1.2 核心功能使用指南仓库管理日常开发流程分支管理 2 GitHub 开源协作流程详解2.1 Fork & Pull Request 模型2.2 完整协作流程步骤步骤 1: Fork&#xff08;创建个人副本&#xff09;步骤 2: Clone&#xff08;克隆…...