Scrapy爬虫框架复习(一)Scrapy项目的基本结构

阿里云2000元红包!本站用户参与享受九折优惠!

安装:

conda install scrapy


Scrpay爬虫框架

流程

  • Spiders发送第一个URL给引擎
  • 引擎从Spider中获取到第一个要爬取的URL后,在调度器(Scheduler)以Request调度
  • 调度器把需要爬取的request返回给引擎
  • 引擎将request通过下载中间件发给下载器(Downloader)去互联网下载数据
  • 一旦数据下载完毕,下载器获取由互联网服务器发回来的Response,并将其通过下载中间件发送给引擎
  • 引擎从下载器中接收到Response并通过Spider中间件发送给Spider处理
  • Spider处理Response并从中返回匹配到的Item及(跟进的)新的Request给引擎
  • 引擎将(Spider返回的)爬取到的Item给Item Pipeline做数据处理或者入库保存,将(Spider返回的)Request给调度器入队列
  • (从第三步)重复直到调度器中没有更多的request

Scrapy的基本方法和属性

  • 爬虫名称:name属性
  • 启动方法:start_requests(),或者直接使用start_urls启动
  • 默认解析器方法:parse()
  • 启动链接列表:start_urls属性

Scrapy常用命令行命令

全局命令:全局命令:项目命令项目命令
startprojectshellcrawlbench
genspiderfetchchecklist
settingsviewparseedit
runspiderversion

查看所有命令:scrapy -h
查看帮助信息:scapy –help
查看版本信息:scrapy version 或 scrapy version -v
新建项目:scrapy startproject spider_name
生成一个spider文件:scrapy genspider name 域名
查看当前项目内有多少爬虫:scrapy list
使用浏览器打开网页:scrapy view 网址
shell命令:scrapy shell 网址

之后便进入交互环境
我们主要对这里面的response(也就是爬虫的响应文件)进行操作, 例如:
response.xpath() #括号里直接加xpath路径

scrapy runspider 爬虫名称: 直接运行创建的爬虫
scrapy fetch:使用Scrapy下载器下载给定的URL,并将内容写入标准输出
scrapy settings [options]:获取Scrapy设置的值
scrapy parse [options]:获取给定的URL并使用处理它的爬虫解析它,使用通过–callback选项传递的方法,或者parse如果没有给出

scrapy项目文件的结构及用途

项目文件夹下有【项目名】文件夹和scrapy.cfg文件,其中scrapy.cfg文件中主要包含的是项目的相关设置。而在scrapy文件夹下我们可以看到:
Spiders文件夹:我们可以在Spiders文件夹下编写我们的爬虫文件,里面主要是用于分析response并提取返回的item或者是下一个URL信息,每个Spider负责处理特定的网站或一些网站。

init.py:项目的初始化文件。

items.py:定义我们所要爬取的信息的相关属性。Item对象是种容器,用来保存获取到的数据。

middlewares.py:Spider中间件,在这个文件里我们可以定义相关的方法,用以处理蜘蛛的响应输入和请求输出。

pipelines.py:在item被Spider收集之后,就会将数据放入到item pipelines中,在这个组件是一个独立的类,他们接收到item并通过它执行一些行为,同时也会决定item是否能留在pipeline,或者被丢弃。

settings.py:提供了scrapy组件的方法,通过在此文件中的设置可以控制包括核心、插件、pipeline以及Spider组件。

items.py

# -*- coding: urf-8 -*-
# Define here the models for your scrapyed items
#
# See documentation in
# http://doc.scrapy.org/en/latest/topics/items.html
import scrapy
class TaoBaoItem(scrapy.Item):
    # define the fields for your item here like:
    # 
    # name = scrapy.Filed()
    pass

这个文件的作用是定义我们要爬取信息的标准格式,
易见本文件只是定义了一个类,至于什么时候实例化它,怎么保存它,请继续了解下面的内容。

settings.py

项目的配置文件,通过在其它文件中引入本文件的方式来使用这些配置项。
默认的配置项

BOT_NAME = 'taobao'
SPIDER_MODULES = ['taobao.spiders']
NEWSPIDER_MODULE = 'taobao.spider'
# Obey robots.txt rules
ROBORSTXT_OBEY = True

因为我们写的是定向爬虫,前面三个按默认即可,我们不去管他。看第四项,注释里说这个配置项的意思是遵守robots.txt,如果不遵守的话可以设置为False

pipelines.py

# -*- coding: utf-8 -*-
# Define your item pipelines here
# 
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
class TaobaoPipeline(object):
    def process_item(self, item, spider):
        return item

注释提醒我们要启用Pipeline的话必须要在settings.py里配置一下ITEM_PIPELINES,配置好后,我们的setting.py如下:

# -*- coding: utf-8 -*-
BOT_NAME = 'taobao'
SPIDER_MODULES = ['taobao.spiders']
NEWSPIDER_MODULE = 'taobao.spider'
ROBORSTXT_OBEY = True
ITEM_PIPELINES = {
    'taobao.pipelines.TaobaoPipeline': 300,
}

此处的300表示优先级,数字越小优先级越高,代表这个Pipeline会越优先被执行。因为本项目只用到这一个pipeline,所以随意取0-1000中的一个数值即可。

再回到pipelines.py这个文件,这个文件到底有什么用呢?

  • 对爬取到的数据(Item)进行处理,比如存入数据库
  • 爬虫结束时产生事件,比如发送一封邮件

spider

以上为默认生成的项目结构,而爬虫文件我们需要自己写。

在默认生成的spiders目录下新建Taobao_spider.py,我们的爬虫就写在这里面。下面为一个简单的下载网页源代码的爬虫

import scrapy
class TaobaoSpider(scrapy.Spider):
    name = "taobao"  # 爬虫的名字,执行时使用
    start_urls = [
        'https://s.taobao.com/search?q=%E8%BF%9E%E8%A1%A3%E8%A3%99&imgfile=&js=1&stats_click=search_radio_all%3A1'
        '&initiative_id=staobaoz_20171101&ie=utf8'
    ]
    def parse(self, response):  # 真正的爬虫方法
        html = response.body  # response是获取到的来自网站的返回
        # 以下四行将html存入文件
        filename = "index.html"
        file = open(filename, "w")
        file.write(html)
        file.close()

需要说明的是:这个类不是随心所欲来写的,name,allowed_domains,start_urls,都是类似于“重载”的值。也就是说,scrapy内部会检测这些变量的值,变量名不可以起成其它的名字,类似的变量之后还会有介绍。至于parse方法,就是重载的父类的方法,我们爬虫的主体一般就写在这里面

参考阅读

windows 命令行基本操作命令介绍
DC学院爬虫

https://www.jianshu.com/p/d70a81d58f06

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论