Scrapy框架:Python爬虫开发快速入门与初试

在众多编程语言中,Python以其简洁的语法和强大的库支持,成为了编写爬虫的首选语言。而在Python的爬虫库中,Scrapy框架无疑是其中的佼佼者。Scrapy是一个开源的、基于Python的爬虫框架,它提供了一套完整的工具和功能,使得爬虫的开发变得简单而高效。
在这里插入图片描述

一、Scrapy框架概述

Scrapy作为一个高效的爬虫框架,确实能够解决你提到的原生爬虫面临的一些问题,并且具有一些独特的特点。下面我们来一一对应你提到的问题,看看Scrapy是如何应对的:

1. 分布式爬虫

Scrapy的应对:
Scrapy本身是设计为单机运行的爬虫框架,但它支持分布式爬虫的构建。可以通过以下几种方式实现分布式爬虫:

  • 使用Scrapy-Redis:这是一个Scrapy的插件,它允许Scrapy与Redis协作,将任务队列和去重集合存储在Redis中,从而实现多个Scrapy实例之间的任务分配和去重。
  • 自定义分布式系统:开发者可以根据自己的需求,编写代码来分配任务和合并结果,实现更复杂的分布式爬虫系统。

2. URL去重

Scrapy的应对:
Scrapy内置了去重机制,它使用一个集合(Set)来存储已经见过的URL,避免重复爬取。这个集合可以存储在内存中,也可以通过配置存储到外部存储系统中,如Redis,以实现持久化。

3. 断点续爬

Scrapy的应对:
Scrapy支持断点续爬的功能,可以通过以下几种方式实现:

  • 请求队列:Scrapy的请求队列可以存储未处理的请求,如果爬虫程序意外停止,可以重新启动并从队列中继续处理。
  • 去重集合:Scrapy的去重集合可以记录已经处理过的URL,即使程序重启,也可以从这个集合中恢复状态。
  • JOBDIR:Scrapy支持JOBDIR设置,可以将爬虫的状态保存到文件中,重启时可以从这个文件中恢复爬取状态。

4. 动态加载

Scrapy的应对:
Scrapy主要处理静态网页的爬取,对于动态加载的内容,Scrapy本身不直接支持。但是,可以通过以下方式来处理:

  • Scrapy-Splash:这是一个Scrapy的插件,它使用Splash作为服务来处理JavaScript渲染的页面,可以模拟浏览器的行为,处理动态加载的内容。
  • Scrapy-Selenium:这个插件允许Scrapy与Selenium集成,使用Selenium来处理JavaScript渲染的页面。

二、Scrapy框架安装

Scrapy框架的安装非常简单,只需要使用Python的包管理器pip即可完成安装。在命令行中输入以下命令:

pip install scrapy

这行命令会下载并安装Scrapy框架及其依赖项,为后续的爬虫开发打下基础。

三、创建Scrapy项目

创建一个Scrapy项目是开始爬虫开发的第一步。通过以下命令,我们可以快速创建一个新的Scrapy项目:

scrapy startproject formoon

执行该命令后,Scrapy会在当前目录下创建一个名为formoon的文件夹,其中包含了一个基本的Scrapy项目结构。

四、添加爬虫

在Scrapy项目中,我们可以添加多个爬虫模块,每个模块负责不同的爬取任务。添加一个新的爬虫模块,可以使用以下命令:

scrapy genspider pages formoon.github.io

这条命令会在项目的spiders目录下创建一个新的Python文件pages.py,这个文件将包含爬虫的基本框架。

五、编写爬虫逻辑

pages.py文件中,我们需要编写爬虫的逻辑。假设我们的目标是爬取https://formoon.github.io网站上的所有文章,并获取文章的标题、链接地址和发布日期。以下是完成这一任务的代码示例:

import scrapy

class PagesSpider(scrapy.Spider):
    name = 'chinaisapages'
    allowed_domains = ['chinaisa.org.cn']
    start_urls = ['https://www.chinaisa.org.cn/gxportal/xfgl/portal/index.html']
	baseurl='ttps://www.chinaisa.org.cn/'
	
    def parse(self, response):
        for course in response.xpath('//ul/li'):
            href = self.baseurl + course.xpath('a/@href').extract()[0]
            title = course.css('.card-title').xpath('text()').extract()[0]
            date = course.css('.card-type.is-notShownIfHover').xpath('text()').extract()[0]
            print(title, href, date)
        for btn in response.css('.container--call-to-action').xpath('a'):
            href = btn.xpath('@href').extract()[0]
            name = btn.xpath('button/text()').extract()[0]
            if name == "下一页":
                yield scrapy.Request(self.baseurl + href, callback=self.parse)

注:代码未补全,请自动调试

六、执行爬虫

编写完爬虫逻辑后,我们可以通过以下命令执行爬虫:

scrapy crawl chinaisapages

执行该命令后,Scrapy会启动爬虫,按照我们定义的逻辑进行数据爬取,并在控制台输出结果。

七、进阶使用:Items和Pipelines

对于更复杂的爬虫任务,Scrapy提供了Items和Pipelines两个高级特性。Items用于定义数据结构,而Pipelines则用于处理Items中的数据。

首先,我们需要在项目的items.py文件中定义一个Item:

import scrapy

class FormoonItem(scrapy.Item):
    title = scrapy.Field()
    link = scrapy.Field()
    date = scrapy.Field()

然后,在pipelines.py文件中定义一个Pipeline来处理这些Item:

class FormoonPipeline(object):
    def process_item(self, item, spider):
        print("%s %s %s" % (item['date'], item['title'], item['link']))
        return item

最后,我们需要在settings.py文件中启用这个Pipeline:

ITEM_PIPELINES = {
    'formoon.pipelines.FormoonPipeline': 300,
}

项目配置文件

在Scrapy框架中,settings.py 文件是项目配置文件,它包含了项目运行时的各种设置。以下是您提到的两个配置项的说明:

  1. ROBOTSTXT_OBEY = False

    • 作用:此设置项用于控制Scrapy是否遵守目标网站的robots.txt文件规定。
    • 默认值:默认情况下,ROBOTSTXT_OBEY设置为True,意味着Scrapy会尊重robots.txt文件中的规则,不爬取被禁止的内容。
    • 使用场景:如果设置为False,则Scrapy将无视robots.txt文件,爬取所有页面,但这样做可能会违反网站的规定,甚至可能触犯法律,因此请谨慎使用,并确保你有权爬取目标网站的数据。
  2. DOWNLOAD_DELAY = 10

    • 作用:此设置项用于控制Scrapy下载中间件在请求之间的延迟时间。
    • 单位:时间单位为秒。
    • 默认值:默认情况下,DOWNLOAD_DELAY设置为0,意味着Scrapy在发送请求时不会有延迟。
    • 使用场景:如果设置了一个大于0的值,Scrapy在每次请求后会暂停指定的秒数。这通常用于减轻对目标网站服务器的压力,避免因请求过于频繁而被封锁。例如,设置DOWNLOAD_DELAY = 10意味着Scrapy在每次请求后会等待10秒钟再发送下一个请求。

日志的开启
Scrapy框架使用Python的内置logging模块来处理日志。要开启日志,你可以在settings.py文件中配置日志级别和其他相关设置。以下是一些基本的日志配置:

  • LOG_LEVEL:设置日志级别,如DEBUG, INFO, WARNING, ERROR, CRITICAL
    LOG_LEVEL = 'DEBUG'
    
  • LOG_FILE:设置日志输出文件的路径。
    LOG_FILE = 'scrapy.log'
    
  • LOG_ENABLED:开启或关闭日志记录功能。
    LOG_ENABLED = True
    

要开启日志,你可以在settings.py中设置LOG_ENABLEDTrue,并选择合适的LOG_LEVEL。Scrapy会根据配置输出不同级别的日志信息,帮助你调试和监控爬虫的运行情况。例如,DEBUG级别会输出最详细的日志,包括每个请求和响应的详细信息,而INFO级别则提供了较为概括的运行信息。

参考链接

  • Scrapy中文文档:Scrapy官方文档
  • XPath教程:XPath教程
  • CSS选择器使用手册:CSS选择器手册

通过本文的介绍,相信读者已经对Scrapy框架有了初步的了解,并能够开始使用Scrapy进行爬虫开发。在实际应用中,Scrapy的强大功能和灵活性将进一步展现出来,帮助我们高效地完成数据采集任务。


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

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

相关文章

三菱QD77MS定位模块速度限制功能

“速度限制功能”是控制中的指令速度超过“速度限制值”的情况下,将指令速度限制在“速度限制值”的设置范围内的功能。 [1]速度限制功能与各控制的关系 速度限制功能”与各控制的关系如下所示。 [3]速度限制功能的设置方法 使用“速度限制功能”时,在如…

LeetCode【0002】两数相加

本文目录 1 中文题目2 求解思路2.1 基础解法: 递归解法2.2 最优解法:迭代法 3 题目总结 1 中文题目 给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请将两个数相…

鸿蒙进阶-属性动画

hello大家好啊,这里是鸿蒙开天组,今天我们来学习鸿蒙中的动画属性。 先来说说动画~ 属性值的变化,通常会引发 UI 的变化,结合动画可以让这个变化过程【更为流畅】,反之这个过程将在一瞬间完成,用户体验不好&#xff…

工业相机常用功能之白平衡及C++代码分享

目录 1、白平衡的概念解析 2、相机白平衡参数及操作 2.1 相机白平衡参数 2.2 自动白平衡操作 2.3 手动白平衡操作流程 3、C++ 代码从XML读取参数及设置相机参数 3.1 读取XML 3.2 C++代码,从XML读取参数 3.3 给相机设置参数 1、白平衡的概念解析 白平衡(White Balance)…

语音识别ic赋能烤箱,离线对话操控,引领智能厨房新体验

一、智能烤箱产品的行业背景 随着科技的飞速发展,智能家居已经成为现代家庭的新宠。智能烤箱作为智能家居的重要组成部分,正逐渐从高端市场走向普通家庭。消费者对于烤箱的需求不再仅仅局限于基本的烘焙功能,而是更加注重其智能化、便捷化和…

智能合约在供应链金融中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 智能合约在供应链金融中的应用 智能合约在供应链金融中的应用 智能合约在供应链金融中的应用 引言 智能合约概述 定义与原理 发展…

书生大模型实战营-玩转HF/魔搭社区闯关任务

通过Github Codespace下载InternLM模型并运行 本篇博客是记录《书生大模型实战营第四期-玩转HF/魔搭/魔乐》章节的闯关任务从HF上下载模型文件,对实战营感兴趣的小伙伴也可以扫码报名哦。 一、通过模版创建Codespace环境 访问codespace 点击Jupyter Notebook 模版…

多维视角下的知识管理:Spring Boot应用

2 开发技术 2.1 VUE框架 Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的渐进式框架。 Vue 只关注视图层, 采用自底向上增量开发的设计。 Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。 2.2 Mysql数据库 …

【hdfs】【hbase】【大数据技术基础】实践二 HBase Java API编程

实践二 HBase Java API编程 为什么可以写命令还要编写程序?自动化批量处理? 尽管我们可以通过HBase的shell命令行工具进行数据操作,但在实际的生产环境中,为了提高效率和实现自动化处理,我们通常需要编写程序来与HBa…

【Pikachu靶场:XSS系列】xss之过滤,xss之htmlspecialchars,xss之herf输出,xss之js输出通关啦

一、xss之过滤 <svg onloadalert("过关啦")> 二、xss之htmlspecialchars javascript:alert(123) 原理&#xff1a;输入测试文本为herf的属性值和内容值&#xff0c;所以转换思路直接变为js代码OK了 三、xss之href输出 JavaScript:alert(假客套) 原理&#x…

【数据分享】1901-2023年我国省市县镇四级的逐年降水数据(免费获取/Shp/Excel格式)

之前我们分享过1901-2023年1km分辨率逐月降水栅格数据和Shp和Excel格式的省市县四级逐月降水数据&#xff0c;原始的逐月降水栅格数据来源于彭守璋学者在国家青藏高原科学数据中心平台上分享的数据&#xff01;基于逐月数据我们采用求年累计值的方法得到逐年降水栅格数据&#…

Istio Gateway发布服务

1. Istio Gateway发布服务 在集群中部署一个 tomcat 应用程序。然后将部署一个 Gateway 资源和一个与 Gateway 绑定的 VirtualService&#xff0c;以便在外部 IP 地址上公开该应用程序。 1.1 部署 Gateway 资源 vim ingressgateway.yaml --- apiVersion: networking.istio.…

暮雨直播 1.3.2 | 内置直播源,频道丰富,永久免费

暮雨直播是一款内置直播源的电视直播应用程序&#xff0c;提供丰富的频道内容&#xff0c;包括教学、首页、一线、博主、解说、动漫、堆堆等。该应用的内置直播源持续更新维护&#xff0c;确保用户可以稳定地观看各种电视频道。暮雨直播承诺永久免费&#xff0c;为用户提供了一…

大数据学习10之Hive高级

1.Hive高级 将大的文件按照某一列属性进行GROUP BY 就是分区&#xff0c;只是默认开窗存储&#xff1b; 分区是按行&#xff0c;如一百行数据&#xff0c;按十位上的数字分区&#xff0c;则有十个分区&#xff0c;每个分区里有十行&#xff1b; 分桶是根据某个字段哈希对桶数取…

Java基于SpringBoot+Vue框架的宠物寄养系统(V2.0),附源码,文档

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

定义宏将整数的二进制的奇数位和偶数位互换位置

假设这个数为n00000000 00000000 00000000 00001101——13 1.思路 1.1 奇数位&#xff1a;00000000 00000000 00000000 00000101 但是怎么获得奇数位呢&#xff1f;——进行按位与运算 不懂如何运算的可以看我主页的详解操作符-CSDN博客&#xff0c;该章详细写了各个操作符如何…

基于 RNN 的语言模型

基于 RNN 的语言模型 循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一类网络连接中包含环路的 神经网络的总称。 给定一个序列&#xff0c;RNN 的环路用于将历史状态叠加到当前状态上。沿着时间维度&#xff0c;历史状态被循环累积&#xff0c;并作为…

html的week控件 获取周(星期)的第一天(周一)和最后一天(周日)

html的week控件 获取周(星期)的第一天(周一)和最后一天(周日) <input type"week" id"week" class"my-css" value"ViewBag.DefaultWeek" /><script> function PageList() { var dateStrin…

C/C++--11--Vxworks6.8 + workbench3.2-一文看懂安装及工程导入说明

1、安装包截图如下&#xff1a; 2、安装流程如下&#xff1a; 安装系统&#xff1a;Win10-64位&#xff08;会出现以下报错-待解决&#xff09; 安装系统&#xff1a;Win7-64位&#xff0c;安装成功&#xff0c;路径如下&#xff1a; http://www.windriver.com/ 1、安装完成后…

MLMs之OmniGen:OmniGen(统一图像生成模型)的简介、安装和使用方法、案例应用之详细攻略

MLMs之OmniGen&#xff1a;OmniGen(统一图像生成模型)的简介、安装和使用方法、案例应用之详细攻略 导读&#xff1a;这篇论文介绍了OmniGen&#xff0c;一个用于统一图像生成的扩散模型。论文的核心要点可以总结如下&#xff1a; >> 背景痛点&#xff1a; ● 图像生成领…