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

news2024/11/19 6:28:42

引言

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

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

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

相关文章

window本地部署Dify

Dify与之前的MaxKB不同,MaxKB可以实现基础的问答以及知识库功能,但是如果要开发一个Agent,或者工作流就还是需要额外开发,而Dify 是一个开源 LLM 应用开发平台。其直观的界面结合了 AI 工作流、RAG 管道、代理功能、模型管理、可观…

python制作一个批量更新文件名称的工具

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.实现 三.使用效果 一.前言 随着数字化时代的到来,文件管理和处理变…

14.微信小程序之地理定位功能

目录 1.地理定位介绍 1.1 申请开通 1.2 使用方法 2.拒绝授权后的解决方案 3.开通腾讯位置服务 4.LBS 逆地址解析 1.地理定位介绍 小程序地理定位是指通过小程序开发平台提供的 API,来获取用户的地理位置信息。用户在使用小程序时,可以授权小程序获…

【LabVIEW FPGA入门】同步C系列模块

1.同步使用循环定时器VI计时循环速率的系列模块 数字模块SAR ADC 模块多路复用模块 数字通道可以在一个时钟周期内执行。模拟通道需要多个时钟周期。 同步模拟模块的每个通道有一个 ADC,采集的数据在通道之间没有明显的偏差。多路复用模块使用多路复用器通过单个 A…

解决:error: failed to push some refs to ‘https://gitee.com/***/***.git‘(高效快速)

解决方案: git pull --rebase origin master 具体原因: 主要原因是gitee(github)中的README.md文件不在本地代码目录中 要执行git pull --rebase origin master命令将README.md拉到本地 然后就可以执行git push啦 写在最后: 要是问题得到…

MySQL简单测试和安装

MySQL 的特点 1、MySQL 性能卓越、服务稳定,很少出现异常宕机。 2、MySQL开放源代码且无版权制约,自主性及使用成本低。 3、MySQL历史悠久(版本众多),用户使用活跃,遇到问题可以寻求帮助。 4、MySQL体积小(相对大型关系型数据库)…

你还不知道宠物空气净化器的五大好处?难怪家里总有异味和猫毛!

养猫是一件非常令人愉快的事情,猫咪的陪伴能带给我们无尽的欢乐。然而,随着时间的推移,许多养猫的朋友会发现一个问题,那就是家中的猫毛和异味问题。其实,解决这些问题的关键就在于选择一款高效的宠物空气净化器。今天…

嵌入式学习——3——多点通信

1、套接字选项(socket options) int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen); int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); 功能:获取或设置套接…

二叉树——基础知识详解

前言: 经过前面的学习,我们接下来要开始二叉树的学习,因二叉树有难度,为了方便讲解以及各位的理解,本节知识会分成不同的小节进行学习,在本阶段只学习初阶的二叉树(堆,二叉数基本知识…

多分支拓扑阻抗匹配

最近测试信号质量,发现在有过冲、振铃等问题的时候大部分硬件工程师喜欢直接调大匹配电阻或者减小驱动电流,虽然这种操作是有效果的,但是我认为应该还可以更严谨的计算下,而不是选几个电阻多次尝试,显得不是很专业。 …

SOLIDWORKS正版一年多少钱 2024版报价

SOLIDWORKS软件作为一款优秀的三维设计工具,以其强大的功能和优质的设计工具,为设计师们提供了前所未有的便利。SOLIDWORKS三维设计软件是一款多科学集成软件,它在产品开发和制造方面发挥着重要作用。 作为整个SOLIDWORKS产品开发解决方案套件…

boost asio异步服务器(2)实现伪闭包延长连接生命周期

闭包 在函数内部实现一个子函数,子函数的作用域内能访问外部函数的局部变量。闭包就是能够读取其他函数内部变量。但是由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成程的性能问题&#x…

Discourse 使用 DiscourseConnect 来进行用户数据同步

我们都知道 Discourse 的用户管理和设置都高度依赖电子邮件。 如果 Discourse 没有设置电子邮件 SMTP 的话,作为管理员是没有办法对用户邮箱进行修改并且通过验证的。 可以采取的办法是通过 Discourse 的 DiscourseConnect 来进行用户同步。 根据官方的说法&…

Golang原生http实现中间件

Golang原生http实现中间件 中间件(middleware):常被用来做认证校验、审计等 大家常用的Iris、Gin等web框架,都包含了中间件逻辑。但有时我们引入该框架显得较为繁重,本文将介绍通过golang原生http来实现中间件操作。全…

vue复习选择题2

1. 下面哪一个方法可以实现判断元素的class属性是否含有pp样式? (A) A. hasClass(“pp”)B. is(“pp”)C. attr(“class”,“pp”)D. toggleClass(“pp”) [!NOTE] 当涉及到在 jQuery 中判断元素的类属性时,下面是各个选项的作用…

2024/5/28 P1247 取火柴游戏

取火柴游戏 题目描述 输入 k k k 及 k k k 个整数 n 1 , n 2 , ⋯ , n k n_1,n_2,\cdots,n_k n1​,n2​,⋯,nk​,表示有 k k k 堆火柴棒,第 i i i 堆火柴棒的根数为 n i n_i ni​;接着便是你和计算机取火柴棒的对弈游戏。取的规则如下&…

AI批量剪辑视频素材,高效混剪快速出片/矩阵发布,一键管理自媒体账号。

今天给大家分享一个超级好用的办公神器。特别是玩矩阵的企业,这款工具高效解决短视频剪辑问题。 这款软件可以帮你快速生产出1000条视频内容,而且还能把内容同步到多个平台账号上,多平台矩阵发布。 这款系统真的太棒了! 不仅操作简单,而且功能超强大。 …

干冰清洗机的清洗原理及应用

干冰清洗机的清洗原理及应用可以详细阐述如下: 一、清洗原理 干冰清洗机的清洗原理主要基于干冰的低温冷冻作用。干冰在常温下会迅速升华,吸收大量的热量,使周围的温度迅速降低。当干冰颗粒通过特殊的干冰清洗机喷射到清洗物体表面时&#…

Python | Leetcode Python题解之第104题二叉树的最大深度

题目: 题解: class Solution:def maxDepth(self, root: TreeNode) -> int:if not root: return 0queue, res [root], 0while queue:tmp []for node in queue:if node.left: tmp.append(node.left)if node.right: tmp.append(node.right)queue tmp…

素数判断的奥秘与编程实践

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、素数定义的深入理解 二、非素数的例子与思考 三、素数判断的编程实现 1. 穷举法判断素…