Scrapy框架简单介绍及Scrapy项目编写详细步骤

引言

Scrapy是一个用Python编写的开源、功能强大的网络爬虫框架,专为网页抓取和数据提取设计。它允许开发者高效地从网站上抓取所需的数据,并通过一系列可扩展和可配置的组件来处理这些数据。Scrapy框架的核心组成部分包括:

  • Scrapy Engine(引擎): 负责控制数据流,协调各个组件之间的交互,实现爬虫的逻辑。
  • Scheduler(调度器): 负责管理待抓取的请求队列,决定下一个要抓取的请求是什么。
  • Downloader(下载器): 负责处理调度器传来的请求,获取网页内容,并将其传递给Spider处理。
  • Spiders(爬虫): 自定义类,定义了如何解析下载回来的网页内容,并提取结构化数据(Items)。每个Spider负责处理一个或一组特定的网站或页面结构。
  • Item Pipeline(项目管道): 数据处理的流水线,负责处理Spider提取的数据,进行清洗、验证、去重、存储等操作。每个项目经过一系列的Pipeline组件,直至处理完成。
  • Middlewares(中间件): 分为请求/响应中间件和Spider中间件,位于引擎和其他组件之间,可以全局地处理请求、响应或改变数据流向,提供了高度的灵活性和可扩展性。

Scrapy的特点和优势包括:

易于使用和部署: 提供了命令行工具简化了项目的创建、运行和管理。

灵活性和可扩展性: 设计为高度模块化,可以很容易地自定义或替换组件以满足特定需求。

高性能: 基于Twisted异步网络库,支持并发下载,能够高效处理大量请求。

广泛的应用场景: 适用于数据挖掘、价格监控、市场研究、搜索引擎优化等领域。

Scrapy通过定义良好的API和组件模型,使得开发者能够快速构建复杂的爬虫,同时保持代码的整洁和可维护性。

本篇文章参考b站视频

【1小时学会爬取豆瓣热门电影,快速上手Scrapy爬虫框架,python爬虫快速入门!】 https://www.bilibili.com/video/BV18a411777v/?share_source=copy_web&vd_source=70bc998418623a0cee8f4ac32d696e49

一、在命令窗口中使用命令创建一个scrapy项目

首先我们进行安装有scrapy框架的虚拟环境下的scripts目录下,用scrapy startproject项目名称,来创建一个scrapy爬虫项目。

在希望scrapy项目放置位置的文件夹下运行如下命令:

scrapy startproject douban_spider

在pycharm编辑器打开改项目,生成的项目结构如下:

二、在items.py文件中定义字段

这些字段用来临时存储我们要去抓取的结构化数据,方便后面保数据到其他地方,比如数据库或者本地文本之类。

Item文件编写

  • Item是保存爬取到的数据的容器;其使用方法和Python字典类似,并且提供了额外保护机制来避免拼写错误导致的未定义字段错误。
  • 以豆瓣电影Top250 为例,我们需要抓取每一步电影的名字,电影的评分以及电影的评分人数。
  • 豆瓣电影 Top 250 (douban.com)
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.htmlimport scrapyclass DoubanSpiderItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()title = scrapy.Field()  # 电影名字star = scrapy.Field()   # 评分critical = scrapy.Field()   # 评分人数pass

三、在piplines.py中存储自己的数据,我们在此存储为csv格式

  • 我们准备把分析提取出来的结构化数据存储为csv格式。首先在piplines文件中创建一个类,在该类的构造函数中创建一个文件对象,然后在process_item函数中做数据存储处理(编码成utf-8格式),最后关闭文件。

piplines.py文件代码如下:

class DoubanSpiderPipeline:def __init__(self):self.file = open("d:/douban.csv", "wb")def process_item(self, item, spider):str = item['title'].encode('utf-8') + b',' + item['star'].encode('utf-8') + b',' + item['critical'].encode('utf-8') + b'\n'self.file.write(str)return itemdef close_spider(self, spider):self.file.close()

四、爬虫逻辑文件编写

把每个文件都配置好之后,就可以自己写一个逻辑处理文件,在spiders目录下创建一个douban.py文件,在改文件中我们写业务逻辑处理,主要是爬取,解析,把解析的内容结构化等等。

# encoding:utf-8
import scrapy
from scrapy.spiders import CrawlSpider
from scrapy.http import Request
from scrapy.selector import Selector
from douban_spider.items import DoubanSpiderItem# 定义一个类 继承
class Douban(CrawlSpider):name = "douban"  # 爬虫项目名allowed_domains = ['douban.com']  # 爬取的域名start_urls = ['https://movie.douban.com/top250']  # 爬取的页面网址# 请求是分布式的def start_requests(self):for url in self.start_urls:yield Request(url=url, callback=self.parse)def parse(self, response):item = DoubanSpiderItem()selector = Selector(response)Movies = selector.xpath('//div[@class="info"]')for eachMovie in Movies:title = eachMovie.xpath('div[@class="hd"]/a/span/text()').extract()[0]star = eachMovie.xpath('div[@class="bd"]/div/span[@class="rating_num"]/text()').extract()[0]critical = eachMovie.xpath('div[@class="bd"]/div/span/text()').extract()[1]item['title'] = titleitem['star'] = staritem['critical'] = criticalyield itemnextLink = selector.xpath('//span[@class="next"]/a/@href').get()# 确保nextLink有效且不是最后一页if nextLink and 'javascript:void(0)' not in nextLink:# 注意处理相对路径if not nextLink.startswith(('http:', 'https:')):nextLink = response.urljoin(nextLink)yield Request(url=nextLink, callback=self.parse)

运行程序

得到的csv文件如下:

*Settings文件编写

  • 该文件不是必须要编写,我们完全可以把配置放在其他相应的文件中,比如headers放在页面逻辑抓取文件中,文件或数据库配置放在Pipeline文件中等等。

*如果需要转存到数据库方法

import csv
import mysql.connector
from mysql.connector import Error# MySQL数据库连接参数
db_config = {'host': '127.0.0.1',  # 数据库主机地址'user': 'root',  # 数据库用户名'password': '021211',  # 数据库密码'database': 'douban'  # 数据库名称
}# CSV文件路径
csv_file_path = 'd:/douban.csv'try:# 连接到MySQL数据库connection = mysql.connector.connect(**db_config)if connection.is_connected():db_info = connection.get_server_info()print(f"Successfully connected to MySQL Server version {db_info}")cursor = connection.cursor()columns = ["title", "star", "critical"]  # 替换为你的列名# 读取CSV文件并插入数据with open(csv_file_path, mode='r', encoding='utf-8') as file:csv_reader = csv.reader(file)next(csv_reader) for row in csv_reader:placeholders = ', '.join(['%s'] * len(row))query = f"INSERT INTO douban_spider ({', '.join(columns)}) VALUES ({placeholders})"cursor.execute(query, tuple(row))# 提交事务connection.commit()print(f"{cursor.rowcount} rows were inserted successfully.")except Error as e:print(f"Error while connecting to MySQL: {e}")
finally:# 关闭连接if connection.is_connected():cursor.close()connection.close()print("MySQL connection is closed.")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/15203.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

aws glue配置读取本地kafka数据源

创建连接时填写本地私有ip地址,选择网络配置 配置任务选择kafka作为数据源 但是执行任务时日志显示连接失败 文档提到只能用加密通信 如果您希望与 Kafka 数据源建立安全连接,请选择 Require SSL connection (需要 SSL 连接),并在 Kafka priv…

python批发模块的调试之旅:从新手到专家的蜕变

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、调试技巧的重要性 二、批发模块调试的实战演练 1. 设置断点 2. 逐行执行代码 3. 观察…

Android+SQLiteOpenHelper实现登录记住密码小案例

实现自动登录,在数据库中存 注册的账号信息 package com.example.databases_text;import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import andro…

运维行业中的堆叠交换机监控与配置管理策略

随着信息技术的迅猛发展,企业网络架构日趋复杂,交换机作为网络基础设施的核心设备,其稳定性和安全性对于企业业务的运行至关重要。在运维实践中,堆叠交换机(Stacked Switches)因其高可靠性、灵活扩展性等特…

SM2258G专用SSD开卡工具(三星闪存),后附工具下载

工具下载: https://download.csdn.net/download/weixin_43097956/89354302

「贪心算法」柠檬水找零

力扣原题链接,点击跳转。 假设你的手里没有钱。你要卖柠檬水,每杯5块钱。每个顾客有可能会给你5块钱、10块钱或20块钱,你要拿手中的钱找零。如何判断你能否成功找零呢? 如果一上来就有顾客花10块钱或20块钱,你手中没…

python中特殊的静态方法__new__

一、关于new方法 在Python中,__new__方法是一个特殊的静态方法,用于实例化对象。通常不需要直接调用__new__方法,Python会自动调用它来分配内存空间并返回一个新对象(或者更具体地说,是对象的引用)。然而&…

视频怎么转换成二维码图片?视频做成二维码播放的方法

怎样在电脑上制作可以播放视频的二维码呢?很多日常生活中,很多的场景或者物品都会有自己的二维码,其他人通过扫码就可以获取对应的内容。有很多场景下会把视频转换二维码,通过扫码在手机上查看视频内容,比如产品介绍、…

水表电表远程抄表是什么?

1.简述:水表电表远程抄表技术性 随着时代的发展,传统式手动抄表方法早已被更为高效、智能化的远程抄表系统所替代。水表电表远程抄表,说白了,就是利用互联网技术完成对水表和电表读数的远程数据采集管理方法,大大提升…

效果炸裂!使用 GPT-4o 快速实现LLM OS

▼最近直播超级多,预约保你有收获 —1— 什么是 LLM OS? 关于 LLM OS 的最初构想源自karpathy 在2023年11月11日发布的一条Twitter 动态,这是 LLM OS 概念的最早出处,如下图所示: LLM OS 主要有以下5个部分组成&#x…

基于SA模拟退火优化算法的TSP问题求解matlab仿真,并对比ACO蚁群优化算法

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于SA模拟退火优化算法的TSP问题求解matlab仿真,并对比ACO蚁群优化算法,对比两个算法的仿真时间,收敛曲线,以及路径规划的结果&#xff0…

中间件的概念及示例

什么是中间件? 中间件是一种软件技术,它在分布式系统中起着至关重要的作用。以下是关于中间件的详细解释: 定义与位置: 中间件是位于应用系统和系统软件之间的一类软件。它使用系统软件提供的基础服务(功能&#xff0…

Flask+Vue+MySQL天水麻辣烫管理系统设计与实现(附源码 配置 文档)

背景: 同学找到我期望做一个天水麻辣烫的网页,想复用以前做过的课设,结合他的实际需求,让我们来看看这个系统吧~ 项目功能与使用技术概述: 里面嵌入了6个子系统,其中餐饮系统可以进行餐馆信息添加、修改…

TypeScript体操类型练习

历史小剧场 这个世界上,有两种人最痛苦,第一种是身居高位者,第二种是身居底层者,第一种人很少,第二种人很多。第一种人叫崇祯,第二种人叫百姓。 而最幸福的,就是中间那拨人,主要工作…

Influence blocking maximization on networks: Models, methods and applications

abstract 由于各种社会和贸易网络的不断出现,网络影响力分析引起了研究者的极大兴趣。基于不同的影响力传播模型,人们提出了许多网络影响力最大化的新模型和方法。作为传统影响力最大化问题的延伸和扩展,影响力封锁最大化问题已成为研究热点&…

借助 CloudFlare 增强站点内容保护防采集

今天在一位站长的帮助下实测了 CloudFlare 增强站点内容保护实现防采集的功能,效果那是杠杠的,如果您的站点原创内容比较多的话,明月强烈建议试试 CloudFlare 这个内容保护,无论是 WordPress 、Typecho 都有非常好的效果,并且几乎没有任何误伤,搜索引擎爬虫蜘蛛更是不会影…

【图论】单源最短路

前言 今天&#xff0c;我们来讲最短路&#xff0c;首先看只有一个起点&#xff08;单源&#xff09;的情况。 为了书写方便&#xff0c;我们约定以下内容&#xff1a; template<class W> using Graph vector<vector<pair<int, W>>>; // 邻接表(ve…

集中抄表电表是什么?

1.集中抄表电表&#xff1a;简述 集中抄表电表&#xff0c;又称为远程抄表系统&#xff0c;是一种现代化电力计量技术&#xff0c;为提升电力行业的经营效率和客户服务质量。它通过自动化的形式&#xff0c;取代了传统人工抄水表&#xff0c;完成了数据信息实时、精确、高效率…

进制转换【野路子改造】

非科班&#xff0c;一直都是自己的野路子&#xff0c;现在要回炉重造 十进制->二进制 基本思想&#xff1a; 开始写的&#xff08;80%&#xff09;&#xff1a; #include<stdio.h> using namespace std; int main(){ int n; scanf("%d",&n); int a[1…

Spring -- DI

文章目录 一、什么是DI二、注入的三种方式2.1 属性注入 Autowired使用方法Autowired存在的问题以及解决方法Autowired问题的解决方法 2.2 构造方法注入2.3 setter方法注入2.4 三种注入方式优缺点分析 一、什么是DI 概念&#xff1a;DI(依赖注入)就是当我们把依赖对象取出来(创…