爬虫实战之使用 Python 的 Scrapy 库开发网络爬虫详解

    


关键词 - Python, Scrapy, 网络爬虫

在信息爆炸时代,我们每天都要面对海量的数据和信息。有时候我们需要从互联网上获取特定的数据来进行分析和应用。今天我将向大家介绍如何使用 Python 的 Scrapy 库进行网络爬虫,获取所需数据。


1. Scrapy 简介

1.1 什么是网络爬虫?

网络爬虫就是一种自动化程序,能够模拟人的行为,在互联网上浏览并提取网页中的数据。通过网络爬虫,我们可以快速获取大量的数据,而不需要手动访问每个网页。

1.2 Scrapy 是什么?

Scrapy 是一个用于构建网络爬虫的强大框架。它提供了一套简单而灵活的方式来定义爬虫的行为。借助 Scrapy,我们可以轻松地编写爬虫代码,处理网页的下载解析数据提取等任务。

2. 安装和配置 Scrapy

在开始使用 Scrapy 之前,我们需要先安装并配置好相关的环境。

2.1 安装 Scrapy

打开终端或命令提示符,执行以下命令:

pip install scrapy

2.2 创建 Scrapy 项目

安装完成后,我们可以使用 Scrapy 命令行工具创建一个新的 Scrapy 项目。在终端或命令提示符中,进入你想要创建项目的目录执行以下命令:

scrapy startproject myproject

这里是初始化 Scrapy 项目结构。

3. 编写第一个爬虫

现在来编写一个爬虫。在 Scrapy 项目中,爬虫代码位于 spiders 文件夹下的 Python 文件中。

3.1 创建爬虫文件

首先创建一个新的爬虫文件。

scrapy genspider myspider example.com

执行后在 spiders 文件夹下创建一个名为 myspider.py 的文件,同时指定要爬取的网站为 example.com

3.2 编写爬虫代码

打开 myspider.py 文件,可以看到一个基本的爬虫模板。在这个模板中,我们可以定义爬虫的名称、起始 URL、数据提取规则等。

import scrapy

class MySpider(scrapy.Spider):
    name = 'myspider'
    start_urls = ['http://www.example.com']

    def parse(self, response):
        # 在这里编写数据提取代码
        pass

在 parse 方法中可以编写代码来提取需要的数据。通过使用 Scrapy 提供的选择器和XPath表达式,我们可以轻松地定位和提取网页中的元素。

import scrapy

class MySpider(scrapy.Spider):
    name = 'myspider'
    start_urls = ['http://www.example.com/post-1.html']

    def parse(self, response):
        # 提取标题和链接
        titles = response.css('h1::text').getall()
```python
        links = response.css('a::attr(href)').getall()

        # 打印标题和链接
        for title, link in zip(titles, links):
            print(f"标题:{title}")
            print(f"链接:{link}")

3.3 运行爬虫

编写完爬虫代码后,我们可以在终端或命令提示符中进入项目根目录,并执行以下命令来运行爬虫:

scrapy crawl myspider

爬虫将会开始运行,并从指定的起始 URL 开始爬取数据。提取到的数据将会在终端或命令提示符中显示出来。

4. 数据存储与处理

提取到的数据通常需要进行存储和处理。Scrapy 提供了多种方式来实现数据的存储和处理,包括保存为文件、存储到数据库等。

4.1 保存为文件

我们可以使用 Scrapy 提供的 Feed Exporter 来将数据保存为文件。在 settings.py 文件中,我们可以配置导出数据的格式和存储路径。

FEED_FORMAT = 'csv'
FEED_URI = 'data.csv'

在爬虫代码中,我们可以通过在 parse 方法中使用 yield 关键字返回提取到的数据,并将其保存到文件中。

import scrapy

class MySpider(scrapy.Spider):
    name = 'myspider'
    start_urls = ['http://www.example.com/post-1.html']

    def parse(self, response):
        # 提取标题和链接
        titles = response.css('h1::text').getall()
        links = response.css('a::attr(href)').getall()

        # 保存为文件
        for title, link in zip(titles, links):
            yield {
                '标题': title,
                '链接': link
            }

4.2 存储到数据库

如果我们希望将数据存储到数据库中,可以使用 Scrapy 提供的 Item Pipeline。在 settings.py 文件中,我们可以启用 Item Pipeline 并配置数据库连接信息。

ITEM_PIPELINES = {
    'myproject.pipelines.MyPipeline': 300,
}

DATABASE = {
    'drivername': 'postgresql',
    'host': 'localhost',
    'port': '5432',
    'username': 'myuser',
    'password': 'mypassword',
    'database': 'mydatabase'
}

在爬虫代码中,我们可以定义一个 Item 类来表示要存储的数据,并在 parse 方法中使用 yield 关键字返回 Item 对象。

import scrapy

class MyItem(scrapy.Item):
    title = scrapy.Field()
    link = scrapy.Field()

class MySpider(scrapy.Spider):
    name = 'myspider'
    start_urls = ['http://www.example.com/post-1.html']

    def parse(self, response):
        # 提取标题和链接
        titles = response.css('h1::text').getall()
        links = response.css('a::attr(href)').getall()

        # 存储到数据库
        for title, link in zip(titles, links):
            item = MyItem()
            item['title'] = title
            item['link'] = link
            yield item

yield item 将数据项(item)生成为一个生成器(generator),并将其返回给Scrapy引擎。引擎会根据配置的管道设置,将生成器中的数据项传递给相应的管道进行处理。每个管道可以对接收到的数据项进行自定义的操作,例如验证、清洗、转换等,并最终将数据存储到指定的位置。

通过使用yield item语句,可以实现数据的流式处理和异步操作,从而提高爬虫的效率和性能。

5. 继续爬取下一页

当我们需要爬取多页数据时,通常需要提取文章列表页面上的“下一页”URL,并继续执行下一页的爬取任务,直到最后一页。在 Scrapy 中,我们可以通过在 parse 方法中提取“下一页”URL,并使用 scrapy.Request 发起新的请求来实现这一功能。

import scrapy

class MySpider(scrapy.Spider):
    name = 'myspider'
    start_urls = ['http://www.example.com/list']

    def parse(self, response):
        # 提取当前页面的数据

        # 提取下一页的URL
        next_page_url = response.css('a.next-page::attr(href)').get()

        if next_page_url:
            # 构造下一页的请求
            next_page_request = scrapy.Request(response.urljoin(next_page_url), callback=self.parse)

            # 将请求传递给 Scrapy 引擎
            yield next_page_request

通过使用 yield,我们可以实现异步的、逐步的数据处理和请求发送。当 Scrapy 引擎接收到一个请求对象时,它会根据请求对象的设置,发送网络请求并等待响应。一旦响应返回,引擎会根据请求对象的回调函数,调用相应的方法来处理数据。这种异步的处理方式可以提高爬取效率,并且节省内存的使用。

通过循环执行以上代码,可以持续进行爬取任务,直到最后一页为止。

技术总结

今天我们详细介绍了如何使用 Scrapy 库进行网络爬虫,这个强大的工具极大地提升了获取新闻、电商商品信息以及进行数据分析和挖掘的效率,希望对你有所启发。

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

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

相关文章

微服务学习资料

文章目录 参考资料一. 微服务概述1. CAP理论2. BASE理论3. SpringBoot 与 SpringCloud对比 二. 服务注册:Zookeeper,Eureka,Nacos,Consul1. Nacos两种健康检查方式?2. nacos中负责负载均衡底层是如何实现的3. Nacos原理4. 临时实例和持久化(非临时)实例 …

2023.8 - java - 多态

多态是同一个行为具有多个不同表现形式或形态的能力。 多态就是同一个接口,使用不同的实例而执行不同操作, 多态的优点 1. 可替换性2 可扩充性3. 接口性、灵活性、简化性4. 消除类型之间的耦合关系 多态存在的三个必要条件 继承重写父类引用指向子类…

基于SpringBoot实现MySQL与Redis的数据最终一致性

问题场景 在并发场景下,MySQL和Redis之间的数据不一致性可能成为一个突出问题。这种不一致性可能由网络延迟、并发写入冲突以及异常情况处理等因素引起,导致MySQL和Redis中的数据在某些时间点不同步或出现不一致的情况。数据一致性问题的级别可以分为三…

(java) 进程调度

目录 进程 首先我们要了解一下什么是进程? 那如何管理进程? PCB中比较重要的属性 进程调度 为什么要进行进程调度? 状态 优先级 上下文 拓展介绍一下寄存器 记账信息 进程 首先我们要了解一下什么是进程? 简单来说…

ubuntu 22.04 LTS openai triton 安装

第一种方法: pip install triton 第二种方法,安装最新的版本: pip install -U --index-url https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/Triton-Nightly/pypi/simple/ triton-nightly 第三种方法: git c…

优化器调整策略

损失函数的作用是衡量模型输出与真实标签的差异。当我们有了这个loss之后,我们就可以通过反向传播机制得到参数的梯度,那么我们如何利用这个梯度进行更新参数使得模型的loss逐渐的降低呢? 优化器的作用 Pytorch的优化器: 管理并…

echarts实现图表标签(label)可拖拽,以及保存拖拽后的位置

需求背景: 当echarts图表中像素点非常多,或者有像素点重合的时候,标签就会被覆盖或者重叠。为了解决这个问题,让用户体验更加友好,于是就实现了对label进行拖拽。用户可以把label拖拽到任何他想要的位置,并…

pandas由入门到精通-数据透视表

采集的数据存储后通常会分为多个文件或数据库,如何将这些文件按需拼接,或按键进行连接十分重要。这节将介绍数据索引的复杂操作如分层索引,stack,unstack,seet_index,reset_index等帮助重构数据,数据的拼接如merge,join,concat,combine_first等帮助连接数据,以及数据透视表…

【C++初阶】模拟实现list

👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:C航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&#x1…

Docker安装Jenkins实操记录

前置条件: 1、安装了docker 2、安装了java(没有安装情况下,可运行:yum install -y java-1.8.0-openjdk-devel.x86_64) 一、拉取镜像 1、docker pull jenkins/jenkins 2、mkdir -p /usr/local/jenkins 3、chmod 777 …

Ubuntu搭建CT_ICP里程计的环境暨CT-ICP部署

CT-ICP部署以及运行复现过程 0.下载资源,并按照github原网址的过程进行。1.查看所需要的各个部分的版本。2.安装clang编译器3.进行超级构建3.1标准进行3.2构建过程中遇到的问题 4.构建并安装CT-ICP库4.1标准进行4.2遇到的问题及解决办法 5.构建 CT-ICP 的 ROS 包装5…

python+mysql+前后端分离国内职位数据分析(源码+文档+指导)

系统阐述的是使用国内python职位数据分析系统的设计与实现,对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计,描述,实现和分析与测试方面来表明开发的过程。开发中使用了 Flask框架和MySql数据库技术搭建系统的整体…

深度学习算法模型转成算能科技平台xx.bmodel模型的方法步骤

目录 1 docker镜像下载 2 SDK下载 3 下载sophon-demo 4 修改docker镜像的脚本 5 创建个文件夹 6.source 7.转模型 1 docker镜像下载 可以在dockerhub看到镜像的相关信息 https://hub.docker.com/r/sophgo/tpuc_dev/tags 用下面的命令下载 docker pull sophgo/tpuc_d…

Vue2向Vue3过度Vuex状态管理工具快速入门

目录 1 Vuex概述1.是什么2.使用场景3.优势4.注意: 2 需求: 多组件共享数据1.创建项目2.创建三个组件, 目录如下3.源代码如下 3 vuex 的使用 - 创建仓库1.安装 vuex2.新建 store/index.js 专门存放 vuex3.创建仓库 store/index.js4 在 main.js 中导入挂载到 Vue 实例…

【微服务】04-Polly实现失败重试和限流熔断

文章目录 1. Polly实现失败重试1.1 Polly组件包1.2 Polly的能力1.3 Polly使用步骤1.4 适合失败重试的场景1.5 最佳实践 2.Polly实现熔断限流避免雪崩效应2.1 策略类型2.2 组合策略 1. Polly实现失败重试 1.1 Polly组件包 PollyPolly.Extensions.HttpMicrosoft.Extensions.Htt…

SMC_Interpolator2Dir反向插补运动

附加函数是: SMC_Interpolator2Dir_SlowTask 函数的位置: 输入: 运行 bExecute 【BOOL】 路径包 poqDataIn 指向SMC_OUTQUEUE的指针 停止 bSlow_Stop 停止BOOL 急停 bEmergency_Stop 紧急停止BOOL 单…

1. HBase中文学习手册之揭开HBase的神秘面纱

揭开Hbase的神秘面纱 1.1 欢迎使用 Apache Hbase1.1.1 什么是 Hbase?1.1.2 Hbase的前世今生1.1.3 HBase的技术选型?1.1.3.1 不适合使用 HBase的场景1.1.3.2 适合使用 HBase的场景 1.1.4 HBase的特点1.1.4.1 HBase的优点1.1.4.2 HBase的缺点 1.1.5 HBase设计架构 1.…

[JavaWeb]【九】web后端开发-SpringBootWeb案例(菜单)

目录 一、准备工作 1.1 需求 1.2 环境搭建 1.2.1 准备数据库&表 1.2.2 创建springboot工程 1.2.3 配置application.properties & 准备对应实体类 1.2.3.1 application.properties 1.2.3.2 实体类 1.2.3.2.1 Emp类 1.2.3.2.2 Dept类 1.2.4 准备对应的Mapper、…

Yolo系列-yolov2

YOLO-V2 更快!更强! YOLO-V2-BatchNormalization BatchNormalization(批归一化)是一个常用的深度神经网络优化技术,它可以将输入数据进行归一化处理,使得神经网络更容易进行学习。在YOLOv2中,B…

wxpython + cef 是优秀的 WebView 组件

CEF 即 (Chromium Embedded Framework);cef 是优秀的 WebView 组件。 pip install wxpython4.2 wxPython-4.2.0-cp37-cp37m-win_amd64.whl (18.0 MB) Successfully installed wxpython-4.2.0 pip install cefpython3 cefpython3-66.1-py2.py3-none-win_amd64.whl …