scrapy框架

介绍:scrapy框架为异步处理框架,使用纯python实现的爬虫框架,可扩展性强,可以灵活完成各种需求,我们只需要定制几个模块就可以轻松实现爬虫。是使用比较广泛的一种框架

框架介绍

  1. Scrapy Engine(引擎):负责Spider、itemPIPline、Downloader、Scheduler中间的通讯,信号,数据传输等。
  2. item:项目,他定义了爬取结果的数据结构,爬取的数据会被赋值成item对象。
  3. Scheduler(调度器):负责接收引擎发送的Request请求,并按照一定方式进行整理排列、入队,当引擎需要时交还给引擎。
  4. Downloader(下载器):负责下载Scrapy Engine发送的所有request请求,并将获取到的Response交还给Scrapy Engine由引擎交还给Spider处理
  5. Spider(爬虫):负责处理所有的Response,从中分析提取数据,获取item字段需要的数据,并将需要的URL提交给引擎,在此进入调度器。
  6. itemPipline(管道):负责处理spider中获取的item,并进行后期处理(详细解析、过滤、存储)
  7. DownLoader Middleware(下载中间件):可以当做一个自定义扩展的组件
  8. Spider Middleware(爬虫中间件):可以当做一个自定义扩展的组件和搜索引擎的spider中间通讯的功能(如进入Spider的Request和从spider出去的Request)

数据流

引擎打开一个网站>>处理该网站的Spider并向Spider请求一个要爬取的URL>>获取到URL通过调度器以Request形式调度>>引擎向调度器请求下一个要爬取的URL>>引擎获取到URL通过下载中间件发送给下载器>>下载完成,下载器生成Response,并发送给引擎>>引擎接受Response并通过爬虫中间件给Spider处理>>Spider处理Response返回爬取的Item即新的request给引擎>>引擎将Spider返回的Item对象给项目管道,将新的request给调度器重复上述第二步以后过程,直到调度器没有Request,引擎关闭网站

安装:

pip install Scrapy

如安装提示C++ 14.0xxx错误进入如下链接下载twisted 对应python版本

http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted

先安装twisted再安装Scrapy

在cmd中运行scrapy 输出scrapy版本号即安装成功

创建项目

#在命令行中输入的操作
1.创建项目
scrapy startproject 项目名称
2.创建爬虫
scrapy genspider 爬虫文件名称 爬取网站的域名
#如猫眼
scrapy genspider maoyan maoyan.com
3.运行spider
scrapy crawl 爬虫文件名称
#以猫眼为例
scrapy crawl maoyan
4.代码运行后如果错误提示为win32api则安装下述第三方库
pip install pywin32
5.-o 输出指定格式的文件
scrapy crawl spider文件名(maoyan) -o xxx.json(还可以是json csv xml)

创建成功之后的路径

>MyScrapy #项目名称
	>MyScrapy#项目主模块
		__init__.py
		items.py #定义爬虫的数据结构
		middlewares.py#定义爬虫的中间件
		piplines.py#项目的管道文件
		settings.py #项目设置文件
		scrapy.cfg #scrapy不是时的配置文件
		>Spider#存储爬虫代码
			__init__.py
			爬虫代码.py

创建Spider

在test_scrapy目录下执行

scrapy genspider 爬虫文件名称 爬取网站的域名
#如猫眼
scrapy genspider maoyan maoyan.com

以猫眼为例

import scrapy
from MyScrapy.items import MyscrapyItem

class MaoyanSpider(scrapy.Spider):
    # 每个项目的唯一名字,用于区分Spider
    name = 'maoyan'
    #允许爬取得域名
    allowed_domains = ['maoyan.com']
    #包含spider在启动时爬取的url列表,初始请求又它的定义
    start_urls = ['https://maoyan.com/board/4']

    def parse(self, response):
        '''
        parse:是Spider的一个方法,默认情况下,调用start_urls里面
        的链接构成的请求完成下载执行后,返回的响应就会作为唯一参
        数传递过来,该方法负责解析返回的响应,提取数据或者进一步
        生成要处理的请求
        '''
        html = scrapy.Selector(response)
        print(type(html))
        print('*' * 20)
        movie = html.xpath('//p[@class="star"]/text()').extract()
        print(movie)
        # items = []
        for name in movie:
            item = MyscrapyItem()
            item['name'] = name
            print(item['name'])
            yield item

创建item

保存爬取的数据,使用方法和字典类似,但比字典多了额外的保护机制,可以避免拼写错误或者定义字段错误

import scrapy

class MyscrapyItem(scrapy.Item):
    # define the fields for your item here like:
    #定义name字段为Field()类型,可以直接将页面获取的内容在此定义
    # name = scrapy.Field()
    # movie = scrapy.Field()
    name = scrapy.Field()

运行Spider

scrapy crawl 爬虫文件名称
#以猫眼为例
scrapy crawl maoyan

代码运行后如果错误提示为win32api则安装下述第三方库

pip install pywin32

保存数据

scrapy保存信息最简单的方法主要有四个

-o 输出指定格式的文件

scrapy crawl itcast -o xxx.json
  #json lines格式,默认为Unicode编码
   xxx.jsonl
   xxx.csv
   xxx.xml

存入数据库

使用Item Pipline将数据存入mongoDB数据库,或筛选某些有用Item,则可以定义Item Pipline来实现,常用Item Pipline来做如下操作

  1. 处理HTML数据
  2. 验证爬取数据 检查爬取字段
  3. 查重并丢弃重复数据
  4. 将爬取的数据保存到数据库

实现Item Pipline,只需要定义一个类并实现process_item()方法必须返回包含参数的数据和字典Item对象或抛出DropItem异常

from scrapy.conf import settings
import pymongo

class MyscrapyPipeline(object):
    def __init__(self):
        # 连接数据库
        client = pymongo.MongoClient(host= \
                     settings['MONGO_HOST'],
                     port=settings['MONGO_PORT'])
        self.db = client[settings['MONGO_DB']]
        self.coll = self.db[settings['MONGO_COLL']]
    def process_item(self, item, spider):
        #将item转换成字典
        postItem = dict(item)
        #将数据插入
        self.coll.insert(postItem)
        return item

然后再settings.py中项目管道处配置连接数据库

# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
   'MyScrapy.pipelines.MyscrapyPipeline': 300,
}
MONGO_HOST='localhost'
MONGO_PORT = 27017
MONGO_DB = 'maoyan'
MONGO_COLL = 'TOP100'

selector用法

selector基于lxml来构建,支持xpath选择器,CSS选择器以及正则表达式,解析速度和准确度高。

selector也有自己的数据提取方法及selector(选择器)

直接使用

from scrapy import Selector

body = '<html><hrad><title>hello</title></hrad></html>'

selector = Selector(text=body)
title = selector.xpath('//title/text()').extract_first()
print(title)

在:: 获取属性 获取方法等

获取文本信息:

xpath:/text()

css:text

获取属性信息

xpath:/@属性名称

css: ::属性名称

返回结果为列表,只显示文本/节点内容,extract()

获取匹配结果列表中第一个元素内容extract_first()

正则匹配

借助re()方法实现

response.xpath(' ').re(正则表达式)

获取得到列表中第一个元素可以使使用re_first()方法response对象不能直接调用re()和re_first()

scrapy shell

该模式类似于scrapy请求url

在命令窗执行 scrapy shell url(要请求的网页连接)

然后进入到shell模式类似于python交互模式,在该模式下可以直接使用response.xpath/css进行信息提取