热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Scrapy库

一、Scrapy爬虫框架1、‘5+2’结构:5个模块+2个中间键5个模块1)Spider【用户配置】:框架入口,获取初始爬取请求提供要爬取的url链接,同时解析页面上的内容解析Do

一、Scrapy爬虫框架

1、‘5+2’结构:5个模块+2个中间键

5个模块

1)       Spider【用户配置】

  • 框架入口,获取初始爬取请求
  • 提供要爬取的url链接,同时解析页面上的内容
  • 解析Downloader返回的响应(Response)
  • 产生爬取项(Scraped Item)
  • 产生额外的爬取请求(Request)

2)       Engine【已有实现】

  • 控制各模块数据流,不断从Scheduler获得爬取请求,直到请求为空
  • 根据条件触发事件

3)       Scheduler【已有实现】

  • 对所有爬取请求进行调度管理

4)       Downloader【已有实现】

  • 根据请求下载网页

5)       Item Pipeline【用户配置】

  • 框架出口,输出爬取项
  • 对提取的信息进行后处理
  • 以流水线方式处理Spider产生的爬取项(Scraped Item)
  • 由一组操作顺序组成,每个操作是一个Item Pipeline类型
  • 清理、检验、查重爬取项中的HTML数据、将数据存储到数据库

 

2个中间键:Engine和Spider、Downloader之间存在中间键:

1)       Downloader Middleware【用户配置】

  • 实施Engine、Scheduler、Downloader之间进行用户可配置的控制
  • 修改、丢弃、新增请求或响应

2)       Spider Middleware【用户配置】

  • 对请求和爬取项的再处理
  • 修改、丢弃、新增请求或爬取项

 技术图片

2、3条数据流

1)       Engine从Spider获得爬取请求(Request-url)

2)       Engine再将爬取请求(Request)转发给Scheduler,用于调度

 

3)       Engine从Scheduler获得爬取请求(Request)

4)       Engine再将爬取请求(Request)通过中间键发送给Downloader

5)       Downloader链接Internet爬取网页之后,Downloader形成响应(Response)通过中间键发送给Engine

6)       Engine将响应(Response)通过中间键发送给Spider

 

7)       Spider处理响应之后,产生爬取项(Scraped Item)和新的爬取请求(Request)发给Engine

8)       Engine将爬取项(Scraped Item)发送给Item Pipeliner

9)      Engine将爬取请求(Request) 转发给Scheduler

二、Requests   vs.   Scrapy

同:

优点:都可以进行页面请求和爬取,可用性好、文档丰富、入门简单

缺点:没有处理JS、提交表单、应对验证码

异:

  Requests:

  页面级爬虫

  功能库

  并发性差、性能较差

  重点在页面下载

  定制灵活,上手简单

    Scrapy:

    网站级爬虫

    爬虫框架

    并发性好、性能较高

    重点在爬虫结构

    一般定制灵活,深度定制困难,上手较难

适用:

        Requests:非常小的需求

  Scrapy:不太小的需求

三、Scrapy命令行

        >scrapy [options] [args]

技术图片

四、使用Scrapy库【小例子】

步骤1、 建立一个Scrapy爬虫工程

    打开命令行

    在C盘的try目录下新建一个工程:python123

技术图片

 技术图片

  1)       python123/ — Scrapy框架的用户自定义python代码

  2)       scrapy.cfg — 部署Scrapy爬虫的配置文件

技术图片

  1)       __init__.py — 初始化脚本,不需要用户编写

  2)       items.py — Items代码模板(继承类)

  3)       middlewares.py — Middleware代码模板(继承类),如需扩展Middleware功能,可以进行修改

  4)       middlewares.py — Middleware代码模板(继承类)

  5)       pipelines.py — Pipelines代码模板(继承类)

  6)       settings.py — Scrapy爬虫的配置文件,优化爬虫功能

  7)       spiders/ — Spiders代码模板(继承类)

  8)       __pycache__/ — 缓存目录,无需修改

技术图片

  1)       __pycache__/ — 缓存目录,无需修改

  2)       __init__.py — 初始化脚本,不需要用户编写

步骤2、在工程中产生一个爬虫

技术图片

 技术图片

在spiders目录下增加代码文件 demo.py
# -*- coding: utf-8 -*-
import scrapy

#面向对象编写的一个 DemoSpider 类,该类继承于scrapy.Spider面向对象编写的一个 DemoSpider 类,该类继承于scrapy.Spider
class DemoSpider(scrapy.Spider):
    name = ‘demo‘
    allowed_domains = [‘python123.io‘] ## 只能爬取‘python123.io‘域名下的相关url,生成爬虫时提交
    start_urls = [‘http://python123.io/‘] ## 爬取的起始页面

    ## 解析页面的方法,用于处理响应,解析内容形成字典,发现新的url爬取请求
    def parse(self, response):
        pass  

步骤3、配置产生的spider爬虫,即修改demo.py
# -*- coding: utf-8 -*-
import scrapy

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

    ## 解析页面的方法
    def parse(self, response): ## 将response内容写入html文件中
        fname = response.url.split(‘/‘)[-1]
        with open(fname, ‘wb‘) as f:
            f.write(response.body)
        self.log(‘Saved file %s.‘ % fname)
 
步骤4、运行爬虫,获取页面,捕获页面存储在demo.html中
技术图片

 技术图片

 技术图片

五、yeild关键字

包含yeild语句的函数是一个生成器

生成器是一个不断产生值的函数

生成器每次产生一个值(yeild语句),函数被冻结,被唤醒后再产生一个值

于循环结合使用

## yeild 的使用
def gen(n):
    for i in range(n):
        yield  i**2

for i in gen(5):
    print(i, ‘‘, end=‘‘)

## 普通写法,将所有值计算出来存在列表中,一次进行返回
def square(n):
    ls = [i**2 for i in range(n)]
    return ls

for i in square(5):
    print(i, ‘‘, end=‘‘)

生成器相比一次列出所有结果的优势【特别对于大规模程序】:

节省存储空间、响应更加迅速、使用灵活

# -*- coding: utf-8 -*-
import scrapy

class DemoSpider(scrapy.Spider):
    name = ‘demo‘
    # allowed_domains = [‘python123.io‘] ## 可选
    def start_requests(self):
        urls = [‘http://python123.io/ws/demo.html‘]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    ## 解析页面的方法
    def parse(self, response): ## 将response内容写入html文件中
        fname = response.url.split(‘/‘)[-1]
        with open(fname, ‘wb‘) as f:
            f.write(response.body)
        self.log(‘Saved file %s.‘ % fname)

六、Scrapy爬虫的使用


       1、创建一个工程和Spider模板


       2、编写Spider


       3、编写Item Pipeliner


       4、优化配置策略

七、Scrapy爬虫的数据类型

       1、Request类:向网络提交HTTP请求

                       由Spider生成,Download执行

技术图片

2、Response类:爬取内容的封装类,HTTP响应

                     由Download生成,Spider处理

技术图片

3、Item类:充HTML页面中提取的信息

              由Spider生成,Item Pipeliner处理

              类似字典类型

八、 Scrapy爬虫信息提取方法【Spider模块使用】

Beautiful Soup

Re

lxlm

Xpath Selector

CSS Selector

 

Scrapy库


推荐阅读
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
author-avatar
幸运大树来了
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有