Scrapy入门教程实例

2023-11-01

Scrapy

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。

scrapy的整体框架如下所示:
这里写图片描述

Scrapy主要包含了以下几个组件:

  • 引擎(Scrapy):用来处理整个系统的数据流,触发事务(框架核心)。
  • 调度器(Scheduler):用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 它来决定下一个要抓取的网址是什么, 同时去除重复的网址
  • 下载器(Downloader):用于下载网页内容,并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
  • 爬虫(Spiders):爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
  • 项目管道(Pipeline):负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
  • 下载器中间件(Downloader Middlewares):位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
  • 爬虫中间件(Spider Middlewares):介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。
  • 调度中间件(Scheduler Middewares):介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。

Scrapy运行流程大概如下:

  1. 引擎从调度器中取出一个链接(URL)用于接下来的抓取
  2. 引擎把URL封装成一个请求(Request)传给下载器
  3. 下载器把资源下载下来,并封装成应答包(Response)
  4. 爬虫解析Response
  5. 解析出实体(Item),则交给实体管道进行进一步的处理
  6. 解析出的是链接(URL),则把URL交给调度器等待抓取

安装Scrapy命令:

pip install scrapy

第一个爬虫

1、进入到打算存储代码的目录中,运行下列命令,创建一个新的Scrapy项目。

scrapy startproject scrapydemo

命令会生成如下目录文件:
这里写图片描述

这些文件分别是:

  • scrapy.cfg: 项目的配置文件
  • scrapydemo/ :该项目的python模块,之后将在这里加入代码
  • items.py:项目中的items文件
  • middlewares.py:项目中的middlewares文件
  • pipelines.py:项目中的pipelines文件
  • setting.py:项目的设置文件
  • spiders/:放置spider代码的目录

接下来我们要爬取我另一篇博客的内容
https://blog.csdn.net/hampton_chen/article/details/52229327

通过以下命令进入该项目所在的目录,并在spiders目录下生成一个spider文件csdn.py:

cd scrapydemo
scrapy genspider csdn https://blog.csdn.net/hampton_chen/article/details/52229327

打开该博客文章如下,我们这次主要抓取文件的标题、发布时间和阅读数
这里写图片描述

2、编写items.py文件:
在items.py文件中定义我们要抓取的数据:

import scrapy

class ScrapydemoItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    time = scrapy.Field()
    read_count = scrapy.Field()

3、实现Pipelines
Pipeline用来对spider返回的item列表进行数据的保存等操作,可以写入文件或保存到数据库,这里我只是将数据打印出来。
代码如下:

class ScrapydemoPipeline(object):
    def process_item(self, item, spider):
        print('======================')
        text = "标题:" + item['title'] +"\n发布时间:" + item['time'] + "\n" + item['read_count']
        print(text)
        print('======================')
        return item

4、修改settings配置

BOT_NAME = 'scrapydemo'
SPIDER_MODULES = ['scrapydemo.spiders']
NEWSPIDER_MODULE = 'scrapydemo.spiders'

上面三行是系统自动配置的,不需要修改,我们主要添加下列代码:

USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'
ITEM_PIPELINES = {
   'scrapydemo.pipelines.ScrapydemoPipeline': 300,
}

5、实现spider
在实现spider之前,我们需要通过浏览器打开我们要抓取的目标网站,通过F12打开页面调试窗口,找到我们要抓取的数据对应的element,如下图:
这里写图片描述
这里写图片描述

Spider是一个继承自scrapy.contrib.spiders.CrawlSpider的Python类,有三个必需的定义的成员

name: 名字,这个spider的标识,在爬虫项目中是唯一的

start_urls:一个url列表,spider从这些网页开始抓取

parse():一个方法,当start_urls里面的网页抓取下来之后需要调用这个方法解析网页内容,同时需要返回下一个需要抓取的网页,或者返回items列表

所以在spiders目录下新建一个spider,csdn.py:

# -*- coding: utf-8 -*-
import scrapy
from scrapydemo.items import ScrapydemoItem

class CsdnSpider(scrapy.Spider):
    name = "csdn"
    allowed_domains = ["blog.csdn.net"]
    start_urls = ['https://blog.csdn.net/hampton_chen/article/details/52229327/']

    def parse(self, response):
        item = ScrapydemoItem()

        item['title'] = response.xpath('//h1[@class="title-article"]/text()').extract()[0]
        item['time'] = response.xpath('//span[@class="time"]/text()').extract()[0]
        item['read_count'] = response.xpath('//span[@class="read-count"]/text()').extract()[0]

        yield item

至此代码已经写完,接下来就是如何启动爬虫。

启动爬虫

运行程序有两种方法:
1、直接命令行启动
进入到项目的根目录下,执行下列命令:

scrapy crawl csdn

2、新建一个.py文件,写入启动命令,例如run.py:

# -*- coding: utf-8 -*-
from scrapy.cmdline import execute
execute(['scrapy', 'crawl', 'csdn'])

注意:crawl后面跟的是spider的name,不是项目名

执行命令得到结果如下图所示:
这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scrapy入门教程实例 的相关文章

  • 如何从Python请求库正确返回http响应(想要一个Python反向代理)

    这个问题继续自here https stackoverflow com questions 48635552 how to programmatically communicate with apache 我想创建一个反向代理 它允许我托管
  • 安装 Pillow 和 PIL

    I have Ubuntu 12 04 http en wikipedia org wiki List of Ubuntu releases Ubuntu 12 04 LTS 28Precise Pangolin 29 Precise Pa
  • 是否有与 Java 的 IdentityHashMap 等效的 Python 版本?

    我正在遍历一个数据结构 想要构建一个映射 X gt Y 的字典 其中 X 是我正在遍历的数据结构中的一个字段 Y 是我正在动态构建的数据结构中的一个字段 X 是不可散列的类型 Java的IdentityHashMap的目的是模拟动态字段 由
  • Pandas groupby:根据另一列中的值更改一列中的值

    我会尽力解释我的问题 但我是 Pandas 新手 所以请耐心等待 我有一个 Pandas 数据框df Random ID Seq ID Type Seq Token 0 8 1 User First 1 8 2 Agent Second 2
  • 将 Python 脚本导入另一个脚本?

    我正在阅读 Zed Shaw 的 艰难学习 Python 正在学习第 26 课 在本课中 我们必须修复一些代码 这些代码从另一个脚本调用函数 他说我们不必导入它们来通过测试 但我很好奇我们将如何做到这一点 课程链接 http learnpy
  • 为什么tcl/tkinter只支持BMP字符?

    我正在尝试在基于 tkinter 和 tcl 构建的 gui 中查询和显示 utf 8 编码字符 但是 我发现 tkinter 无法显示 4 字节字符 即大于 U FFFF 的 unicode 代码点 为什么会这样呢 实现非 BMP 字符对
  • 如何在 PyCharm 社区版中运行 Django 项目的调试服务器?

    有人在 PyCharm 社区版中为 Django 项目设置调试配置时遇到问题吗 IDE 的社区版缺少项目设置中的项目类型选项 然后当我设置 调试 或 运行配置 时 它会要求我提供应该运行的脚本 Django 需要什么脚本 manage py
  • 测试 python 列表的所有元素是否为 False

    如何返回False如果所有元素都在列表中False 给定的列表是 data False False False Using any https docs python org 2 library functions html any gt
  • 忽略 NaN 的列表理解

    我正在尝试构建一个列表理解 其条件是不导入 nan 值 但运气不佳 以下是当前代码以及结果输出 什么条件会将 nan 从列表中删除 def generate labels filtered df columnName return labe
  • Django:在管理界面中显示多对多项目的列表

    这可能是一个简单的问题 但我似乎无法理解 我在 models py 中有两个简单的模型 Service 和 Host Host services 与 Service 具有 m2m 关系 换句话说 一台主机有多个服务 一个服务可以驻留在多个主
  • 使用 Python 访问 MP3 音乐数据

    我正在尝试编写一个 Python 脚本 用于使用歌曲的数据作为比较的基础来搜索重复的 mp3 4 文件 我的情况涉及许多文件名相似但 ID3 标签不同的 mp3 4 文件 起初 我尝试循环并使用 md5 来查找重复文件 忽略文件名 当然 当
  • 如何获取 Flask 中当前的基本 URI? [复制]

    这个问题在这里已经有答案了 在下面的代码中 我想将 URL 存储在变量中以检查发生 URL 错误的错误 app route flights methods GET def get flight flight data mongo db fl
  • 如何为 matplotlib 中已绘制的线设置标签?

    在我的代码中我已经执行了 ax plot x y b 并且需要能够在事后设置相应行的标签 以达到与我相同的效果 ax plot x y b label lbl 有没有办法在 Matplotlib 中做到这一点 如果你抓住了line2D创建对
  • 合法 .xlsx 文件上的 openpyxl load_workbook() 会导致 zipfile.BadZipFile 错误

    我试图做的是将数据帧数据附加到现有的合法 Excel 文件中 我使用了 openpyxl 中的 load workbook 函数 但它系统地返回错误 这是一些在我的机器上崩溃的代码 from openpyxl import load wor
  • 无法使用 pandas 获取平均日期

    我有一个时间序列数据集 我想从中获取平均日期 这是一个人为的示例 显示 pandas datetime64 对象的溢出错误 import pandas as pd import numpy as np rng pd date range 2
  • python - 从完整地址获取邮政编码

    我有一个数据框 其中一列中有完整地址 我需要创建一个仅包含邮政编码的单独列 有些地址只有五位数字的邮政编码 而其他地址则有额外的四位数字 如何拆分列以获取邮政编码 示例数据 d name bob john address 123 6th S
  • Discord-py Rewrite - Cog 中的基本 aiohttp Web 服务器

    我正在尝试将基本的 aiohttp 网络服务器集成到 Cog 中 使用 discord py 重写 我对齿轮使用以下代码 from aiohttp import web import discord from discord ext imp
  • 为文件中的每个单词创建字典并计算其后面的单词的频率

    我正在尝试解决一个难题 却迷失了方向 这就是我应该做的 INPUT file OUTPUT dictionary Return a dictionary whose keys are all the words in the file br
  • Django MySQL 创建表时出错

    我有一个类似的问题这张票 https code djangoproject com ticket 18256在 Django 论坛上提出 我该如何解决这个问题 我还扩展了一个用户模型 如下所示 class Profile models Mo
  • Bokeh 中的相关图问题

    当我通过绘制数据时rect 来自 Bokeh 我在可视化中得到了一条由水平块组成的单行 数据打印正确 据我所知格式正确 type 验证它们都是列表 谁能诊断这个吗 如果问题不在这里 那么我可以附加更多代码 如果需要 在 Ubuntu 14

随机推荐

  • 【Web3 系列开发教程——创建你的第一个 NFT(6)】为 NFT 设置价格

    我想作为 NFT 的创建者 你可能有意将你的 NFT 出售给你的 NFT 爱好者 为此 我们需要为 NFT 定价 一般有两种主要的定价方式 在智能合约内定价 本文所讲 在 NFT 市场或平台上列出你的 NFT 更流行的方法 在智能合约内设置
  • 03-Mybatis增删改查的简单功能实现

    增删改查的实现 在上文中已经建立了mybatis的环境 并且创建了UserMapper xml userMapper 并且完成了一个简单的查询操作 已经可以成功的运行 环境可以正常的跑起来了 下面对整个数据库的基础操作 增删改查的代码进行编
  • elementUI+Vue+json-server做简单的文章后台管理

    elementUI Vue json server做简单的文章后台管理 最近刚接触elementUI不久 为了加深学习理解 便利用elementUI做了个简单练习 在CSDN上写记录一下学习过程 顺便整理回顾一下整个过程 创建项目 vue
  • Android Broadcast注册、发送、接收流程随笔

    Broadcast的注册过程 要动态注册广播 需要调用registerReceiver方法 它在ContextWrapper中实现 会调用mBase registerReceiver方法 mBase具体指向ContextImpl regis
  • java技术总结

    1 js 中正则表达式写法 var 注意不要加引号 加了引号就是一个字符串 不加引号才是正则对象 var new RegExp 此处不可以有 等效于Java写法 2 关于jquery中的 1 是jquery类 的别称 相当于java中的ob
  • 攻防世界web新手-simple_php

    文章目录 XCTF simple php 知识点 源码分析 解题思路 XCTF simple php 题目编号 GFSJ0485 知识点 本题主要考察php的弱类型比较 源码分析
  • 华为鸿蒙系统无缝更新,华为鸿蒙系统已陆续推送! 安卓系统可无缝升级: 升级包容量高达6GB...

    相信大家都知道 自从华为手机业务遭受到芯片断供危机以后 也是直接将会把重点放在软件系统层面 很多花粉们都纷纷期待 华为鸿蒙OS系统早日转正的一天 而华为终端CEO余承东表示 华为鸿蒙OS系统将会在四月份迎来首次推送升级 而华为Mate X2
  • python split(),os.path.split()和os.path.splitext()函数用法

    文章来源 https blog csdn net T1243 3 article details 80170006 coding utf 8 author lei import os os path join 将分离的部分合成一个整体 fi
  • 订单枚举实例

    摘要 订单状态 public enum OrderState 摘要 不限制 All 0 摘要 待付款 UnPaid 1 摘要 已取消 Cancel 2 摘要 待确认 Process 3
  • 【Linux】网络层 — IP协议

    Linux 博客主页 一起去看日落吗 分享博主的在Linux中学习到的知识和遇到的问题 博主的能力有限 出现错误希望大家不吝赐教 分享给大家一句我很喜欢的话 看似不起波澜的日复一日 一定会在某一天让你看见坚持的意义 祝我们都能在鸡零狗碎里找
  • ServerSocket实现超简单HTTP服务器

    1 相关知识简介 HTTP协议 HTTP是常用的应用层协议之一 是面向文本的协议 HTTP报文传输基于TCP协议 TCP协议包含头部与数据部分 而HTTP则是包含在TCP协议的数据部分 如下图 HTTP报文本质上是一个TCP报文 数据部分携
  • librdkafka的安装和使用

    安装 下载https github com edenhill librdkafka 预备环境 The GNU toolchain GNU make pthreads zlib optional for gzip compression su
  • SSL连接的JAVA实现

    SSL连接分为双向认证和单向认证 其中双向认证表示服务器和客户端都需要分别校验对方的身份 单向认证则只需要客户端校验服务器的身份 SSL的双向认证的流程如下图 从以上流程可见 要完成双向认证 服务器端和客户端都需要验证对方的证书 然后再进行
  • Android configChanges属性和configChanges()方法总结

    简介 在Android系统默认的情况下 Configuration改变都会销毁并重建当前Activity 例如当 屏幕方向 或 键盘显示隐藏 变化时 如果不希望重新创建Activity实例 可以在manifest xml文件中可以指定参数a
  • 2019年数学建模美赛经验总结

    北京时间2019年1月29号上午9时 数模美赛结束 美赛结束已经10多天了 我在这次竞赛中负责建模和编程 趁现在记忆还比较清晰 写下这篇博客记录第一次参加数学建模美赛的经历 补更 2019年4月20日公布成绩 笔者最终获得了美赛一等奖 目录
  • 主流加密方式和工具比较

    相关术语 缩写 全称 描述 CryFS CryFS 一种安全的文件加密的工具 Fuse框架 Filesystem In UserSpace 一个实现在用户空间的文件系统框架 loop loop 像块设备一样访问一个文件 dev mapper
  • 字符串压缩(三)之短字符串压缩

    一 通用算法的短字符压缩 开门见山 我们使用一段比较短的文本 Narrator It is raining today So Peppa and George cannot play outside Peppa Daddy it s sto
  • 直接使用ip和数据库实例名登录PL/SQL

    以往我一直以为登录PLSQL的时候 除了固定的用户密码以外 需要先用ORACLE的客户端配置本地服务 然后再登录PLSQL的时候 DataBase选项选择配置的本地服务名 今天因为一位同事的win10机器无法安装oracle客户端 因此 在
  • Hive 常用DML操作

    一 加载文件数据到表 1 1 语法 LOAD DATA LOCAL INPATH filepath OVERWRITE INTO TABLE tablename PARTITION partcol1 val1 partcol2 val2 L
  • Scrapy入门教程实例

    Scrapy Scrapy是一个为了爬取网站数据 提取结构性数据而编写的应用框架 可以应用在包括数据挖掘 信息处理或存储历史数据等一系列的程序中 scrapy的整体框架如下所示 Scrapy主要包含了以下几个组件 引擎 Scrapy 用来处