Scrapy框架简单介绍及Scrapy项目编写详细步骤(Scrapy框架爬取豆瓣网站示例)

引言

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

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

Scrapy的特点和优势包括:

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

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

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

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

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

本篇文章爬取豆瓣网站top250电影  参考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.html

import scrapy


class 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 item

    def 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'] = title
            item['star'] = star
            item['critical'] = critical
            yield item

            nextLink = 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.")

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

matplotlib ---词云图

词云图是一种直观的方式来展示文本数据,可以体现出一个文本中词频的使用情况,有利于文本分析,通过词频可以抓住一篇文章的重点 本文通过处理一篇关于分析影响洋流流向的文章,分析影响洋流流向的主要因素都有哪些 文本在文末结尾 …

用手机做客服的吐槽点客服亲们有同感吗

聊天宝手机版很好的解决了,客服手机快速回复客户的需求,不论微信,企业微信,千牛或其他手机APP回复客户,都可以用聊天宝APP实现图文一键发送,非常方便 前言 做客服工作,除了电脑上回复客户咨询&…

一文读懂Maven的安装与配置

一、前言【可忽略】 Maven本质是一个项目管理工具,类似于JDK是java开发工具。 我们需要管理什么呢?首先各种各样的依赖,比如SpringFramwork、Mybatis。 简单点做,我们新建个目录,就能管理这些jar包。然而,缺…

第 8 章 机器人平台设计之传感器(自学二刷笔记)

重要参考: 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 8.6.1 传感器_激光雷达简介 激光雷达是现今机器人尤其是无人车领域及最重要、最关键也是最常见的传感器之一&…

转型先锋!G7易流的数字化到底有多牛?

在供应链全球一体化进程中,国内外局势的改变,使得物流行业运力供大于求趋势愈加明显,国内供应链参与者面对内外发展需求和激烈的市场竞争,需要打破同质化竞争的局面,提供具有特色的服务,形成专业、高效、灵…

Hexo最新实战:(一)Hexo7.0+GitHub Pages博客搭建

前言 很多平台都能写博客还有创作激励,为什么我又要搭一个?为什么这次要选择用Hexo框架? 对应的原因是流量自由和省钱,第一个,很多平台能写但不是都有收益,而且平台有自身的规则,比如会屏蔽一…

2024第三届AIGC开发者大会圆桌论坛:AI Agent中国落地发展现状及多模态结合具身智能的发展展望

在2024年第三届AIGC开发者大会上,多位业内专家齐聚一堂,共同探讨了AI Agent在中国的落地发展现状以及多模态结合具身智能的发展前景。本次圆桌论坛的嘉宾包括: Fast JP作者于金龙Agent创始人莫西莫必胜作者秦瑞January Agent创始人李晨 多模…

C++编程函数中switch实例用法

switch语法 switch (func_cb.sta) switch后续跟随多个成对的case和break,分别包含if/endif判断语句 每个 case 后跟一个要比较的值和一个冒号,当被测试的变量等于 case 中的常量时,case下一行的语句将被执行 switch 语句可以嵌套。 嵌套时&am…

爬虫逆向实例小记——某数据知识管理网站-DES-ECB模式

aHR0cHM6Ly9rZC5uc2ZjLmNuL2ZpbmFsUHJvamVjdEluaXQ 注意:本文是逆向部分比较少,主要为了流程走通,限于代码搬运工。 第一步:分析页面 此网站经过请求响应,可以看出响应内容为加密内容。 第二步:判断加密类型 在XHR …

【Linux】解决误操作libc.so.6导致的问题,补充:升级glibc注意事项

千万不要轻易动/usr/lib64/libc.so.6。 glibc是Linux系统中最底层的api,Linux几乎所有运行库都依赖glibc。/usr/lib64/libc.so.6属于glibc,在centos7中是个软链接。 一旦误删或误操作libc.so.6,或者glibc新版本不兼容等原因,都可…

c++编程(13)——vector的模拟实现

欢迎来到博主的专栏——c编程 博主ID:代码小豪 文章目录 前言vector的模拟实现vector的成员对象插入、删除、扩容访问vector元素构造函数 填坑:为什么拷贝vector类元素的时候不能用浅拷贝末尾源代码: 前言 博主目前的水平还不能很明确的描述…

CV之Nougat:Nougat(一种基于神经网络实现OCR功能的视觉转换器模型)的简介、安装和使用方法、案例应用之详细攻略

CV之Nougat:Nougat(一种基于神经网络实现OCR功能的视觉转换器模型)的简介、安装和使用方法、案例应用之详细攻略 目录 相关论文 《Nougat: Neural Optical Understanding for Academic Documents》的翻译与解读 Nougat的简介 Nougat的安装和使用方法 1、安装 …

短视频拍摄方式有哪些:四川鑫悦里文化传媒有限公司

​短视频拍摄方式有哪些 在数字化时代,短视频以其短小精悍、传播迅速的特点,成为了人们表达自我、分享生活的重要工具。然而,想要制作出引人入胜的短视频,除了创意和构思,拍摄方式的选择也至关重要。四川鑫悦里文化传…

JavaEE:Servlet创建和使用及生命周期介绍

目录 ▐ Servlet概述 ▐ Servlet的创建和使用 ▐ Servlet中方法介绍 ▐ Servlet的生命周期 ▐ Servlet概述 • Servlet是Server Applet的简称,意思是 用Java编写的服务器端的程序,Servlet被部署在服务器中,而服务器负责管理并调用Servle…

香橙派KunpengPro测评之使用C语言操控40pin引脚

香橙派KunpengPro测评之使用C语言操控40pin引脚 香橙派KunpengPro介绍香橙派实物图香橙派登录界面香橙派KunpengPro的登录界面香橙派KunpengPro的原始桌面香橙派KunpengPro内安装了VScode等软件香橙派KunpengPro的终端 香橙派硬件参数核心性能图形与显示接口丰富性扩展与兼容性…

2024年中国金融行业网络安全研究报告

网络安全一直是国家安全的核心组成部分,特别是在金融行业,金融机构拥有大量的敏感数据,包括个人信息、交易记录、财务报告等,这些数据的安全直接关系到消费者的利益和金融市场的稳定,因此金融行业在网络安全建设领域一…

短道速滑短视频:四川京之华锦信息技术公司

短道速滑短视频:冰雪激情的视觉盛宴 随着冬奥会的热度不断攀升,短道速滑作为其中一项紧张刺激、充满观赏性的运动,受到了越来越多人的关注。而在社交媒体和短视频平台的助力下,短道速滑短视频成为了人们了解、欣赏这项运动的新窗…

MPLS原理与配置

1.MPLS概述 (1)传统IP路由转发 (2)MPLS基本概念 ⦁ MPLS起源于IPv4(Internet Protocol version 4),其核心技术可扩展到多种网络协议,包括IPv6(Internet Protocol ver…

LFSR线性反馈移位寄存器及Verilog实现

一、LFSR LFSR线性反馈移位寄存器,通常由移位寄存器和异或门组成,主要用于产生伪随机序列等。 线性反馈的含义是各个寄存器的输出通过一个反馈函数连接到第一级触发器的输入;LFSR中的寄存器的个数被称为LFSR的级数。 LFSR分为两类&#xff…

【机器学习】K-近邻算法(KNN)全面解析

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 K-近邻算法(KNN)全面解析概述1. 基本概念与原理1.1 KNN算…