Scrapy框架

1. Scrapy爬虫框架

Scrapy是功能强大的网络爬虫框架

# 通过cmd的命令行安装Scrapy库
pip install -i https://mirrors.aliyun.com/pypi/simple/ scrapy
# 测试scrapy安装情况
scrapy -h

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

1.1 Scrapy简介

Scrapy爬虫框架结构:“5+2”结构

Scrapy 1.png

以上5个模块形成Scrapy爬虫框架

SPIDRS是入口,需要用户编写,用来向整个框架提供url连接,同时需要解析网络内容
ITEM PIPELINES是出口,需要用户编写,负责对提取的信息进行后处理
ENGINE、SCHEDULER、DOWNLOADER是已有的功能实现,不需要编写

5个模块间,主要有3条数据流路径

第一条:

  • 1:ENGINE从SPIDRS获得用户爬取的请求(url)
  • 2:ENGINE将从SPIDRS获得的请求,转发给SCHEDULER(SCHEDULER赋负责对爬取请求进行调度)
    第二条:
  • 3:ENGINE从SCHEDULER获得请求(真实的网络爬取请求)
  • 4:ENGINE通过MIDDLEWARD发送给DOWNLOADER模块
  • 5:DOWNLOADER模块获得请求,连接互联网,并且爬取相关网页,获得响应(RESPONSE)并传递给ENGINE
  • 6:ENGINE将响应传给SPIDRS
    第三条:
  • 7:SPIDRS处理从ENGINE获得的响应,获得2个数据类型:爬去项(ITEMS)、新爬取请求
  • 8:ENGINE将ITEMS发送给ITEM PIPELINES;将新爬取请求发送给SCHEDULER进行调度

1.2 Scrapy框架解析

ENGINE:控制所有模块之间的数据流;根据条件触发事件
DOWNLOADER:根据请求下载网页
SCHEDULER:对所有爬取请求进行调度
Downloader Middleware:通过修改、丢弃、新增请求或者响应,对ENGINE、DOWNLOADER、SCHEDULER之间的数据流进行用户可配置的控制。用户可以编写配置代码
SPIDRS:解析DOWNLOADER返回的响应(Respones);产生爬取项(scraped item);产生额外的爬取请求(Request)
ITEM PIPELINES:以流水线方式处理Spider参数的爬去项;由一组操作顺序组成,类似流水线,每个操作是一个ITEM PIPELINES类型;可能的操作包括清理、检验、查重爬取项的HTML数据、将数据存储到数据库
Spider Middleware:通过修改、丢弃、新增请求或爬取项,对请求和爬取项再处理。用户可以编写配置代码

1.3 requests vs Scrapy

相同点:

  1. 进行页面请求和爬取,是Python爬虫的2个重要的技术路线
  2. 可用性号,文档丰富,入门简单
  3. 没有处理js、提交表单。应对验证码等功能(可扩展)
requests Scrapy
页面级爬虫 网站级爬虫
功能库 框架
并发性考虑不足,性能差 并发性号,性能较高
重点在于页面下载 重点在于爬虫框架
定制灵活 一般定制灵活,深度定制困难
上手十分简单 入门稍难

如何选择:

  1. 非常小的需求,requests库
  2. 不太小的需求,Scrapy框架
  3. 定制程度很高(不考虑规模),自搭框架,requests库优于Scrapy

1.4 Scrapy常用命令

Scrapy是为维持运行设计的专业爬虫框架,因此提供了相关操作的Scrapy命令行
在cmd命令行中执行下列代码,打开Scrapy命令行

scrapy -h
命令 说明 格式
startproject 创建一个新工程 scrapy startproject <name> [dir]
genspider 创建一个爬虫 scrapy genspider [options] <name> <domain>
settings 获得爬虫配置信息 scrapy settings [options]
crawl 运行一个爬虫 scrapy crawl <spider>
list 列出工程中所有爬虫 scrapy list
shell 启动URL调式命令行 scrapy shell [url]

2. 基本使用

2.1 简单实例

演示HTML页面地址:https://python123.io/ws/demo.html
步骤:

  1. 建立一个Scrapy爬虫工程
e:
cd code
acrapy startproject python123
Scrapy 2.png
  1. 在工程中产生一个Scrapy爬虫
cd python123
# 生成一个名为demo的爬虫;python123.io是网页的domain(见上述网址)
scrapy genspider demo python123.io

发现在Spider目录中出现一个名为demo.py的代码
demo.py是面向对象编码的一个类
parse()用于处理响应,解析内容形成字典,发现新的URL爬取请求

Scrapy 3.png
# -*- coding: utf-8 -*-
import scrapy

# 名字取名为demo所有类名为DemoSpider
class DemoSpider(scrapy.Spider):
    name = 'demo'
    # 用户提交给命令行的域名,说明只能爬取这个域名一下的相关连接
    allowed_domains = ['python123.io']
    # 以列表形式包含一个或多个url
    start_urls = ['http://python123.io/']

    # 解析页面空的方法
    def parse(self, response):
        pass
  1. 配置产生的spider爬虫
# -*- coding: utf-8 -*-
import scrapy


class DemoSpider(scrapy.Spider):
    name = 'demo'
    # allowed_domains = ['python123.io']【不需要,将这个变成注释】
    start_urls = ['https://python123.io/ws/demo.html']

    def parse(self, response):
        # 定义存储response文件的名字
        # 从响应的url文件名作为文件的名字
        fname = response.url.split('/')[-1]
        # 将返回的内容保存为文件
        with open(fname, 'wb') as f:
            f.write(response.body)
        self.log('Saved file &s.' & name)
  1. 运行爬虫,获得网页
scrapy crawl demo
Scrapy 4.png

demo.py代码完整版

import scrapy


class DemoSpider(scrapy.Spider):
    name = 'demo'
    def start_requests(self):
        urls = ['https://python123.io/ws/demo.html']
        for url in urls:
            # 向NGINE提出访问请求
            yield acrapy.Request(url = url, callback = self.parse)

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

2.2 yield关键字

yield是一个生成器

  1. 生成器是一个不断产生值得函数
  2. 包含yield语句的函数是一个生成器
  3. 生成器每次产生一个值,函数被冻结,被唤醒后再产生一个值
'''生成器写法'''
def gen(n):
    for i in range(n):
        yield i**2

以上函数能够产生所有小于n的整数的平方值
当函数被调用时,首先执行for循环,到yield时,函数会被冻结,而当前yield那一行的值会被返回出来
生成器的使用一般与for循环搭配,调用生成器

for i in gen(5):
    print(i, ' ', end = ' ') # 0   1   4   9   16 

普通写法

def square(n):
    ls = [i**2 for i in range(n)]
    return ls

a = square(5)
a # [0, 1, 4, 9, 16]

生成器,相比一次列出所有内容的普通写法,更节省存储空间、更快的响应速度、使用更灵活
demo.py的完整的代码中的下列代码就是生成器的利用

for url in urls:
    # 使用yield语句,每次只提交一个请求
    yield acrapy.Request(url = url, callback = self.parse)

2.3 基本使用

Scrapy爬虫基本步骤

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

Scrapy爬虫数据类型

  1. Request类:向网络提交请求的内容,表示一个HTTP请求,由Spider生成,Downloader执行
属性和方法 说明
.url Request对应的请求URL地址
.method 对应的请求方法,GETPOST
.headers 字典类型风格的请求头
.body 请求内容主题,字符串类型
.meta 用户添加的扩展信息,在Scrapy内部模块间传递信息使用
.copy() 复制该请求
  1. Response类:从网络上爬取内容的封装类,表示一个HTTP响应,由Downloader生产,Spider处理
属性和方法 说明
.url Response对应的URL地址
.status HTTP状态码,默认是200
.headers Response对应的头部信息
.body Response对应的内容信息,字符串类型
.flags 一组标记
.request 产生Response类型对应的Request对象
.copy() 复制该响应
  1. Item类:由Spider产生的信息封装的类,表示一个从HTML页面中提取的信息内容,由Spider生成,Item Pipeline处理。是一个类字典类型,可以按照字典类型操作

Scrapy爬虫提取信息的方法

  1. Beautiful Soup
  2. lxml
  3. re
  4. XPath Selector
  5. CSS Selector:<HTML>.css('a::attr(href)').extract()

CSS中,a:标签名称;href:标签属性

目录
Python网络爬虫与信息提取
一、Requests库
二、Beautiful Soup库
三、Re库
四、Scrapy框架
汇总

python网络爬虫与信息提取.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • scrapy框架Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广...
    糖炒栗子_01c5阅读 2,885评论 0 2
  • scrapy框架的流程图2018-11-01框架流程图 1、scrapy框架主要为个块      (1)Scrap...
    dream_seeker阅读 990评论 0 1
  • Scrapy Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛...
    爱你如阅读 4,864评论 0 4
  • scrapy介绍 Scrapy是一个为了爬取网站数据、提取结构化数据而编写的爬虫应用框架。Scrapy内部实现了包...
    3788ea30a4e8阅读 2,349评论 0 1
  • Scrapy框架架构 Scrapy框架介绍: 写一个爬虫,需要做很多的事情。比如:发送网络请求、数据解析、数据存储...
    久壑阅读 857评论 0 0