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

Python 爬虫实战:Scrapy 框架详解与应用

🛠️ Scrapy 框架基本使用

Scrapy 是一个强大的 Python 爬虫框架,提供了用于提取和处理网页数据的功能。以下是 Scrapy 的基本使用步骤:

  1. 安装 Scrapy
pip install scrapy
  1. 创建 Scrapy 项目
scrapy startproject myproject

这将生成一个基础的 Scrapy 项目结构,包括 settings.pyspidersitems.py 等文件夹和文件。


🏗️ Scrapy 框架结构识别

Scrapy 项目通常包含以下几个重要组件:

  • spiders: 存放爬虫代码的文件夹,每个爬虫文件定义了如何抓取特定网站的数据。
  • items.py: 用于定义要抓取的数据结构。
  • pipelines.py: 处理抓取到的数据,比如清洗、存储等。
  • settings.py: Scrapy 的配置文件,用于设置框架的各种参数。
  • middlewares.py: 用于定义 Scrapy 中间件,处理请求和响应。

📁 多种形式项目创建

除了使用 scrapy startproject 命令创建项目外,你还可以使用命令创建爬虫:

scrapy genspider myspider example.com

这将生成一个名为 myspider 的爬虫文件,负责抓取 example.com 网站的数据。


🔄 Scrapy Fetch 模式

Scrapy 提供了多种数据抓取方式,包括:

  • Fetch Requests: 直接抓取请求,使用 Scrapy shell 进行快速测试。
scrapy shell "http://example.com"
  • Scrapy Crawl: 使用已定义的爬虫抓取数据。
scrapy crawl myspider

📜 Scrapy 常用指令集合

以下是一些常用的 Scrapy 命令:

  • 创建项目: scrapy startproject projectname
  • 生成爬虫: scrapy genspider spidername domain.com
  • 启动爬虫: scrapy crawl spidername
  • 运行爬虫并保存数据: scrapy crawl spidername -o output.json
  • 调试: scrapy shell "http://example.com"

🛠️ Scrapy 配置文件解读

settings.py 是 Scrapy 的核心配置文件,包含了框架的各种设置,比如:

  • USER_AGENT: 设置爬虫的用户代理。
USER_AGENT = 'myproject (+http://www.myproject.com)'
  • DOWNLOAD_DELAY: 设置下载延迟。
DOWNLOAD_DELAY = 2
  • ITEM_PIPELINES: 启用或禁用管道。
ITEM_PIPELINES = {'myproject.pipelines.MyPipeline': 1,
}

🧩 Scrapy 管道学习

管道(Pipelines)是 Scrapy 处理抓取数据的重要组成部分。以下是一个简单的管道示例,它将数据保存到 JSON 文件中:

pipelines.py:

import jsonclass JsonWriterPipeline:def __init__(self):self.file = open('items.json', 'w')self.exporter = json.JSONEncoder()def process_item(self, item, spider):line = self.exporter.encode(item) + "\n"self.file.write(line)return itemdef close_spider(self, spider):self.file.close()

settings.py 中启用管道:

ITEM_PIPELINES = {'myproject.pipelines.JsonWriterPipeline': 1,
}

📝 Scrapy 表单处理

Scrapy 支持处理表单提交,例如登录操作。以下是一个示例,展示如何使用 Scrapy 提交表单:

import scrapyclass FormSpider(scrapy.Spider):name = 'form_spider'start_urls = ['http://example.com/login']def parse(self, response):yield scrapy.FormRequest.from_response(response,formdata={'username': 'user', 'password': 'pass'},callback=self.after_login)def after_login(self, response):# 检查登录是否成功if "Welcome" in response.text:self.logger.info("Login successful!")else:self.logger.info("Login failed.")

🧩 Scrapy 功能学习

🧩 Selector 数据处理

Scrapy 使用 Selector 来提取数据。常用选择器包括:

  • XPath 选择器:
response.xpath('//title/text()').get()
  • CSS 选择器:
response.css('title::text').get()
  • 正则表达式选择器:
import re
response.text.find(r'\bExample\b')

🗃️ Scrapy 对接 MySQL

将数据存储到 MySQL 数据库的示例:

pipelines.py:

import mysql.connectorclass MySQLPipeline:def open_spider(self, spider):self.conn = mysql.connector.connect(host='localhost',user='root',password='password',database='scrapy_db')self.cursor = self.conn.cursor()def process_item(self, item, spider):self.cursor.execute("INSERT INTO my_table (field1, field2) VALUES (%s, %s)",(item['field1'], item['field2']))self.conn.commit()return itemdef close_spider(self, spider):self.cursor.close()self.conn.close()

settings.py 中启用管道:

ITEM_PIPELINES = {'myproject.pipelines.MySQLPipeline': 1,
}

🗄️ Scrapy 对接 MongoDB

将数据存储到 MongoDB 的示例:

pipelines.py:

import pymongoclass MongoDBPipeline:def open_spider(self, spider):self.client = pymongo.MongoClient('localhost', 27017)self.db = self.client['scrapy_db']self.collection = self.db['my_collection']def process_item(self, item, spider):self.collection.insert_one(dict(item))return itemdef close_spider(self, spider):self.client.close()

settings.py 中启用管道:

ITEM_PIPELINES = {'myproject.pipelines.MongoDBPipeline': 1,
}

📂 Scrapy 文件存储

将数据存储为文件(如 CSV、JSON)的示例:

import csvclass CsvWriterPipeline:def __init__(self):self.file = open('items.csv', 'w', newline='', encoding='utf-8')self.writer = csv.writer(self.file)self.writer.writerow(['field1', 'field2'])def process_item(self, item, spider):self.writer.writerow([item['field1'], item['field2']])return itemdef close_spider(self, spider):self.file.close()

settings.py 中启用管道:

ITEM_PIPELINES = {'myproject.pipelines.CsvWriterPipeline': 1,
}

以上内容展示了如何使用 Scrapy 框架进行数据抓取、处理和存储,希望对你进行 Python 爬虫开发有所帮助。🎯

相关文章:

Python 爬虫实战:Scrapy 框架详解与应用

🛠️ Scrapy 框架基本使用 Scrapy 是一个强大的 Python 爬虫框架,提供了用于提取和处理网页数据的功能。以下是 Scrapy 的基本使用步骤: 安装 Scrapy pip install scrapy创建 Scrapy 项目 scrapy startproject myproject这将生成一个基础…...

60 函数参数——关键参数

关键参数主要指调用函数时的参数传递方式,与函数定义无关。 通过关键参数可以按参数名字传递值,明确指定哪个值传递给哪个参数,实参顺序可以和形参顺序不一致,但不影响参数值的传递结果,避免了用户需要牢记参数位置和…...

wps 最新 2019 专业版 下载安装教程,解锁全部功能,免费领取

文章目录 前言软件介绍软件下载安装步骤激活步骤小福利(安卓APP)软件介绍软件下载安装步骤 前言 本篇文章主要针对WPS2019专业版的安装下载进行详细讲解,软件已激活,可放心使用;并且可以进行账号登录,进行…...

前端(三):Ajax

一、Ajax Asynchronous JavaScript And XML,简称Ajax,是异步的JavaScript和XML。 作用:数据交换,通过Ajax可以给服务器发送请求,并获取服务器响应的数据。异步交互:可以在不重新加载整个页面的情况下&…...

启动 /使用/关闭 Redis 服务器

1. Linux 启动 Linux 系统启动 Redis 有两种方法,分别是前台启动,后台启动,两者各有差异; (1)前台启动 首先,需要进入 bin 路径(安装路径不同输入的命令也不同); 个人的命令(一般…...

Linux系统中的高级SELinux安全策略定制技术

随着信息技术的发展,计算机系统的安全性变得越来越重要。在开源世界中,Linux作为一种广泛应用的操作系统,其安全性一直备受关注。其中,SELinux(Security-Enhanced Linux)作为Linux系统中的一个安全模块&…...

使用 Ansible Blocks 进行错误处理

注:机翻,未校。 How to Use Ansible Blocks Make your Playbooks more readable and maintainable using Blocks feature in Ansible. 使用 Ansible 中的块功能使 Playbook 更具可读性和可维护性。 Jul 15, 2024 — LHB Community How to Use Ansible…...

java中的静态变量和实例变量的区别

java中的静态变量和实例变量的区别 在Java中,静态变量(也称为类变量)和实例变量是两种不同类型的变量,它们在多个方面存在显著的区别。以下是它们之间的一些主要区别: 存储位置 静态变量:存储在方法区&am…...

【Effecutive C++】条款02 尽量以const, enum, inline替换 #define

Prefer consts, enums, and inline to #define. 这个条款或许改为“宁可以编译器替换预处理器”比较好,因为或许#define不被视为语言的一部分。那正是它的问题所在。当你做出这样的事情: #define ASPECT_RATIO 1.653记号名称ASPECT_RATIO也许从未被编译…...

leetcode-226. 翻转二叉树

题目描述 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]示例 2: 输入:root [2,1,3] 输出:[2,3,1]…...

用的到linux-tomcat端口占用排查-Day5

前言: 最近使用tomcat搭建了一套测试环境的应用,整个搭建过程也很简单,就是将部署包上传至服务器☞解压☞启动tomcat服务器,当然服务器也是成功启动了,但是发现前端应用报404,具体如下图所示。 一、现象及思…...

mqtt协议详解(0)初步认识mqtt

文章目录 1. 介绍2. 主要特性3. 架构1. 介绍 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种构建在TCP/IP协议之上的轻量级、基于发布-订阅模式的消息传输协议,适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境,例如IOT。 MQTT 协议于 1…...

Java语言程序设计基础篇_编程练习题*16.7 (设置时钟的时间)

*16.7 (设置时钟的时间) 编写一个程序,显示一个时钟,并通过在三个文本域中输入小时、分钟和秒 钟来设置时钟的时间,如图16-38b 所示。使用程序清单14-21的ClockPane改变时钟大小使其居于面板中央 习题思路 实例化一个ClockPane(在程序清单1…...

YOLOv8新版本支持实时检测Transformer(RT-DETR)、SAM分割一切

原文:YOLOv8新版本支持实时检测Transformer(RT-DETR)、SAM分割一切 - 知乎 (zhihu.com) 一、SAM 分割任何模型 (Segment Anything Model - SAM) 是一种突破性的图像分割模型,可实现具有实时性能的快速分割。 项目地址 https://github.com/facebookresearch/segment-…...

【传输层协议】UDP和TCP协议

文章目录 UDP协议UDP特点UDP的缓冲区基于UDP的应用层协议 TCP协议6位标志位:确认应答机制超时重传机制连接管理机制(握手和挥手)服务端状态转换过程客户端状态转换过程TIME_WAIT状态CLOSE_WAIT状态 为什么是三次握手和四次挥手滑动窗口如果发…...

Java Excel复杂表头,表头合并单元格

Java Excel复杂表头&#xff0c;表头合并单元格 效果预览 一、maven依赖 <!--操作excel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.1</version><scope>test</…...

Java整合腾讯云发送短信实战Demo

简介 在现代应用开发中&#xff0c;短信服务是非常重要的功能之一。它可以用于用户验证、通知等各种场景。本文将介绍如何使用Java整合腾讯云短信服务&#xff0c;并提供一个完整的实战示例代码。 环境准备 在开始之前&#xff0c;确保你已经完成以下准备工作&#xff1a; 注…...

电路中电阻,电容和电感作用总结

电阻作用 1&#xff0c;上拉电阻 电阻的连接一般是一端接上拉的电源&#xff08;一般与芯片信号的电压值相匹配&#xff09;&#xff0c;另一端连接芯片引脚所对应的信号大概如下图 功能&#xff1a;一、预置某些引脚的功能&#xff0c;例如复位信号拉高&#xff08;失能&…...

OrangePi AIpro学习1 —— 烧写和ssh系统

目录 一、下载烧写工具和系统 二、烧写和启动 2.1 烧写和启动 2.2 烧写失败后的问题解决 三、串口连接到主机 3.1 串口连接到主机 四、网络连接到主机 4.1 修改香橙派IP地址 4.2 win11配置以太网静态ip 4.4 主机和香橙派直连 4.5 主机和香橙派连接到同一个路由器 五…...

Gather 全球化进程迅速 多重利好推动未来发展

在过去的几周里&#xff0c;Gather的全球化发展十分迅速&#xff0c;并取得了一系列重要成绩&#xff0c;这些成绩进一步巩固了Gather在区块链和去中心化通信领域的地位&#xff0c;并为未来的发展注入了强劲的动力。 $GAT代币成功进驻多家顶级交易所 7月19日&#xff0c;Gath…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...