Scrapy框架的基本使用教程

news2024/11/14 15:36:57

1、创建scrapy项目

        首先在自己的跟目录文件下执行命令:

PS D:\BCprogram\python_pro\bigdata> scrapy startproject theridion_grallator

scrapy + startproject + 项目名 具体执行操作如下:

1、创建项目目录:Scrapy会在当前工作目录下创建一个名为 theridion_grallator 的新目录。这个目录将成为你的Scrapy项目的根目录。
2、生成基本文件结构:在 theridion_grallator 目录下,Scrapy会自动生成一套标准的文件和子目录结构,包括但不限于:
    theridion_grallator/: 项目根目录。
    theridion_grallator/theridion_grallator/: 包含项目的设置文件 (settings.py)、爬虫模块(spiders/)、中间件 (middlewares.py)、管道 (pipelines.py) 等核心组件。
    theridion_grallator/items.py: 定义爬虫项目中数据模型的地方。
    theridion_grallator/pipelines.py: 数据处理的管道定义,用于清洗或存储爬取的数据。
    theridion_grallator/settings.py: 项目的配置文件,可以设置如用户代理、下载延迟等参数。
    theridion_grallator/spiders/: 存放所有爬虫脚本的目录,初始时可能为空或包含一个示例爬虫。
    scrapy.cfg: 项目的配置文件,位于根目录,用于指定项目的设置模块和其他元数据

2、创建一个爬虫程序 

        首先进入项目文件夹下,然后输入命令: 

scrapy genspider 爬虫程序的名称  要爬取网站的域名

D:\BCprogram\python_pro\bigdata\theridion_grallator> scrapy genspider game_4399 4399.com
 

当你运行 scrapy genspider game_4399 4399.com 命令时,Scrapy将执行以下操作:
1、创建爬虫文件:Scrapy会在 theridion_grallator/spiders/ 目录下创建一个名为 game_4399.py 的新文件。这个文件将包含你新建的爬虫的代码。
2、生成爬虫模板:打开 game_4399.py 文件,你会看到Scrapy已经为你生成了一个基本的爬虫模板,包括爬虫类 Game_4399 和一些默认方法,如 start_requests()、parse() 等。
3、配置爬虫域:Scrapy在爬虫类中设置了 allowed_domains 属性,将其值设为 ['4399.com'],这意味着爬虫将只对4399.com域名下的URL进行爬取。
4、设置起始URL:在 start_requests() 方法中,Scrapy通常会生成一个请求(Request 对象)到指定的域名(这里为 4399.com),作为爬虫开始爬取的起点。
5、定义解析函数:parse() 方法是默认的回调函数,当Scrapy收到响应后会调用它来解析网页内容。你需要根据4399.com网站的HTML结构来定制这个方法,以提取所需的数据。

3、编写爬虫程序

在game_4399.py文件中编写爬虫代码,代码如下

import scrapy
 
 
class Game4399Spider(scrapy.Spider):
    name = "game_4399"  # 爬虫程序的名称
    allowed_domains = ["4399.com"]  # 允许爬取的域名
    # 默认情况下是:https://4399.com
    # 但是我们不从首页开始爬取,所以改一下URL
    start_urls = ["https://4399.com/flash/"]  # 一开始爬取的URL
 
    def parse(self, response):  # 该方法用于对response对象进行数据解析
        # print(response)  # <200 http://www.4399.com/flash/>
        # print(response.text)  # 打印页面源代码
        # response.xpath()  # 通过xpath解析数据
        # response.css()  # 通过css解析数据
 
        # 获取4399小游戏的游戏名称
        # txt = response.xpath('//ul[@class="n-game cf"]/li/a/b/text()')
        # txt 列表中的每一项是一个Selector:
        # <Selector query='//ul[@class="n-game cf"]/li/a/b/text()' data='逃离克莱蒙特城堡'>]
        # 要通过extract()方法拿到data中的内容
        # print(txt)
 
        # txt = response.xpath('//ul[@class="n-game cf"]/li/a/b/text()').extract()
        # print(txt)  # 此时列表中的元素才是游戏的名字
 
        # 也可以先拿到每个li,然后再提取名字
        lis = response.xpath('//ul[@class="n-game cf"]/li')
        for li in lis:
            # name = li.xpath('./a/b/text()').extract()
            # # name 是一个列表
            # print(name)  # ['王城霸业']
 
            # 一般我们都会这么写:li.xpath('./a/b/text()').extract()[0]
            # 但是这样如果列表为空就会报错,所以换另一种写法
            # extract_first方法取列表中的第一个,如果列表为空,返回None
            name = li.xpath('./a/b/text()').extract_first()
            print(name)  # 王城霸业
 
            category = li.xpath('./em/a/text()').extract_first()  # 游戏类别
            date = li.xpath('./em/text()').extract_first()  # 日期
            print(category, date)
 
            # 通过yield向管道传输数据
            dic = {
                'name': name,
                'category': category,
                'date': date
            }
            # 可以认为这里是把数据返回给了管道pipeline,
            # 但是实际上是先给引擎,然后引擎再给管道,只是这个过程不用我们关心,scrapy会自动完成
            # 这里的数据会在管道程序中接收到
            yield dic

4、运行scrapy爬虫程序

在终端输入命令,就可以看到爬虫程序运行结果。

scrapy crawl 爬虫程序名称

D:\BCprogram\python_pro\bigdata\theridion_grallator> scrapy crawl game_4399

当你运行 scrapy crawl 爬虫程序名称 命令时,Scrapy执行以下操作来启动指定的爬虫:
1、加载项目设置:Scrapy首先读取项目根目录下的 settings.py 文件,加载项目配置。
2、初始化引擎:Scrapy初始化爬虫引擎,准备开始爬取流程。
3、启动爬虫:根据提供的爬虫名称,Scrapy会找到对应的爬虫类(通常在 spiders 目录下的Python文件中),并实例化这个爬虫。
4、执行start_requests:Scrapy调用爬虫类中的 start_requests 方法,这个方法返回一个或多个 Request 对象,表示要发起的HTTP请求。
5、调度请求:每个 Request 对象被添加到调度器(Scheduler)中,等待被发送到下载器(Downloader)。
6、下载网页:下载器接收到调度器的请求,下载网页内容,并生成一个 Response 对象。
7、解析响应:下载完成后的 Response 对象被传递给爬虫的解析函数(通常是 parse 或其他自定义的回调函数),在这里,爬虫解析HTML,提取数据,可能还会生成新的 Request 对象,形成新的爬取循环。
8、处理数据:提取到的数据通常会经过中间件的处理,然后传递给管道(Pipelines),在那里进行进一步的清洗、验证和持久化存储。
9、错误处理:如果在爬取过程中遇到错误,比如网络问题或服务器返回错误状态码,Scrapy会使用中间件和爬虫的错误处理逻辑来处理这些问题。
10、监控和控制:Scrapy提供了一套日志系统,可以记录爬取过程中的信息,还可以通过信号和扩展来实现更复杂的控制逻辑。
11、爬虫结束:当没有更多的请求待处理,或者达到预设的停止条件(如最大深度、最大请求数等),爬虫会停止运行。

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

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

相关文章

OceanBase 配置项系统变量实现及应用详解(1):配置项的定义及使用方法

《OceanBase 配置项&系统变量实现及应用详解》专题导读 在使用OceanBase的过程中&#xff0c;看到大家经常会遇到“参数”、“配置项”、“系统变量”等概念&#xff0c;却不太清楚它们是不是同一个东西&#xff0c;以及应该如何使用。一些对数据库开发感兴趣的朋友&#…

JavaScript总结2

概述 JavaScript是世界上最流行的脚本语言。JavaScript是一种轻量级的编程语言&#xff0c;可以插入HTML页面的编程代码。 JavaScript插入HTML页面后&#xff0c;可由浏览器执行。 特点 语法简单&#xff0c;易学易用&#xff1b; 解释性语言&#xff1b; 跨平台&#xff…

中国各省金融监管水平-测算数据(2006-2022年)

金融监管水平是指政府及其指定机构通过法律法规对金融机构及其市场行为进行监督、管理与规范的能力和效率&#xff0c;以维护金融体系稳定、保护投资者和消费者权益、促进公平竞争及支持经济增长。衡量金融监管水平的指标多样&#xff0c;常见的一种计算方式是金融监管支出与金…

K8s驱逐场景以及规避方案参考 —— 筑梦之路

Pod 驱逐分为两种情况&#xff1a; 较安全驱逐 & 提高稳定性的良性驱逐 API 发起驱逐&#xff0c;典型案例&#xff1a;kubectl drain Node Not Ready 时&#xff0c;Controller Manager 发起的驱逐 有风险的驱逐 节点压力驱逐 节点磁盘空间不足、内存不足 或 Pid 不足&…

jmeter-beanshell学习6-beanshell生成测试报告

前面写了各种准备工作&#xff0c;内容组合用起来&#xff0c;应该能做自动化了&#xff0c;最后一步&#xff0c;生成一个报告&#xff0c;报告格式还是csv 报告生成的路径和文件&#xff0c;在用户参数写好&#xff0c;防止以后改路径或者名字&#xff0c;要去代码里面改。以…

提高Python爬虫的匿名性:代理ip的配置策略

在当今&#xff0c;网络数据采集作为获取行业信息的重要手段&#xff0c;尤其在竞争激烈的商业环境中&#xff0c;Python作为一种强大的编程语言&#xff0c;广泛应用于开发各种数据爬虫来自动化地抓取网络信息。然而&#xff0c;网站普遍采用防护措施&#xff0c;即使我们合规…

基于Java技术的B/S模式书籍学习平台

你好&#xff0c;我是专注于计算机科学领域的学姐码农小野。如果你对书籍学习平台开发感兴趣或有相关需求&#xff0c;欢迎私信联系我。 开发语言&#xff1a; Java 数据库&#xff1a; MySQL 技术&#xff1a; B/S模式、Java技术 工具&#xff1a; Eclipse、Navicat、Mave…

手写简单模拟mvc

目录结构&#xff1a; 两个注解类&#xff1a; Controller&#xff1a; package com.heaboy.annotation;import java.lang.annotation.*;/*** 注解没有功能只是简单标记* .RUNTIME 运行时还能看到* .CLASS 类里面还有&#xff0c;构建对象久没来了&#xff0c;这个说明…

高效前端开发:解密pnpm的存储与链接

什么是pnpm PNPM&#xff08;Performant NPM&#xff09;是一种快速且节省磁盘空间的包管理工具。相较于其他包管理器如NPM和Yarn&#xff0c;PNPM通过独特的存储机制和链接技术解决了许多常见的问题。以下是PNPM如何避免这些问题以及其关键技术的详细介绍。 特性 PNPM Store…

初始redis:在Ubuntu上安装redis

1.先切换到root用户 使用su命令切换到root 2.使用apt命令来搜索redis相关的软件包 命令&#xff1a;apt search redis 3.下载redis 命令&#xff1a; apt install redis 在Ubuntu 20.04中 &#xff0c;下载的redis版本是redis5 4.查看redis状态 命令&#xff1a; netst…

jmeter-beanshell学习5-beanshell加减乘除运算

我用到的场景是计算金额&#xff0c;所以主要以金额为主&#xff0c;感觉这部分有点麻烦&#xff0c;直接写遇到的几个坑&#xff0c;就不演示解决的过程了。 1.最早写了个两数相减&#xff0c;但是小数精度容易出现问题。比如1-0.010.989999997这种情况&#xff0c;随便写的几…

【Java]认识泛型

包装类 在Java中&#xff0c;由于基本类型不是继承自Object&#xff0c;为了在泛型代码中可以支持基本类型&#xff0c;Java给每个基本类型都对应了一个包装类型。 除了 Integer 和 Character&#xff0c; 其余基本类型的包装类都是首字母大写。 泛型 泛型是在JDK1.5引入的…

第一百四十九节 Java数据类型教程 - Java子字符串、字符串转换

Java数据类型教程 - Java子字符串 获取子字符串 我们可以使用substring()方法来获取字符串的子部分。 我们可以将开始索引作为参数&#xff0c;并返回一个从开始索引开始到字符串结尾的子串。 我们还可以将开始索引和结束索引作为参数。 它返回从开始索引开始的子字符串和小…

项目记录:一个用python编写的简易版点餐系统

最近无聊做了一个简易版本的点餐系统&#xff0c;简单记录一下。吐槽一下最近的心情&#xff0c;最近心情较差&#xff0c;应该近期会去南昌玩吧&#xff0c;懂南昌的朋友可以评论区推荐下游玩攻略&#xff0c;非常感谢&#xff01; &#xff08;1&#xff09;相关配置信息&…

基于复旦微V7 690T FPGA +ARM/海光X86+AI的全国产化数据采集人工智能平台

国产化FPGA&#xff1a;JFM7VX690T80主机接口&#xff1a;PCIe Gen3 x88Gbps/lane光纤通道&#xff1a;前面板4路SFP光纤&#xff0c;后面板1路QSFP光纤2组独立的DDR3 SDRAM 缓存&#xff0c;工作时钟频率800MHz2个FMC接口扩展&#xff1a;每个支持16路GTH&#xff0c;线速率10…

Nuxt框架中内置组件详解及使用指南(三)

title: Nuxt框架中内置组件详解及使用指南&#xff08;三&#xff09; date: 2024/7/8 updated: 2024/7/8 author: cmdragon excerpt: 摘要&#xff1a;“Nuxt 3框架中与组件的深度使用教程&#xff0c;包括如何使用这两个组件进行页面导航和加载指示的自定义配置与实战示例…

平安银行秋招攻略,考试内容详解

平安银行秋招简介 在众多的银行招聘中&#xff0c;平安银行的招聘难度相对较低&#xff0c;根据考生的反馈情况来看&#xff0c;仔细的进行准备&#xff0c;平安银行上岸并不是难题&#xff0c;那么平安银行的秋招何时开始&#xff1f; 平安银行的秋招开始时间相对较晚&#…

dependencyManagement的作用、nacos的学习

使用SpringCloudAlibaba注意各组件的版本适配 SpringCloudAlibaba已经包含了适配的各组件&#xff08;nacos、MQ等&#xff09;的版本号&#xff0c;也是一个版本仲裁者&#xff0c;但是可能已经有了父项目Spring-Boot-Starter-Parent这个版本仲裁者&#xff0c;又不能加多个父…

.hmallox勒索病毒:全面防御策略

引言 近年来&#xff0c;随着网络技术的飞速发展&#xff0c;勒索病毒成为网络安全领域的一大威胁&#xff0c;其中.hmallox勒索病毒以其高度的隐蔽性和破坏性&#xff0c;尤为引人注目。这种病毒通过加密用户计算机中的重要文件&#xff0c;并以支付赎金作为解密条件&#xff…

LeetCode——第 405 场周赛

题目 找出加密后的字符串 给你一个字符串 s 和一个整数 k。请你使用以下算法加密字符串&#xff1a; 对于字符串 s 中的每个字符 c&#xff0c;用字符串中 c 后面的第 k 个字符替换 c&#xff08;以循环方式&#xff09;。 返回加密后的字符串。 示例 1&#xff1a; 输入&…