首页 > 其他分享 >针对于 Scrapy 爬虫框架的搭建与解析

针对于 Scrapy 爬虫框架的搭建与解析

时间:2023-07-19 15:01:03浏览次数:42  
标签:spider demo py Scrapy 爬虫 scrapy 解析

Scrapy

pip install scrapy

1、Scrapy 爬虫框架

爬虫框架:

  • 爬虫框架是实现爬虫功能的一个软件结构和功能组件集合。
  • 爬虫框架是一个半成品,能够帮助用户实现专业的网络爬虫。

解析Scrapy爬虫框架:

Scrapy 爬虫框架包含 ”5 +2“ 结构,他有五个主模块以及两个中间键构成。

engine 模块:整个框架的中心,控制整个模块的数据流,任何模块之间的数据流动,都要通过ENGINE模块来完成调度。

downloader 模块:根据请求下载网页。

scheduler 模块:对于所有的爬取请求进行调度管理。

engine-----downloader 中间键:downloader Middleware ,对于 engine,scheduler 和 downloader 之间进行用户可配置的控制。用户可以编写配置代码,对请求 request 或者 response 进行修改、丢弃或者新增。

spider 模块:解析 downloader 返回的响应,产生爬取项,以及产生额外的爬取请求。

item pipelines 模块:以流水线的方式处理 spider 产生的爬取项,由一组操作顺序组成,类似流水线,每个操作是一个item pipeline 类型,可能操作包括:清理、检验和查重爬取项中的 html 数据,将数据存储到数据库。

spider-----engine 中间键:对 spider 产生的请求和爬取项再处理,用户可以在这里编写配置代码,对请求和爬取项进行修改,丢弃,新增的操作。

2、Requests VS Scrapy

相同点:

  • 两个库都可以进行页面的请求和爬取,Python 爬虫的两个重要技术路。
  • 两个库的可用性都比较好,文档丰富,入门简单。
  • 两者都没有处理 js,提交表单,应对验证码等功能(可扩展)。

不同点

3、Scrapy 爬虫的常用命令

C:\Users\LENOVO>scrapy -h
Scrapy 2.9.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 采用命令行来创建和运行爬虫,因为命令行相对比图形界面更容易自动化,适合脚本控制。本质上,Scrapy 是给程序员使用的。

4、Scrapy 爬取实例

爬取目标:http://python123.io/ws/demo.html

程序结构设计:

  1. 建立一个 Scrapy 爬虫工程
scrapy startproject python123demo

生成的文件目录
python123demo							外层目录
    │  items.py							Items 代码模板(继承类)
    │  middlewares.py					Middlewares 代码模板(继承类)
    │  pipelines.py						Pipelines 代码模板(继承类)
    │  settings.py						Scrapy 爬虫的配置文件
    │  __init__.py						初始化脚本
    │  
    ├─spiders							Spiders 代码模板目录(继承类)
    │  │  demo.py						
    │  │  __init__.py					初始化脚本
    │  │  
    │  └─__pycache__
    │          demo.cpython-39.pyc
    │          __init__.cpython-39.pyc
    │          
    └─__pycache__						缓存目录,无需修改
            settings.cpython-39.pyc
            __init__.cpython-39.pyc
            
  1. 在工程中产生一个 Scrapy 爬虫
scrapy gensipider demo python123.io

该命令的作用是生成一个 demo 的 spider,在 spiders 目录下增加代码文件 demo.py。

  1. 配置产生的 spider 爬虫

打开 spiders 目录下 demo.py 代码文件

import scrapy


class DemoSpider(scrapy.Spider):
    name = "demo"
   # allowed_domains = ["python123.io"]
    start_urls = ["http://python123.io/ws/demo.html"]

    def parse(self, response):
        fname = response.url.split("/")[-1]
        with open(fname, "wb") as f:
            f.write(response.body)
        self.log("Save file %s." % fname)

parse() 方法用于处理响应,解析内容形成字典,发现新的URL爬取请求。

  1. 运行爬虫,获取网页
scrapy crawl demo
  1. 分析spiders 目录下 demo.py 代码文件

4、yield 关键字

yield = 生成器,包含 yield 语句的函数是一个生成器函数,生成器每次产生一个值(yield 语句),函数被冻结,被唤醒后再产生一个值,生成器是一个不断产生值得函数。

实例:

def gen(n):
    for i in range(n):
        yield i**2
       
for i in gen(5):
    pring(i, "", end="")
    
0 1 4 9 16

分析这个实例,生成器每次调用 yield 位置产生一个值,直到函数执行结束。

那么大家想一想为什么要有生成器呢?

分析一下下面这实例:

def square(n):
    ls = [i**2 for in range(n)]
    return ls
for i in square(5):
    print(i, "", end= "")

这个实例和上面那个实例其实一样的功能,都是求一组树的平方值,生成器相对比一次列出所有内容的优势:

  • 更节省存储空间
  • 响应更迅速
  • 使用更灵活
  • 如果 n= 1,10,10,100000... 或者更大呢?

5、Request,Response,Item

回顾一下 Scrapy 爬虫的使用步骤

  1. 创建一个工程和 spider 模板
  2. 编写 spider
  3. 编写 Item Pipeline
  4. 优化配置策略

在 Scrapy 框架下,这个四个步骤中会涉及到三个类,Request 类,Response 类,Item 类。

Request 类

class scrapy.http.Request()

Request 对象表示一个 http 请求,由 Spider 生成,由 downloader 执行。

Reqest 类的常见属性或方法介绍:

Response 类

class scrapy.http.Response()

Response 对象表示一个 http 响应,由 downloader 生成,由 spider 处理。

Response 类常见的属性或方法介绍:

Item 类

class scrapy.item.Item()

Item 对象表示从一个 html 页面中提取的信息内容,由 spider 生成,由 Item pipeline 处理,Item 类似字典类型,可以按照字典类型操作。

下面介绍一下 Scrapy 爬虫的提取信息的方法都有哪些:

  • Beautiful Soup
  • lxml
  • re
  • Xpath Selector
  • Css Selector

重点介绍一下 Css Selector 的基本使用,

<HTML>.css("a::attr(href)").extract()
		标签名称 	 标签属性

标签:spider,demo,py,Scrapy,爬虫,scrapy,解析
From: https://www.cnblogs.com/shiwukong/p/17565586.html

相关文章

  • 5分钟教你从爬虫到数据处理到图形化一个界面实现山西理科分数查学校-Python
    5分钟教你从爬虫到数据处理到图形化一个界面实现山西理科分数查学校-Python引言在高考结束后,学生们面临的一大挑战是如何根据自己的分数找到合适的大学。这是一个挑战性的任务,因为它涉及大量的数据和复杂的决策过程。大量的信息需要被过滤和解析,以便学生们能对可能的大学选择有......
  • c++笔记-scoped_lock/unique_lock解析
    目录scoped_lockvsunique_lock灵活性生命周期资源所有权性能对比例源码unque_lockscoped_lockscoped_lockvsunique_lock在C++中,std::scoped_lock和std::unique_lock都是用来管理互斥量(mutex)的RAII(ResourceAcquisitionIsInitialization)类,用于简化多线程编程中的锁管理。它......
  • 第6章 Windows Server 2012 R2 中的DNS和名称解析
    第6章WindowsServer2012R2中的DNS和名称解析6.1理解DNS服务器角色下面简单总结本章涉及的DNS基本概念主机名指(用户友好)的计算机的名称,根据DNS标准,主机名可以多达255个字符,主机名等价于计算机的名字。名称空间这是域的名称,并不是具体指ActiveDirectory域......
  • 正则表达式解析StarRocks雾化视图中的血缘关系
    解析SQL中的底表主要目标是获取出StarRocks雾化中的底表和字段备注,之后给字段赋予备注值,存入库表,可以动态生成数据字典,web可以利用该表实现mybatis的动态sql拼接,动态化的excel导出导入,魔板等功能。尝试使用了Jsqlparser解析sql语句,发现遇到部分复杂的子查询内包含unionall情况......
  • [未解决] vue transform-blocks解析源代码报错:Illegal tag name. Use '<' to print '<
    报错内容:[vite]Internalservererror:Illegaltagname.Use'<'toprint'<'.用的是这篇博文的源代码展示方法:如何用vite的vueCustomBlockTransforms(自定义块转换)实现源代码展示使用时突然遇到某一个vue文件添加<demo></demo>标签后报错,但其他vue文件可以正常读取和展示......
  • 动态加载页面的爬虫方法
    首先,可以直接手动拉到网页最下面,然后把F12里面的网页节点元素复制成文本,去获取目标进行下载,代码如下,用到的库BeautifulSoup:importosimporturllib.requestimportrefrombs4importBeautifulSoupasbsimportrandomasrdimporttimedefget_imgs(text):soup=bs......
  • 深入解析 C++ 中的 ostringstream、istringstream 和 stringstream 用法
    引言:在C++中,ostringstream、istringstream和stringstream是三个非常有用的字符串流类,它们允许我们以流的方式处理字符串数据。本文将深入探讨这三个类的用法和特性,帮助读者更好地理解和应用字符串流操作。1.ostringstream(输出字符串流)ostringstream是C++中用于输出字......
  • 计讯物联5G千兆网关TG463在电力智能巡检机器人的应用功能解析
    项目背景随着国家智能电网建设加速推进,投资规模持续扩大,我国电网智能化、信息化不断提高,传统的电力运维与管理模式早已不能满足智能电网快速发展的需求。因此,在5G无线通信、人工智能、物联网、云计算、大数据、电力等前沿技术的高度融合下,以替代人工巡检为目的的电力智能巡检机器......
  • 【CJsonObject】C++ JSON 解析器使用教程
    能选封装的尽量不使用底层的一、CJsonObject简介CJsonObject是Bwar基于cJSON全新开发一个C++版的JSON库。CJsonObject的最大优势是轻量、简单好用,开发效率极高,尤其对多层嵌套json的读取和生成、修改极为方便。CJsonObject比cJSON简单易用得多,且只要不是有意不......
  • 订单超时自动取消的技术方案解析及代码实现
    前言订单超时自动取消是电商平台中常见的功能之一,例如在淘宝、京东、拼多多等商城下单后,如果在一定的时间内没有付款,那么订单会自动被取消,是怎么做到的呢?作为技术人员我们应该了解自动取消的原理和实现逻辑,本文将介绍几种常用的技术方案,帮助开发者实现订单超时自动取消的功能。......