zoukankan      html  css  js  c++  java
  • scrapy框架

    一 scrapy框架简介:

    Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速、简单、可扩展的方式从网站中提取所需的数据。但目前Scrapy的用途十分广泛,
    可用于如数据挖掘、监测和自动化测试等领域,也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。
    Scrapy 是基于twisted框架开发而来,twisted是一个流行的事件驱动的python网络框架。因此Scrapy使用了一种非阻塞(又名异步)的代码来实现并发

    事件驱动:事件驱动是指在持续事务管理过程中,进行决策的一种策略,即跟随当前时间点上出现的事件,调动可用资源,执行相关任务,使不断出现的问题得以解决,防止事务堆积。
    在计算机编程、公共关系、经济活动等领域均有应用。从事件角度说,事件驱动程序的基本结构是由一个事件收集器、一个事件发送器和一个事件处理器组成

    二 scrapy框架的一个整体结构流程:

    从上图我们可以把整个框架分为蜈蚣丸部分:SPIDERS、ENGINE、DOWNLOADER、SCHEDULER、ITEM PIPELINES那么没给我组件的功能是什么:

    1、引擎(EGINE)
    引擎负责控制系统所有组件之间的数据流,并在某些动作发生时触发事件。有关详细信息,请参见上面的数据流部分。
    
    2、调度器(SCHEDULER)
    用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL的优先级队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
    
    3、下载器(DOWLOADER)
    用于下载网页内容, 并将网页内容返回给EGINE,下载器是建立在twisted这个高效的异步模型上的
    
    4、爬虫(SPIDERS)
    SPIDERS是开发人员自定义的类,用来发送请求、解析responses,并且提取items,或者发送新的请求
    
    5、项目管道(ITEM PIPLINES)
    在items被提取后负责处理它们,主要包括清理、验证、持久化(比如存到数据库)等操作
    下载器中间件(Downloader Middlewares)位于Scrapy引擎和下载器之间,主要用来处理从EGINE传到DOWLOADER的请求request,已经从DOWNLOADER传到EGINE的响应response,
    你可用该中间件做以下几件事:
        (1) process a request just before it is sent to the Downloader (i.e. right before Scrapy sends the request to the website);
        (2) change received response before passing it to a spider;
        (3) send a new Request instead of passing received response to a spider;
        (4) pass response to a spider without fetching a web page;
        (5) silently drop some requests.
    
    6、爬虫中间件(Spider Middlewares)
    位于EGINE和SPIDERS之间,主要工作是处理SPIDERS的输入(即responses)和输出(即requests)
    位于ENGINE和DOWNLOADER中间,主要对下载的文件进行处理。

    那么这五个部分实际上需要我们写的就是就是SPIDER和PIPLINES这两个部分。

    三 关于scrapy框架的安装:

    #Windows平台
        1、pip3 install wheel #安装后,便支持通过wheel文件安装软件,wheel文件官网:https://www.lfd.uci.edu/~gohlke/pythonlibs
        3、pip3 install lxml
        4、pip3 install pyopenssl
        5、下载并安装pywin32:https://sourceforge.net/projects/pywin32/files/pywin32/
        6、下载twisted的wheel文件:http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
        7、执行pip3 install 下载目录Twisted-17.9.0-cp36-cp36m-win_amd64.whl
        8、pip3 install scrapy
      
    #Linux平台
        1、pip3 install scrapy

    四 安装完之后我们需要在命令行进行相关的操作:

    # 1 查看帮助
        scrapy -h
        scrapy <command> -h
    
    # 2 有两种命令:其中Project-only必须切到项目文件夹下才能执行,而Global的命令则不需要
        Global commands:
            startproject #创建项目
            genspider    #创建爬虫程序
            settings     #如果是在项目目录下,则得到的是该项目的配置
            runspider    #运行一个独立的python文件,不必创建项目
            shell        #scrapy shell url地址  在交互式调试,如选择器规则正确与否
            fetch        #独立于程单纯地爬取一个页面,可以拿到请求头
            view         #下载完毕后直接弹出浏览器,以此可以分辨出哪些数据是ajax请求
            version      #scrapy version 查看scrapy的版本,scrapy version -v查看scrapy依赖库的版本
        Project-only commands:
            crawl        #运行爬虫,必须创建项目才行,确保配置文件中ROBOTSTXT_OBEY = False
            check        #检测项目中有无语法错误
            list         #列出项目中所包含的爬虫名
            edit         #编辑器,一般不用
            parse        #scrapy parse url地址 --callback 回调函数  #以此可以验证我们的回调函数是否正确
            bench        #scrapy bentch压力测试
    
    # 3 官网链接
        https://docs.scrapy.org/en/latest/topics/commands.html

    五 项目目录结构:

    '''
    project_name/
       scrapy.cfg               项目的主配置信息,用来部署scrapy时使用,爬虫相关的配置信息在settings.py文件中。
       project_name/
           __init__.py
           items.py             设置数据存储模板,用于结构化数据,如:Django的Model
           pipelines.py         数据处理行为,如:一般结构化的数据持久化
           settings.py          配置文件,如:递归的层数、并发数,延迟下载等。强调:配置文件的选项必须大写否则视为无效,正确写法USER_AGENT='xxxx'
           spiders/
               __init__.py
               爬虫1.py          爬虫目录,如:创建文件,编写爬虫规则
               爬虫2.py
               爬虫3.py
    
    '''

    注意事项:
    1、一般我们直接使用网站域名来命名spider文件名
    2、对于每次都要使用命令行来启东程序是很麻烦的,那么我们如何启动程序直接使用pycharm启动程序呢?
    #在项目根目录下新建:entrypoint.py
    from scrapy.cmdline import execute
    execute(['scrapy', 'crawl', '爬虫文件名'])

     六 spider类:

    Spiders是定义如何抓取某个站点(或一组站点)的类,包括如何执行爬行(即跟随链接)以及如何从其页面中提取结构化数据(即抓取项目)。
    换句话说,Spiders是您为特定站点(或者在某些情况下,一组站点)爬网和解析页面定义自定义行为的地方。 

    那么关于spider类中方法的执行以及顺序:

    循环执行如下过程!!!!!

    '''
    1、 生成初始的Requests来爬取第一个URLS,并且标识一个回调函数
         第一个请求定义在start_requests()方法内默认从start_urls列表中获得url地址来生成Request请求,
         默认的回调函数是parse方法。回调函数在下载完成返回response时自动触发
    
    2、 在回调函数中,解析response并且返回值
         返回值可以4种:
              包含解析数据的字典
              Item对象
              新的Request对象(新的Requests也需要指定一个回调函数)
              或者是可迭代对象(包含Items或Request)
    
    3、在回调函数中解析页面内容
       通常使用Scrapy自带的Selectors,但很明显你也可以使用Beutifulsoup,lxml或其他你爱用啥用啥。
    
    4、最后,针对返回的Items对象将会被持久化到数据库
       通过Item Pipeline组件存到数据库:https://docs.scrapy.org/en/latest/topics/item-pipeline.html#topics-item-pipeline)
       或者导出到不同的文件(通过Feed exports:https://docs.scrapy.org/en/latest/topics/feed-exports.html#topics-feed-exports)
    
    '''
  • 相关阅读:
    XML和JSON两种数据交换格式的比较
    Mysql主从安装配置
    mysqldump命令之数据库迁移
    报错:1130-host ... is not allowed to connect to this MySql server 开放mysql远程连接 不使用localhost
    Java Map 排序
    Jeff Dean 光辉事迹
    动态创建的link标签不会阻塞其后动态创建的script的加载与执行
    why?
    mongo find-matches value
    mongo find-in,or,and,not
  • 原文地址:https://www.cnblogs.com/zhangsanfeng/p/9641912.html
Copyright © 2011-2022 走看看