网络爬虫框架Scrapy的入门使用

news2024/11/13 10:15:47

Scrapy的入门使用

  • Scrapy
    • 概述
    • 引擎(Engine)
    • 调度器(Scheduler)
    • 下载器(Downloader)
    • Spider
    • Item Pipeline
  • 基本使用
    • 安装scrapy
    • 创建项目
    • 定义Item数据模型对象
    • 创建爬虫(Spider)
    • 管道pipeline来保存数据
    • 启动爬虫
  • 其他
    • 解析函数对象
    • 实现多请求
  • scrapy终端(Scrapy shell)
    • 启动终端
    • 可用Scrapy对象
    • 快捷命令

Scrapy

概述

Scrapy是一个用Python编写的开源网络爬虫框架,专门设计用于快速、高效地提取网站数据。它提供了一整套工具和库,可以帮助开发人员创建和管理网络爬虫,用于抓取特定网站的数据并进行处理。

英文文档:https://docs.scrapy.org/en/latest/

GitHub:https://github.com/scrapy/scrapy

中文文档:https://scrapy-chs.readthedocs.io/zh_CN/latest/

Scrapy是一个基于Python的Web爬虫框架,由多个组件组成,包括了引擎(Engine)、调度器(Scheduler)、下载器(Downloader)、Spider、Item Pipeline等。

引擎(Engine)

引擎是Scrapy的核心组件之一,负责调度和协调各个组件的工作。它接收Spider返回的初始请求,并将其传递给调度器,再由调度器根据一定的策略进行调度,最终将请求发送给下载器进行下载。在下载器将响应内容返回后,引擎将调用Spider的回调函数进行处理,再将处理后的数据交给Item Pipeline进行处理。

调度器(Scheduler)

调度器负责对Spider的请求进行调度,决定请求的顺序和时间。它维护了一个请求队列,并根据一定的调度策略,将请求传递给下载器进行下载。在下载完成后,调度器将下载器返回的响应对象传递给Spider进行处理。

下载器(Downloader)

下载器负责从互联网上下载页面和资源。它接收调度器传递的请求对象,并根据请求中的URL和请求头信息进行下载。下载器可以通过设置代理、Cookies和请求头等信息,模拟浏览器的行为,避免被服务器拒绝访问。在下载完成后,下载器将响应对象返回给调度器。

Spider

Spider是用户编写的爬虫代码,定义了如何爬取和处理页面数据。它通过yield关键字返回请求对象或者Item对象,并可以定义一个或多个回调函数,在下载器返回响应对象后进行解析和处理。Spider可以通过设置start_urls或者start_requests方法返回一个或多个初始请求对象。

Item Pipeline

Item Pipeline负责处理Spider返回的Item对象,可以对数据进行过滤、清理、验证等操作。它将Item对象传递给一系列的管道处理器,每个管道处理器可以对Item对象进行一些处理操作,然后将处理后的Item对象传递给下一个管道处理器。在最后一个管道处理器处理完成后,Item Pipeline将Item对象输出到文件或者数据库中。

基本使用

安装scrapy

pip install scrapy

查看帮助命令

> scrapy --help
Scrapy 2.8.0 - no active project

Usage:
  scrapy <command> [options] [args]

Available commands:
  bench         Run quick benchmark test
  fetch         Fetch a URL using the Scrapy downloader
  genspider     Generate new spider using pre-defined templates
  runspider     Run a self-contained spider (without creating a project)
  settings      Get settings values
  shell         Interactive scraping console
  startproject  Create new project
  version       Print Scrapy version
  view          Open URL in browser, as seen by Scrapy

  [ more ]      More commands available when run from project directory

Use "scrapy <command> -h" to see more info about a command

创建项目

scrapy startproject 项目名称

会在当前目录下创建一个名为project_name的目录,包含了Scrapy项目的基本结构。
在这里插入图片描述
项目目录结构:

scrapy.cfg: 项目的配置文件

demo: 项目的python模块,之后将在此加入代码

demo/spiders/: 爬虫组件目录

demo/items.py: 定义数据模型

demo/middlewares.py: 自定义中间件

demo/pipelines.py: 自定义管道,保存数据

demo/settings.py: 爬虫配置信息

定义Item数据模型对象

Item是保存爬取到的数据的容器。通过创建一个 scrapy.Item 类, 并且定义类型为scrapy.Field的类属性来定义一个Item

定义item即提前规划好哪些字段需要抓,防止在爬取数据过程中写错。

配合注释一起可以清晰的知道要抓取哪些字段,

数据模型对象类定义以后需要在爬虫中导入并且实例化,使用方法和使用字典相同

在items.py中定义模型对象,定义要提取的字段:

import scrapy

class DemoItem(scrapy.Item):
	# 标题
    title = scrapy.Field()
    # 数量
    count = scrapy.Field()

在这里插入图片描述

创建爬虫(Spider)

Spider是编写用于从单个网站(或者一些网站)爬取数据的类。其包含一个用于下载的初始URL,如何跟进网页中的链接以及如何分析页面中的内容, 提取生成 item 的方法。

创建一个Spider,必须继承scrapy.Spider类, 且定义一些属性、方法:

name:

用于区别Spider。 该名字必须是唯一的,不可以为不同的Spider设定相同的名字。

start_urls:

包含Spider在启动时进行爬取的url列表。 因此,第一个被获取到的页面将是其中之一。 后续的URL则从初始的URL获取到的数据中提取。

parse() :

parse()是spider的一个方法。 被调用时,每个初始URL完成下载后生成的Response对象将会作为唯一的参数传递给该函数。 该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。

demo/spiders目录下创建demospider.py文件,需要定义一个Spider类,继承自scrapy.Spider类,并重写start_requests()parse()方法。

import scrapy

from demo.items import DemoItem


# 继承自爬虫类
class DemospiderSpider(scrapy.Spider):
    # 定义爬虫名称
    name = "demospider"
    # 设置允许爬取的范围
    allowed_domains = ["www.runoob.com"]
    # 设置开始爬取的请求地址
    start_urls = ["https://www.runoob.com/"]

    # 实现解析函数,提取数据或者提取URL,并提交给引擎
    def parse(self, response):
    	# scrapy的response对象可以直接进行xpath
        list = response.xpath('/html/body/div[4]/div/div[2]/div/h2/text()').extract()
        print("--------------------------------")
        index = 1
        for title in list:
            div = "div[" + str(index) + "]"
            index = index + 1
            count = response.xpath('/html/body/div[4]/div/div[2]/' + div + '/a/h4/text()').extract()

            item = DemoItem()
            item['title'] = title
            item['count'] = len(count)
            # 提交数据给引擎
            # yield能够传递的对象只能是:BaseItem, Request, dict, None
            yield item

使用命令方式可以快速创建一个爬虫编写的基本结构

cd 项目目录

scrapy genspider 爬虫名称 允许域名

>scrapy genspider demospider www.runoob.com
Created spider 'demospider' using template 'basic' in module:
  demo.spiders.demospider

在这里插入图片描述

管道pipeline来保存数据

数据在被抓取后,被发送到管道,接着进行管道操作,比如:

清理 HTML 数据

验证抓取的数据(检查项目是否包含某些字段)

检查重复项(并删除它们)

将抓取的项目存储在数据库中

在运行爬虫时添加 -o参考可以将数导出

scrapy crawl 爬虫名称 -o 导出文件

在pipelines.py文件中创建DemoPipeline管道类,打印爬虫的parse() 方法提取的数据

class DemoPipeline:
	# 爬虫文件中提取数据的方法每yield一次item,就会运行一次
    def process_item(self, item, spider):
        print("title: {} , count: {}".format(item['title'], item['count']))
        return item

在这里插入图片描述

完整管道实现如下:

# 1.在pipelines.py中编写管道实现

# 2.定义管道类
class DemoPipeline:
    # 3.必须实现process_item(self,item,spider),在管道接收数据对象时回调,用于接收和处理每个数据对象
    def process_item(self, item, spider):
        print("title: {} , count: {}".format(item['title'], item['count']))
        return item

    # 4.可选实现

    def open_spider(self, spider):
        print("爬虫启动时回调,用于初始化操作")

    def close_spider(self, spider):
        print("爬虫关闭时回调,用于释放操作")

接着在settings.py中开启管道

配置项中键为使用的管道类,参数的值是一个权重,越小越优先执行

ITEM_PIPELINES = {
    "demo.pipelines.DemoPipeline":1
}

注意事项:

在管道实现函数中process_item必须有返回值,传递给下一个管道

多管道实现时可以通过类型判断或爬虫名称判断区分存储的数据

启动爬虫

在命令行中,进入目录,并输入以下命令,运行Spider:

scrapy crawl 爬虫名称

scrapy crawl demospider

控制台打印了爬虫提取数据日志与管道保存数据日志,如下所示:

--------------------------------
title:  HTML / CSS , count: 9
2023-02-22 14:07:26 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.runoob.com/>
{'count': 9, 'title': ' HTML / CSS'}
title:  JavaScript , count: 18
2023-02-22 14:07:26 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.runoob.com/>
{'count': 18, 'title': ' JavaScript'}
title:  服务端 , count: 26
2023-02-22 14:07:26 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.runoob.com/>

其他

解析函数对象

response对象

response响应对象封装从互联网上返回的响应,具有如下常用属性

response.url:当前响应的url地址

response.request.url:当前响应对应的请求的url地址

response.headers:响应头

response.requests.headers:当前响应的请求头

response.body:响应体,也就是html代码,byte类型

response.status:响应状态码

Selector对象

Selector对象封装数据操作的对象

xpath:可以使用 xpath 提取数据,返回 SelectorList 对象

css:可以使用 css 样式选择器提取数据,返回 SelectorList 对象

extract:从selector对象中提取内容

SelectorList对象

返回 Selector 对象的合集

extract_first :取列表中第一个元素的内容,如果元素不存在返回 None
	
extract :提取列表中selector对象中所有内容

提交数据给引擎

使用关键词 yield,在爬虫组件的解析函数中提交数据给引擎

提交数据类型:BaseItem、Request、dict、None

def parse(self,response):
  ...
  item = {}
  item["data"] = "数据"
  yield item

实现多请求

构造Request对象,继续发送请求,从而实现多请求

scrapy.Request构建方式

scrapy.Request(url[,callback,method="GET",headers,body,cookies,meta,dont_filter=False])

注意:中括号里的参数为可选参数,具体意思如下:

callback: 表示当前的url的响应交给哪个函数去处理

method:指定POST或GET请求

headers:接收一个字典,其中不包括cookies

cookies:接收一个字典,专门放置cookies

body:接收json字符串,为POST的数据,发送payload_post请求时使用

meta: 实现数据在不同的解析函数中传递,meta默认带有部分数据,比如下载延迟,请求深度等

dont_filter: 默认会过滤请求的url地址,即请求过的url地址不会继续被请求,对需要重复请求的url地址可以把它设置为Ture

meta的作用:meta可以实现数据在不同的解析函数中的传递

meta参数的使用

利用meta参数在不同的解析函数中传递数据

def parse(self,response):
    ...
    yield scrapy.Request(detail_url, callback=self.parse_detail,meta={"item":item})
	...

def parse_detail(self,response):
    # 获取传入的item
    item = resposne.meta["item"]

使用关键词 yield,提交请求给引擎

    # 实现解析函数,提取数据或者提取URL,并提交给引擎
    def parse(self, response):
        for title in response.xpath('//title').getall():
            item = DemoItem()
            item['title'] = title
            yield item

        for href in response.xpath('//a/@href').getall():
            yield scrapy.Request(response.urljoin(href), self.parse)

scrapy终端(Scrapy shell)

Scrapy终端是一个交互终端,在未启动spider的情况下尝试及调试爬取代码,如用来测试XPath或CSS表达式

启动终端

scrapy shell

scrapy shell 爬取地址

scrapy shell www.runoob.com

可用Scrapy对象

Scrapy终端根据下载的页面会自动创建一些方便使用的对象

[s] Available Scrapy objects:
[s]   scrapy     scrapy module (contains scrapy.Request, scrapy.Selector, etc)
[s]   crawler    <scrapy.crawler.Crawler object at 0x00000114BB2603A0>
[s]   item       {}
[s]   request    <GET http://www.runoob.com>
[s]   response   <200 https://www.runoob.com/>
[s]   settings   <scrapy.settings.Settings object at 0x00000114BB260940>
[s]   spider     <DemospiderSpider 'demospider' at 0x114bb6f6dc0>
[s] Useful shortcuts:
[s]   fetch(url[, redirect=True]) Fetch URL and update local objects (by default, redirects are followed)
[s]   fetch(req)                  Fetch a scrapy.Request and update local objects
[s]   shelp()           Shell help (print this help)
[s]   view(response)    View response in a browser

快捷命令

shelp() - 打印可用对象及快捷命令的帮助列表
fetch(request_or_url) - 根据给定的请求(request)或URL获取一个新的response,并更新相关的对象
view(response) - 在本机的浏览器打开给定的response
>>> fetch(request)
2023-02-22 15:52:11 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (302) to <GET https://www.runoob.com/> from <GET http://www.runoob.com>
2023-02-22 15:52:11 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.runoob.com/> (referer: None)

>>> view(response)
True

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

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

相关文章

Netty核心原理剖析与RPC实践6-10

Netty核心原理剖析与RPC实践6-10 06-粘包拆包问题&#xff1a;如何获取一个完整的网络包 本节课开始我们将学习 Netty 通信过程中的编解码技术。编解码技术这是实现网络通信的基础&#xff0c;让我们可以定义任何满足业务需求的应用层协议。在网络编程中&#xff0c;我们经常…

高风险IP来自哪里:探讨IP地址来源及其风险性质

在网络安全领域&#xff0c;高风险IP地址是指那些可能涉及恶意活动或网络攻击的IP地址。了解这些高风险IP地址的来源可以帮助网络管理员更好地识别和应对潜在的安全威胁。本文将探讨高风险IP地址的来源及其风险性质&#xff0c;并提供一些有效的应对措施。 风险IP查询&#xf…

Sourcetree如何解决冲突和重置

解决冲突&#xff1a;找到冲突的文件然后点恢复&#xff08;其实是丢弃的意思&#xff09; 重置回某个分支节点&#xff1a;

HTTP——Cookie

HTTP——Cookie 什么是Cookie通过Cookie访问网站 我们之前了解了HTTP协议&#xff0c;如果还有小伙伴还不清楚HTTP协议&#xff0c;可以点击这里&#xff1a; https://blog.csdn.net/qq_67693066/article/details/136895597 我们今天来稍微了解一下HTTP里面一个很小的部分&…

Redis中的LRU算法分析

LRU算法 概述 Redis作为缓存使用时&#xff0c;一些场景下要考虑内容的空间消耗问题。Redis会删除过期键以释放空间&#xff0c;过期键的删除策略 有两种: 1.惰性删除:每次从键空间中获取键时&#xff0c;都检查取得的键是否过期&#xff0c;如果过期的话&#xff0c;就删除…

Adobe最近推出了Firefly AI的结构参考以及面向品牌的GenStudio

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Rust编程(四)PackageCrateModule

这一部分的中文教程/文档都很混乱,翻译也五花八门,所以我建议直接看英文官方文档,对于一些名词不要进行翻译,翻译只会让事情更混乱,本篇从实战和实际需求出发,讲解几个名称的关系。 Module & Crate & Package & Workspace 英文中的意思: Cargo:货物 Crate:…

Apache HBase(二)

目录 一、Apache HBase 1、HBase Shell操作 1.1、DDL创建修改表格 1、创建命名空间和表格 2、查看表格 3、修改表 4、删除表 1.2、DML写入读取数据 1、写入数据 2、读取数据 3、删除数据 2、大数据软件启动 一、Apache HBase 1、HBase Shell操作 先启动HBase。再…

【已修复】iPhone13 Pro 长焦相机水印(黑斑)修复 洗水印

iPhone13 Pro 长焦相机水印&#xff08;黑斑&#xff09;修复 洗水印 问题描述 iPhone13 Pro 后摄3倍相机有黑色斑点&#xff08;水印&#xff09;&#xff0c;如图所示&#xff0c; 后摄相机布局如图所示&#xff0c; 修复过程 拆机过程有风险&#xff0c;没有把握最好不要…

【算法刷题 | 二叉树 05】3.28(左叶子之和、找树 左下角的值)

文章目录 11.左叶子之和11.1问题11.2解法一&#xff1a;递归11.2.1递归思路11.2.2代码实现 11.3解法二&#xff1a;栈11.3.1栈思想11.3.2代码实现 12.找树左下角的值12.1问题12.2解法一&#xff1a;层序遍历 11.左叶子之和 11.1问题 给定二叉树的根节点 root &#xff0c;返回…

2.4 比较检验 机器学习

目录 常见比较检验方法 总述 2.4.1 假设检验 2.4.2 交叉验证T检验 2.4.3 McNemar 检验 接我们的上一篇《性能度量》&#xff0c;那么我们在某种度量下取得评估结果后&#xff0c;是否可以直接比较以评判优劣呢&#xff1f;实际上是不可以的。因为我们第一&#xff0c;测试…

基于强化学习的带落角约束的制导律研究

源自&#xff1a;航空尖兵 作者&#xff1a;康冰冰 姜涛 曹建 魏晓晴 “人工智能技术与咨询” 发布 摘 要 针对以特定角度攻击面目标的制导律设计问题,采用深度确定性策略梯度算法构建强化学习制导律模型,设计了模型状态、奖励规则及制导环境。通过设定不同的初始条件和…

速通数据结构第三站 单链表

系列文章目录 速通数据结构与算法系列 1 速通数据结构与算法第一站 复杂度 http://t.csdnimg.cn/sxEGF 2 速通数据结构与算法第二站 顺序表 http://t.csdnimg.cn/WVyDb 感谢佬们支持&#xff01; 目录 系列文章目录 前言一、单链表 1 结构体 …

YOLOv8改进 | 检测头篇 | 2024最新HyCTAS模型提出SAttention(自研轻量化检测头 -> 适用分割、Pose、目标检测)

一、本文介绍 本文给大家带来的改进机制是由全新SOTA分割模型(Real-Time Image Segmentation via Hybrid Convolutional-TransformerArchitecture Search)HyCTAS提出的一种SelfAttention注意力机制,论文中叫该机制应用于检测头当中(论文中的分割效果展现目前是最好的)。我…

为什么我的微信小程序 窗口背景色backgroundColor设置参数 无效的问题处理记录!

当我们在微信小程序 json 中设置 backgroundColor 时&#xff0c;实际在电脑的模拟器中根本看不到效果。 这是因为 backgroundColor 指的窗体背景颜色&#xff0c;而不是页面的背景颜色&#xff0c;即窗体下拉刷新或上拉加载时露出的背景。在电脑的模拟器中是看不到这个动作的…

百度智能云千帆,产业创新新引擎

本文整理自 3 月 21 日百度副总裁谢广军的主题演讲《百度智能云千帆&#xff0c;产业创新新引擎》。 各位领导、来宾、媒体朋友们&#xff0c;大家上午好。很高兴今天在石景山首钢园&#xff0c;和大家一起沟通和探讨大模型的发展趋势&#xff0c;以及百度最近一段时间的思考和…

快速上手Spring Cloud 七:事件驱动架构与Spring Cloud

快速上手Spring Cloud 一&#xff1a;Spring Cloud 简介 快速上手Spring Cloud 二&#xff1a;核心组件解析 快速上手Spring Cloud 三&#xff1a;API网关深入探索与实战应用 快速上手Spring Cloud 四&#xff1a;微服务治理与安全 快速上手Spring Cloud 五&#xff1a;Spring …

Prometheus +Grafana +node_exporter可视化监控Linux + windows虚机

1、介绍 待补充 2、架构图 Prometheus &#xff1a;主要是负责存储、抓取、聚合、查询方面。 node_exporter &#xff1a;主要是负责采集物理机、中间件的信息。 3、搭建过程 配置要求&#xff1a;1台主服务器 n台从服务器 &#xff08;被监控的linux或windows虚机&am…

【APP_TYC】数据采集案例天眼APP查_查壳脱壳反编译_③

是不是生活太艰难 还是活色生香 我们都遍体鳞伤 也慢慢坏了心肠 你得到你想要的吗 换来的是铁石心肠 可曾还有什么人 再让你幻想 &#x1f3b5; 朴树《清白之年》 查壳 工具介绍Frida-dexDump Frida-dexDump简介 Frida-dexDump是基于Frida的一个工具&…

python(一)网络爬取

在爬取网页信息时&#xff0c;需要注意网页爬虫规范文件robots.txt eg:csdn的爬虫规范文件 csdn.net/robots.txt User-agent: 下面的Disallow规则适用于所有爬虫&#xff08;即所有用户代理&#xff09;。星号*是一个通配符&#xff0c;表示“所有”。 Disallow&…