scrapy框架基本知识

from:Mp
ps:内容均为自我总结

简介

Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。
借助框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便。
Scrapy 使用了Twisted 异步网络框架来处理网络通讯,可以加快我们的下载速度,不用自己去实现异步框架,并且包含了各种中间件接口,可以灵活的完成各种需求

官方文档 https://doc.scrapy.org/en/latest/

架构内容

  • Scrapy Engine:引擎
  • Scheduler:调度器
  • Downloader:下载器
  • Spider:爬虫
  • Item Pipline:管道
  • 两个中间件(Downloader Middlewares,Spider Middlewares)

架构图

ps: 图源官方文档


scrapy_architecture.png

运作流程

  1. spider 将url给-->engine
  2. engine传递request-->scheduler
  3. scheduler处理request并返回-->engine
  4. engine传递处理好的request-->downloader
  5. downloader按照下载中间件下载request请求-->engine
  6. engine返还下载好的response-->spiders
  7. spiders处理response,返回数据和跟进的url-->engine
  8. engine 传递数据和跟进的url-->item pipline,scheduler
  9. item pipline 处理数据,跟进的url按之前的循环,直到结束

安装

pip install Scrapy

scrapy相关操作

# 创建项目
scrapy startproject 项目名

# 创建爬虫
scrapy genspider 爬虫名 爬取域范围

# 保存数据
scrapy crawl 爬虫名 -o 自建名.json  # json格式,默认为Unicode编码
scrapy crawl 爬虫名 -o 自建名.jsonl  # json lines格式,默认为Unicode编码
scrapy crawl 爬虫名 -o 自建名.csv  # csv 逗号表达式,可用Excel打开
scrapy crawl 爬虫名 -o 自建名.xml  # xml格式

# 显示当前目录中的爬虫
scrapy list

创建项目后,自动创建的文件作用

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

Scrapy Shell(可用于数据提取时的测试)

启动

scrapy shell "想要获取信息的url"

启动后,Scrapy Shell根据下载的页面会自动创建一些方便使用的对象,如request,response等

可以使用Selectors选择器进行操作

"""Selector有四个基本的方法"""
xpath(): 传入xpath表达式,返回该表达式所对应的所有节点的selector list列表
extract(): 序列化该节点为Unicode字符串并返回list
css(): 传入CSS表达式,返回该表达式所对应的所有节点的selector list列表,语法同 BeautifulSoup4
re(): 根据传入的正则表达式对数据进行提取,返回Unicode字符串list列表

Spider 爬虫的代码文件

主要的属性和方法

name: 定义spider名字的字符串。

allowed_domains: 包含了spider允许爬取的域名(domain)的列表,可选。

start_urls: 初始URL元祖/列表。当没有制定特定的URL时,spider将从该列表中开始进行爬取。

start_requests(self): 该方法必须返回一个可迭代对象(iterable)。该对象包含了spider用于爬取(默认实现是使用 start_urls 的url)的第一个Request。
当spider启动爬取并且未指定start_urls时,该方法被调用。

parse(self, response): 当请求url返回网页没有指定回调函数时,默认的Request对象回调函数。用来处理网页返回的response,以及生成Item或者Request对象。

# 基本结构举例:
class LiziSpider(scrapy.Spider):
    name = "lizi"
    allowed_domains = ["lizi.cn"]
    start_urls = ["http://lizi.cn/...."]

    def parse(self, response):
        pass

Pipline 爬虫的管道文件

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

主要的方法

def __init__(self):    
    # 可选实现,做参数初始化等

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

def open_spider(self, spider):
    # 可选实现,当spider被开启时,这个方法被调用。
    # spider (Spider 对象) – 被开启的spider

def close_spider(self, spider):
    # 可选实现,当spider被关闭时,这个方法被调用
    # spider (Spider 对象) – 被关闭的spider
    

启用Item Pipeline组件

# settings文件中将编辑好的pipline添加到ITEM_PIPELINES列表中
ITEM_PIPELINES = {
    "mySpider.pipelines.LiziPipeline":300
}

Settings 提供定制Scrapy组件的方法

官方文档:http://scrapy-chs.readthedocs.io/zh_CN/1.0/topics/settings.html#topics-settings-ref

基本设定

  • BOT_NAME: 项目名
  • DOWNLOAD_DELAY: 下载器在下载同一个网站下一个页面前需要等待的时间
  • CONCURRENT_REQUESTS: 并发请求(concurrent requests)的最大值
  • USER_AGENT: 浏览器标识
  • ROBOTSTXT_OBEY: 是否遵循爬虫协议
  • ITEM_PIPELINES: 保存项目中启用的pipeline及其顺序的字典
  • PROXIES: 代理设置
  • COOKIES_ENABLED: 是否禁用cookies
  • DEFAULT_REQUEST_HEADERS: Scrapy HTTP Request使用的默认header。

Downloader Middlewares 下载中间件

下载中间件是处于引擎(crawler.engine)和下载器(crawler.engine.download())之间的一层组件

主要的方法

def process_request(self, request, spider):
    # 当每个request通过下载中间件时,该方法被调用
    ...
    
    return None
    # 如果其返回None,Scrapy将继续处理该request,执行其他的中间件的相应方法,直到合适的下载器处理函数(download handler)被调用
    # 如果其返回response对象,其将返回该response,已安装的中间件的process_response() 方法则会在每个response返回时被调用。
    # 如果其返回request对象,Scrapy则停止调用process_request方法并重新调度返回的request。
    # 如果其raise一个IgnoreRequest异常,则安装的下载中间件的process_exception()方法会被调用。如果没有任何一个方法处理该异常,则request的errback(Request.errback)方法会被调用。如果没有代码处理抛出的异常,则该异常被忽略且不记录

def process_response(self, request, response, spider):
    # 当下载器完成http请求,传递响应给引擎的时候调用
    ...
    
    return response
    # 如果其返回一个response,该response会被在链中的其他中间件的 process_response() 方法处理。
    # 如果其返回一个Request,则中间件链停止,返回的request会被重新调度下载。
    # 如果其抛出一个IgnoreRequest异常,则调用request的errback(Request.errback)。 #如果没有代码处理抛出的异常,则该异常被忽略且不记录(不同于其他异常那样)。
# settings文件中将编辑好的middlewares添加到ITEM_PIPELINES列表中
DOWNLOADER_MIDDLEWARES = {
    'mySpider.middlewares.LiziMiddleware': 543,
}

你可能感兴趣的:(scrapy框架基本知识)