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
主要特性
- 异步处理:Scrapy 使用 Twisted 异步网络库,可以高效处理多个并发请求。
- 内置支持选择器:Scrapy 内置支持 XPath 和 CSS 选择器来提取数据。
- 数据管道:提供数据处理管道,可以对抓取的数据进行清洗、验证和存储。
- 中间件:支持下载中间件和爬虫中间件,可以在请求和响应处理过程中插入自定义逻辑。
- 扩展性:可以通过编写扩展和中间件来扩展 Scrapy 的功能。
- 支持多种输出格式:可以将抓取的数据导出为 JSON、CSV、XML 等格式。
- 自动限速:内置支持自动限速,可以防止对目标网站造成过大压力。
主要组件
- Spider(爬虫):定义如何抓取某个网站或一组网站,包括如何执行抓取(即跟进链接)以及如何从页面中提取结构化数据。
- Item(项目):定义抓取的数据结构,类似于 Python 中的字典,但提供了更强的类型检查和验证。
- Item Pipeline(项目管道):负责处理被抓取的项目,通常包括数据清洗、验证和存储。
- Downloader Middleware(下载中间件):处理请求和响应的钩子框架,可以用于修改、丢弃或重试请求。
- 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
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
Python库 - Scrapy
Scrapy 是一个用于爬取网站数据、提取结构性数据的开源和协作框架。它最初是为网页抓取设计的,但也可以用于获取 API 提供的数据或作为通用的网络爬虫。 文章目录 主要特性主要组件使用流程1. 安装 Scrapy2. 创建 Scrapy 项目3. 定义 Item(数据ÿ…...
![](https://i-blog.csdnimg.cn/direct/df0897273b6348189c8237e7ebc64c8c.png)
函数(实参以及形参)
实际参数(实参) 实际参数就是在调用函数时传递给函数的具体值。这些值可以是常量、变量、表达式或更复杂的数据结构。实参的值在函数被调用时传递给对应的形参,然后函数内部就可以使用这些值来执行相应的操作。 int main() {int a 0;int b …...
![](https://www.ngui.cc/images/no-images.jpg)
ArcGIS Pro SDK (八)地理数据库 8 拓扑
ArcGIS Pro SDK (八)地理数据库 8 拓扑 文章目录 ArcGIS Pro SDK (八)地理数据库 8 拓扑1 开放拓扑和进程定义2 获取拓扑规则3 验证拓扑4 获取拓扑错误5 标记和不标记为错误6 探索拓扑图7 找到最近的元素 环境:Visual …...
![](https://www.ngui.cc/images/no-images.jpg)
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…...
![](https://www.ngui.cc/images/no-images.jpg)
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…...
![](https://i-blog.csdnimg.cn/direct/75de551435da4224ac49d186b5e85201.png)
自建搜索引擎-基于美丽云
Meilisearch 是一个搜索引擎,主程序完全开源,除了使用官方提供的美丽云服务(收费)进行对接之外,还可以通过自建搜索引擎来实现完全独立的搜索服务。 由于成本问题,本博客采用自建的方式,本文就…...
![](https://i-blog.csdnimg.cn/direct/168ecd036bed46959673a6e5324343dc.jpeg)
2024辽宁省大学数学建模竞赛试题思路
A题 (1) 建立模型分析低空顺风风切变对起飞和降落的影响 模型假设 飞机被视为质点,忽略其尺寸和形状对风阻的影响。风切变仅考虑顺风方向的变化,忽略其他方向的风切变。飞机的飞行速度、高度和姿态(如迎角、俯仰角)是变化的&am…...
![](https://img-blog.csdnimg.cn/img_convert/f3749a6c0c9bd5fa12a8de4054056877.gif)
循环结构(一)——for语句【互三互三】
文章目录 🍁 引言 🍁 一、语句格式 🍁 二、语句执行过程 🍁 三、语句格式举例 🍁四、例题 👉【例1】 🚀示例代码: 👉【例2】 【方法1】 🚀示例代码: 【方法2】…...
![](https://i-blog.csdnimg.cn/direct/1acdf298a1a94485bdd6c098a5517234.png)
【深度学习基础】MacOS PyCharm连接远程服务器
目录 一、需求描述二、建立与服务器的远程连接1. 新版Pycharm的界面有什么不同?2. 创建远程连接3. 建立本地项目与远程服务器项目之间的路径映射4.设置保存自动上传文件 三、设置解释器总结 写在前面,本人用的是Macbook Pro, M3 MAX处理器&am…...
![](https://i-blog.csdnimg.cn/direct/8aad0542f4484e8aa086fa9f96d03bd9.png#pic_center)
微调Qwen2大语言模型加入领域知识
目录 试用Qwen2做推理安装LLaMA-Factory使用自有数据集微调Qwen2验证微调效果 试用Qwen2做推理 参考:https://qwen.readthedocs.io/en/latest/getting_started/quickstart.html from transformers import AutoModelForCausalLM, AutoTokenizer device "cuda…...
![](https://i-blog.csdnimg.cn/direct/dfbf291b56c44d7d80ec01f473b859f8.png)
【Linux】内核文件系统系统调用流程摸索
内核层可以看到当前调用文件处理的进程ID 这个数据结构是非常大的: 我们打印的pid,tgid就是从这里来的,然后只需要找到pid_t的数据类型就好了。 下图这是运行的日志信息: 从上述日志,其实我也把write的系统调用加了入口的打印信…...
![](https://i-blog.csdnimg.cn/direct/a25da91d61ab403caa5ed1e97b7c2ede.png)
【HZHY-AI300G智能盒试用连载体验】文档资料
感谢电子发烧友和北京合众恒跃科技有限公司提供的的产品试用机会。 HZHY-AI300G工业级国产化智盒,采用RK3588工业级芯片组适应-40℃-85℃工业级宽温网关。 以前测试过其他厂家的RK3568产品,对瑞芯微的工具也比较了解。 在合众恒跃的网站上可以看到基本…...
![](https://i-blog.csdnimg.cn/direct/640f47a1c38c4840a74703ce0a6af9ee.png)
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.…...
![](https://www.ngui.cc/images/no-images.jpg)
Postman 中的 API 安全性测试:最佳实践与技巧
在当今快速发展的数字化世界中,API(应用程序编程接口)已成为软件系统之间通信的桥梁。然而,随着API使用的增加,安全风险也随之上升。本文将详细介绍如何在 Postman 中进行 API 的安全性测试,帮助开发者和测…...
![](https://img-blog.csdnimg.cn/img_convert/e9bdbf35caf7b2795544a1cac7355f1e.png)
PTC可复位保险丝 vs 传统型保险丝:全面对比分析
PTC可复位保险丝,又称为自恢复保险丝、自恢复熔断器或PPTC保险丝,是一种电子保护器件。它利用材料的正温度系数效应,即电阻值随温度升高而显著增加的特性,来实现电路保护。 当电路正常工作时,PTC保险丝呈现低阻态&…...
![](https://i-blog.csdnimg.cn/direct/5e0e658d9a3c458885b5e3e096b00cff.png)
深入了解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.如何禁用手…...
![](https://i-blog.csdnimg.cn/direct/e1d8e82fbc4e4047996965c40e041061.png)
Lottery 分布式抽奖(个人向记录总结)
1.搭建(DDDRPC)架构 DDD——微服务架构(微服务是对系统拆分的方式) (Domain-Driven Design 领域驱动设计) DDD与MVC同属微服务架构 是由Eric Evans最先提出,目的是对软件所涉及到的领域进行建…...
![](https://i-blog.csdnimg.cn/direct/9bb6d0537c454f40a3705d5107849da3.png)
我的AI音乐梦:ChatGPT帮我做专辑
🌈个人主页:前端青山 🔥系列专栏:AI篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来ChatGPT帮我做音乐专辑 嘿,朋友们! 想象一下,如果有个超级聪明的机器人能帮你写…...
![](https://i-blog.csdnimg.cn/direct/331425570e8b4a2ba9cbb00712fd74d8.png)
新手-前端生态
文章目录 新手的前端生态一、概念的理解1、脚手架2、组件 二、基础知识1、HTML2、css3、JavaScript 三、主流框架vue3框架 四、 工具(特定框架)1、uinapp 五、组件库()1、uView如何在哪项目中导入uView 六、应用(各种应…...
![](https://www.ngui.cc/images/no-images.jpg)
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?[]…...
![](https://i-blog.csdnimg.cn/direct/3554328eaf4f42d2a8ac9f5a1cdf6e42.gif)
探索数据库编程:基础与进阶之存储函数
引言❤️❤️ 数据库存储过程是一组为了执行特定功能的SQL语句集合,它被存储在数据库中,可以通过指定存储过程的名称并给出相应的参数来调用。使用存储过程可以提高数据库操作的效率,减少网络传输量,并且可以封装复杂的逻辑。 编…...
![](https://img-blog.csdnimg.cn/img_convert/dcee35a23713ba852cb3f4a7b32d0d3b.png)
Count数据转换为TPM数据方法整理-常规方法、DGEobj.utils和IOBR包
在正式分析之前,对于数据的处理是至关重要的,这种重要性是体现在很多方面,其中有一点是要求分析者采用正确的数据类型。 对于芯片数据,原始数据进行log2处理之后可以进行很多常见的分析,比如差异分析、热图、箱线图、…...
![](https://i-blog.csdnimg.cn/direct/07c1e0edb930462783cb24e422ad8e8f.png)
简易限流实现
需求描述 写一个1秒两个的限流工具类,2r/s 使用semaphore 代码实现-类似令牌桶算法 public class LimitHelper {private int maxLimit;private Semaphore semaphore;private int timeoutSeconds;public LimitHelper(int maxLimit, int timeoutSeconds) {this.max…...
![](https://i-blog.csdnimg.cn/direct/28a04637c1a4453197e938d2c53db761.gif)
用Qwt进行图表和数据可视化开发
目录 Qwt介绍 示例应用场景 典型QWT开发流程 举一些Qwt的例子,多绘制几种类型的图像 1. 绘制折线图 (Line Plot) 2. 绘制散点图 (Scatter Plot) 3. 绘制柱状图 (Bar Plot) 4. 绘制直方图 (Histogram) Qwt介绍 QWT开发主要涉及使用QWT库进行图表和数据可视化…...
![](https://www.ngui.cc/images/no-images.jpg)
sqlalchemy使用with_entities返回指定数据列
sqlalchemy使用with_entities返回指定数据列 在 SQLAlchemy 中,with_entities 方法用于指定查询语句返回的实体(Entity)或列(Column)。它允许你限制查询的返回结果,只包含你感兴趣的特定字段或实体 使用方法 假设有一个名为 User 的 SQLAlchemy 模型类,包含以下字段:…...
![](https://img-blog.csdnimg.cn/12d2d78442084100914613d5d9d8c313.png)
express
文章目录 🟢 Express⭐️ 1.初始Express✨安装✨使用Express 搭建一台服务器⭐️2.Express-基本路由✨1.使用字符串模式的路由路径示例:✨2.使用正则表达式的路由路径示例:✨3.中间件浅试(demo)⭐️3.Express-中间件✨1.应用级中间件✨2.路由级中间件✨3.错误处理中间件✨4…...
![](https://i-blog.csdnimg.cn/direct/4f2e1c3d44db4d5c9bccc64e839ab9ac.png)
HTML网页大设计-家乡普宁德安里
代码地址: https://pan.quark.cn/s/57e48c3b3292...
![](https://www.ngui.cc/images/no-images.jpg)
深度学习:从数据采集到模型测试的全面指南
摘要 随着人工智能和大数据技术的迅猛发展,深度学习已成为解决复杂问题的有力工具。然而,从项目启动到模型部署,包含了数据处理和模型研发的多个环节,每个环节的细致和严谨性直接决定了最终模型的性能和可靠性。本论文详细探讨了…...
![](https://i-blog.csdnimg.cn/direct/98cecff0dc454baf8cf3528911a3c0d0.png)
Excel第29享:基于sum嵌套sumifs的多条件求和
1、需求描述 如下图所示,现要统计12.17-12.23这一周各个人员的“上班工时(a1)”。 下图为系统直接导出的工时数据明细样例。 2、解决思路 首先,确定逻辑:“对多个条件(日期、人员)进行“工时”…...
![](https://i-blog.csdnimg.cn/direct/90733dc43e3a4346b94f3853eff4ad94.png)
Elasticsearch:Node.js ECS 日志记录 - Morgan
这是之前系列文章: Elasticsearch:Node.js ECS 日志记录 - Pino Elasticsearch:Node.js ECS 日志记录 - Winston 中的第三篇文章。在今天的文章中,我将描述如何使用 Morgan 包针对 Node.js 应用进行日子记录。此 Morgan Node.j…...
![](http://upload-images.jianshu.io/upload_images/6193835-94416bb57ce053e8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/792/format/webp)
徐州网站制作建设/客源软件哪个最好
Android Studio 关联 Android 源码比较方便,一般下载后可自动关联,但是 Android Studio 默认使用的 JDK 是内嵌的,是不带源码的。所以在查看 JDK 源码时,看到的是反编译 class 而成的代码,没有注释。那么应该如何关联 …...
![](/images/no-images.jpg)
网站建设申报书/中文域名查询官网
292. Nim 游戏 - 力扣(LeetCode) 剩下4块的时候,如果轮到你,那么你必输。 先简单推一下,如果第n块的时候轮到你: n 5 : 必胜(拿1块) n 6 : 必胜(拿2块) n…...
![](https://img-blog.csdnimg.cn/img_convert/248fd692a0e45a10628965841582e289.png)
wordpress中添加登陆页面/推广文章
用javascript 写个函数返回一个页面里共使用了多少var reg /]*>/gi;var html document.body.innerHTML;var map {};while(reg.exec(html)){ var key RegExp.$1.toLowerCase(); if(map[key] null){ map[key] 1; }else { map[key]; }}console.log(map);分别是哪些&#…...
外贸企业网站/嘉兴seo优化
微服务技术栈选型,看了这个别的可以不用看了 jurassic_1 2016-11-01 16:37:57 浏览3461 评论0分布式 架构 Cloud spring 基础设施 微服务 负载均衡 netty 摘要: 本文由PPmoney架构师敖小剑分享:微服务的核心技术,目前可选的开源微…...
![](/images/no-images.jpg)
家纺公司网站模版/网站建设价格
vue组件中重新渲染的3种方式 改变key 这个是最推荐的。因为vue是通过虚拟Dom算法来判断元素的变化,是否变化的核心是通过判断新旧元素的key值是否变化。如果你的key是变化的,则重新渲染该元素,如果key没变,则不会重新渲染。 所以…...
网站建设招代理/上海sem
three.js 是一款WebGL框架,WebGL可以让我们在canvas上实现3D效果。实现3D效果在国内来说还算是比较新的东西,可供查阅的资料也不多。这篇文章仅是一个入门篇,介绍如何绘制一个3D正方体。介绍完毕,首先奉上实现的效果图:…...