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即可完成安装。在命令行中输入以下命令:

bash 复制代码
pip install scrapy

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

三、创建Scrapy项目

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

bash 复制代码
scrapy startproject formoon

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

四、添加爬虫

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

bash 复制代码
scrapy genspider pages formoon.github.io

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

五、编写爬虫逻辑

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

python 复制代码
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)

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

六、执行爬虫

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

bash 复制代码
scrapy crawl chinaisapages

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

七、进阶使用:Items和Pipelines

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

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

python 复制代码
import scrapy

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

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

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

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

python 复制代码
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

    python 复制代码
    LOG_LEVEL = 'DEBUG'
  • LOG_FILE:设置日志输出文件的路径。

    python 复制代码
    LOG_FILE = 'scrapy.log'
  • LOG_ENABLED:开启或关闭日志记录功能。

    python 复制代码
    LOG_ENABLED = True

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

参考链接

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


相关推荐
LKID体29 分钟前
Python操作neo4j库py2neo使用(一)
python·oracle·neo4j
小尤笔记1 小时前
利用Python编写简单登录系统
开发语言·python·数据分析·python基础
FreedomLeo11 小时前
Python数据分析NumPy和pandas(四十、Python 中的建模库statsmodels 和 scikit-learn)
python·机器学习·数据分析·scikit-learn·statsmodels·numpy和pandas
007php0071 小时前
GoZero 上传文件File到阿里云 OSS 报错及优化方案
服务器·开发语言·数据库·python·阿里云·架构·golang
Tech Synapse1 小时前
Python网络爬虫实践案例:爬取猫眼电影Top100
开发语言·爬虫·python
一行玩python2 小时前
SQLAlchemy,ORM的Python标杆!
开发语言·数据库·python·oracle
数据小爬虫@3 小时前
利用Python爬虫获取淘宝店铺详情
开发语言·爬虫·python
编程修仙4 小时前
Collections工具类
linux·windows·python
芝麻团坚果4 小时前
对subprocess启动的子进程使用VSCode python debugger
linux·ide·python·subprocess·vscode debugger
EterNity_TiMe_4 小时前
【论文复现】神经网络的公式推导与代码实现
人工智能·python·深度学习·神经网络·数据分析·特征分析