Python爬虫之Scrapy框架结构

Scrapy项目结构

 

scrapy.cfg
myproject/
    __init__.py
    items.py
    pipelines.py
    settings.py
    spiders/
        __init__.py
        spider1.py
        spider2.py
        ...

文件介绍:
  • scrapy.cfg:项目的配置文件
  • myproject/:项目的Python模块,将会从这里引用代码
  • myproject/items.py:项目的目标文件
  • myproject/pipelines.py:项目的管道文件
  • myproject/settings:项目的设置文件
  • myproject/spiders/:存储爬虫代码目录

 

项目步骤

一、明确目标

  1. 打开items.py文件
  2. items中定义结构化数据字段,用来保存爬取到的数据,有点像Python中的dict,提供了一些额外的保护减少错误
  3. 可以通过创建一个scrapy.Item类,并且定义类型为scrapy.Field的类属性来定义一个Item
  4. 接下来,创建一个自定义Item子类,和构建item模型

例如:

import scrapy

class BeautyItem(scrapy.Item):
    name = scrapy.Field()
    age = scrapy.Field()
    img = scrapy.Field()

 

二、制作爬虫

  • 在当前目录下输入命令
scrapy genspider spider_name "allowed_domains"

  将在myproject/spiders/目录下创建一个名为'spider_name'的爬虫文件,并制定爬虫域的范围(allowed_domains,用于限定爬取的数据来源不超过这个域名范围)

  • 打开该目录下的spider_name.py文件,默认增加了下列代码:
import scrapy

class Spider_name(scrapy.Spider):

    name = "spider_name"
    allowed_domains = ["allowed_domains"]
    start_urls = ['http://www.allowed_domains']

    def parse(self, response):
        pass

  其实也可以由我们自行创建爬虫文件并编写上面的代码,只不过使用命令可以免去编写固定代码的麻烦

  要创建一个Spider,你必须用scrapy.Spider类创建一个子类,并确定了两个强制的属性和一个方法

  • name = "" :爬虫的识别名称,必须是唯一的,不同的爬虫必须定义不同的名称
  • allowed_domains = [] :是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略(非必要属性)
  • start_urls = [] :爬取的url列表。爬虫从这里开始爬取数据,所以第一此下载的数据将会从这些urls开始,其他子URL将会从起始URL继承性生成
  • parse(self, response) :解析的方法,每个初始URL完成下载后将被调用,调用的时候传入从每一个URL传回的Response对象来作为唯一参数,主要作用如下:
  1. 负责解析返回的网页数据(response.body),提取结构化数据(生成item)
  2. 生成需要下一页的URL请求

 

保存数据

scrapy保存信息的最简单的方法主要有四种,-o输出指定格式的文件,命令如下:

 

# json格式
scrapy crawl spider_name -o file_name.json

# json line格式
scrapy crawl spider_name -o file_name.jsonl

# csv逗号表达式,可用excel打开
scrapy crawl spider_name -o file_name.csv

# xml格式
scrapy crawl spider_name -o file_name.xml

 

 

 

Item Pipelines

当Item在Spider中被收集之后,它将会被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item。

每个Item Pipeline都是实现了简单方法的Python类,比如决定此Item是丢弃还是存储。以下是Item Pipeline的一些典型应用:

  • 验证爬取的数据(检查item包含某些字段,比方说name字段)
  • 查重(并丢弃)
  • 将爬取结果保存到文件或数据库中

  

编写Item pipeline很简单,item pipeline组件是一个独立的Python类,其中process_item()方法必须实现

import something

class somethingPipeline(Object):
    
    def __init__(self):
        # 可选实现,做参数初始化(如打开保存目录文件)等
        # do something

    def process_item(self, item, spider):
        # item(Item对象) - 被爬取的item
        # spider(Spider对象) - 爬取该item的spider
        # 这个方法必须实现,每个item pipeline组件都需要调用该方法
        # 必须返回一个Item对象,被丢弃的item将不会被之后的pipeline组件锁处理
        return item

    def open_spider(self, spider):
        # spider(Spider对象) - 被开启的spider
        # 可选实现,当spider被开启时被调用

    def close_spider(self, spider):
        # spider(spider对象) - 被关闭的spider
        # 可选实现,当spider被关闭时被调用

 

 

posted @ 2017-08-08 22:02  chipsKe  阅读(485)  评论(0编辑  收藏  举报