Python 爬虫实战:Scrapy 框架详解与应用
🛠️ Scrapy 框架基本使用
Scrapy 是一个强大的 Python 爬虫框架,提供了用于提取和处理网页数据的功能。以下是 Scrapy 的基本使用步骤:
- 安装 Scrapy
pip install scrapy
- 创建 Scrapy 项目
scrapy startproject myproject
这将生成一个基础的 Scrapy 项目结构,包括 settings.py
、spiders
、items.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复杂表头,表头合并单元格 效果预览 一、maven依赖 <!--操作excel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.1</version><scope>test</…...

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

电路中电阻,电容和电感作用总结
电阻作用 1,上拉电阻 电阻的连接一般是一端接上拉的电源(一般与芯片信号的电压值相匹配),另一端连接芯片引脚所对应的信号大概如下图 功能:一、预置某些引脚的功能,例如复位信号拉高(失能&…...

OrangePi AIpro学习1 —— 烧写和ssh系统
目录 一、下载烧写工具和系统 二、烧写和启动 2.1 烧写和启动 2.2 烧写失败后的问题解决 三、串口连接到主机 3.1 串口连接到主机 四、网络连接到主机 4.1 修改香橙派IP地址 4.2 win11配置以太网静态ip 4.4 主机和香橙派直连 4.5 主机和香橙派连接到同一个路由器 五…...
Gather 全球化进程迅速 多重利好推动未来发展
在过去的几周里,Gather的全球化发展十分迅速,并取得了一系列重要成绩,这些成绩进一步巩固了Gather在区块链和去中心化通信领域的地位,并为未来的发展注入了强劲的动力。 $GAT代币成功进驻多家顶级交易所 7月19日,Gath…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...

鸿蒙Navigation路由导航-基本使用介绍
1. Navigation介绍 Navigation组件是路由导航的根视图容器,一般作为Page页面的根容器使用,其内部默认包含了标题栏、内容区和工具栏,其中内容区默认首页显示导航内容(Navigation的子组件)或非首页显示(Nav…...
零基础在实践中学习网络安全-皮卡丘靶场(第十一期-目录遍历模块)
经过前面几期的内容我们学习了很多网络安全的知识,而这期内容就涉及到了前面的第六期-RCE模块,第七期-File inclusion模块,第八期-Unsafe Filedownload模块。 什么是"遍历"呢:对学过一些开发语言的朋友来说应该知道&…...