您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

Scrapy框架初探

时间:2020-07-07 10:36:42  来源:  作者:

Scrapy基本介绍

scrapy是一种用于爬虫的框架,并提供了相当成熟的模板,大大减少了程序员在编写爬虫时的劳动需要。

Command line tool & Project structure

使用scrapy需要先创建scrapy project,之后再于project文件夹路径下生成spider(爬虫)文件,编写完程序后,再运行爬虫(手动指定保存文件)。以上过程由命令行执行,具体如下:

  1. scrapy startproject <myproject>
  2. scrapy genspider <spider_name> <domain>
  3. scrapy crawl <spider_name> [-o filename]

后面两个命令均要在myproject文件夹(第一个myproject)路径下执行。而由第一个命令创建的scrapy项目结构如下:

myproject/
    scrapy.cfg
    myproject/
        __init__.py
        items.py
        middlewares.py
        pipelines.py
        settings.py
        spiders/
            __init__.py
            spider_name.py

Scrapy Overview

Scrapy框架初探

 

上图是scrapy的基本结构,易见scrapy的程序执行和数据流动是由 engine 来调度控制的,关于该结构的具体解释见: scrapy document overview .

Scrapy Spider详解

基础的使用scrapy一般只需要在spider_name.py中进行编写,该文件是我们使用scrapy genspider <spider_name>命令后自动创建中,文件中还自动import了scrapy并且还自动创建了一个模版spider类(自动继承自scrapy.Spider)。spider的功能简介于此: scrapy document spider 。这里介绍一些常用的scray.Spider类的属性及方法:

Attribute :

name :name属性即是我们使用命令行时所指定的spider_name,这是scrapy框架中用于标识spider所用,每个spider都必须有一个独一无二的name。

allowed_domains :该属性为一个以string为元素的list,每个元素string为一个domain,限定爬虫所能爬取的网址。

start_urls :该属性同样为一个以string为元素的list,每个元素string对应一个完整的url,是spider开始时需要爬取的初始网址。

custom_settings :该属性的形式为一个dict,即如修改user-agent,开启pipeline,指定log_level之类的,并且局限于http header。

method :

start_requests :该方法用于在scrapy开始爬虫时以start_urls返回一个Request iterable或者一个generator,该方法在一次爬虫过程中仅被调用一次。其默认实现为:Request(url, dont_filter=True) for each url in start_urls。

parse :这是spider类中最重要的一个方法。由scrapy文档中对spider的介绍,spider每发出一个Request,便要对该Request的Response进行处理,处理的函数称为callback function,即 one Request corresponds to one Callback。而parse就是默认的callback函数,它负责对传回的response进行解析(xpath),提取数据(item dict-like object)并交予,并且还会根据需要发出新的Request请求。和start_requests一样,它的返回值也需要是一个iterable或是一个generator。一般来说,先yield item,再根据对response的解析得到新的url与yield Request(url,callback)。这里对于response的解析和数据提取交予过程略过,具体可以见于 b站教程 。

由以上介绍可见对于start_request和parse方法的返回值要求,scrapy框架的内部代码逻辑应该是像for循环一样轮询两者的返回值,对于parse方法还需要判断其返回值的类型(item/Request)来区别处理。

Scrapy Request and Response

Typically, Request objects are generated in the spiders and pass across the system until they reach the Downloader, which executes the request and returns a Response object which travels back to the spider that issued the request.

Request object

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

  • 其中url参数即为我们想要爬取网站的url
  • callback为该request对应的在返回response时的处理函数
  • method是http请求方法,常用的有:"GET","POST"
  • headers是请求头,形式为dict
  • body是http请求的请求数据,即一般的表单数据,形式为bytes字符串
  • cookies形式为dict
  • 这里先讲dont_filter,默认值为False,scrapy中默认对于同一url是不重复爬取的,所以会把相同的url给filter掉,而有时我们需要爬取同一url(如爬取某个不断更新的论坛页面),就需要把该值设为True
  • meta The initial values for the Request.meta attribute. If given, the dict passed in this parameter will be shallow copied.该参数也是字典形式,是为了在spider类的多个parse函数之间传递信息,见 知乎 。 注意Response对象也有一个它对应的Request对象 :The Request object that generated this response. This attribute is assigned in the Scrapy engine, after the response and the request have passed through all Downloader Middlewares In particular, this means that:HTTP redirections will cause the original request (to the URL before redirection) to be assigned to the redirected response (with the final URL after redirection).Response.request.url doesn’t always equal Response.urlThis attribute is only available in the spider code, and in the Spider Middlewares, but not in Downloader Middlewares (although you have the Request available there by other means) and handlers of the response_downloaded signal.But Unlike the Response.request attribute, the Response.meta attribute is propagated along redirects and retries, so you will get the original Request.meta sent from your spider.

Response obejct

这里仅介绍一些reponse对象的属性:

  • url 即该response的来源url
  • status 即该response的状态码
  • headers response的响应头,形式为dict
  • body response的相应数据体,形式为bytes
  • request response对应的Request对象,对于它上文已经介绍,即Response.url可能不等于Reponse.request.url,因为redirection的原因

Settings

Settings can be populated using different mechanisms, each of which having a different precedence. Here is the list of them in decreasing order of precedence:

  1. Command line options (most precedence)
  2. Settings per-spider
  3. Project settings module(settings.py)
  4. Default settings per-command
  5. Default global settings (less precedence)

一般我们直接在settings.py文件中对其进行修改,常见需要增改的有:user-agent指定,ITEM_PIPELINES解除注释以开启pipeline功能,LOG_LEVEL和LOG_FILE指定,ROBOTSTXT_OBEY设为False等等。



Tags:Scrapy框架   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
Scrapy基本介绍scrapy是一种用于爬虫的框架,并提供了相当成熟的模板,大大减少了程序员在编写爬虫时的劳动需要。Command line tool & Project structure使用scrapy需要先创建s...【详细内容】
2020-07-07  Tags: Scrapy框架  点击:(66)  评论:(0)  加入收藏
▌简易百科推荐
近日只是为了想尽办法为 Flask 实现 Swagger UI 文档功能,基本上要让 Flask 配合 Flasgger, 所以写了篇 Flask 应用集成 Swagger UI 。然而不断的 Google 过程中偶然间发现了...【详细内容】
2021-12-23  Python阿杰    Tags:FastAPI   点击:(6)  评论:(0)  加入收藏
文章目录1、Quartz1.1 引入依赖<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version></dependency>...【详细内容】
2021-12-22  java老人头    Tags:框架   点击:(11)  评论:(0)  加入收藏
今天来梳理下 Spring 的整体脉络啦,为后面的文章做个铺垫~后面几篇文章应该会讲讲这些内容啦 Spring AOP 插件 (了好久都忘了 ) 分享下 4ye 在项目中利用 AOP + MybatisPlus 对...【详细内容】
2021-12-07  Java4ye    Tags:Spring   点击:(14)  评论:(0)  加入收藏
&emsp;前面通过入门案例介绍,我们发现在SpringSecurity中如果我们没有使用自定义的登录界面,那么SpringSecurity会给我们提供一个系统登录界面。但真实项目中我们一般都会使用...【详细内容】
2021-12-06  波哥带你学Java    Tags:SpringSecurity   点击:(18)  评论:(0)  加入收藏
React 简介 React 基本使用<div id="test"></div><script type="text/javascript" src="../js/react.development.js"></script><script type="text/javascript" src="../js...【详细内容】
2021-11-30  清闲的帆船先生    Tags:框架   点击:(19)  评论:(0)  加入收藏
流水线(Pipeline)是把一个重复的过程分解为若干个子过程,使每个子过程与其他子过程并行进行的技术。本文主要介绍了诞生于云原生时代的流水线框架 Argo。 什么是流水线?在计算机...【详细内容】
2021-11-30  叼着猫的鱼    Tags:框架   点击:(21)  评论:(0)  加入收藏
TKinterThinter 是标准的python包,你可以在linx,macos,windows上使用它,你不需要安装它,因为它是python自带的扩展包。 它采用TCL的控制接口,你可以非常方便地写出图形界面,如...【详细内容】
2021-11-30    梦回故里归来  Tags:框架   点击:(27)  评论:(0)  加入收藏
前言项目中的配置文件会有密码的存在,例如数据库的密码、邮箱的密码、FTP的密码等。配置的密码以明文的方式暴露,并不是一种安全的方式,特别是大型项目的生产环境中,因为配置文...【详细内容】
2021-11-17  充满元气的java爱好者  博客园  Tags:SpringBoot   点击:(25)  评论:(0)  加入收藏
一、搭建环境1、创建数据库表和表结构create table account(id INT identity(1,1) primary key,name varchar(20),[money] DECIMAL2、创建maven的工程SSM,在pom.xml文件引入...【详细内容】
2021-11-11  AT小白在线中  搜狐号  Tags:开发框架   点击:(29)  评论:(0)  加入收藏
SpringBoot开发的物联网通信平台系统项目功能模块 功能 说明 MQTT 1.SSL支持 2.集群化部署时暂不支持retain&will类型消 UDP ...【详细内容】
2021-11-05  小程序建站    Tags:SpringBoot   点击:(56)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条