Scrapy 框架

介绍

Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速、简单、可扩展的方式从网站中提取所需的数据。但目前Scrapy的用途十分广泛,可用于如数据挖掘、监测和自动化测试等领域,也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。

    Scrapy 是基于twisted框架开发而来,twisted是一个流行的事件驱动的python网络框架。因此Scrapy使用了一种非阻塞(又名异步)的代码来实现并发。

框架架构

整体架构大致如下

 

scrapy 取得响应页的cookies_shell

框架流程解析

  • 1、spiders产生request请求,将请求交给引擎
  • 2、引擎(EGINE)吧刚刚处理好的请求交给了调度器,以一个队列或者堆栈的形式吧这些请求保存起来,调度一个出来再传给引擎
  • 3、调度器(SCHEDULER)返回给引擎一个要爬取的url
  • 4、引擎把调度好的请求发送给download,通过中间件发送(这个中间件至少有 两个方法,一个请求的,一个返回的),
  • 5、一旦完成下载就返回一个response,通过下载器中间件,返回给引擎,引擎把response 对象传给下载器中间件,最后到达引擎
  • 6、引擎从下载器中收到response对象,从下载器中间件传给了spiders(spiders里面做两件事,1、产生request请求,2、为request请求绑定一个回调函数),spiders只负责解析爬取的任务。不做存储,
  • 7、解析完成之后返回一个解析之后的结果items对象及(跟进的)新的Request给引擎,就被ITEM PIPELUMES处理了
  • 8、引擎将(Spider返回的)爬取到的Item给Item Pipeline,存入数据库,持久化,如果数据不对,可重新封装成一个request请求,传给调度器
  • 9、(从第二步)重复直到调度器中没有更多地request,引擎关闭该网站

核心组件

引擎

引擎负责控制系统所有组件之间的数据流,并在某些动作发生时触发事件。

调度器

用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回.

可以想像成一个URL的优先级队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址

下载器

用于下载网页内容, 并将网页内容返回给引擎

下载器是建立在 twisted 这个高效的异步模型上的

爬虫

SPIDERS是开发人员自定义的类,用来解析responses,并且提取items,或者发送新的请求

项目管道(ITEM PIPLINES)

在items被提取后负责处理它们

主要包括清理、验证、持久化(比如存到数据库)等操作

下载器中间件

 下载器中间件是在引擎及下载器之间的特定钩子(specific hook),处理Downloader传递给引擎的response。

其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。


爬虫中间件

 Spider中间件是在引擎及Spider之间的特定钩子(specific hook),处理spider的输入(response)和输出(items及requests)。

其提供了一个简便的机制,通过插入自定义代码来扩展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



全局命令:所有文件夹都使用的命令,可以不依赖与项目文件也可以执行
项目的文件夹下执行的命令
1、scrapy startproject Myproject #创建项目
   cd Myproject

2、scrapy genspider baidu www.baidu.com  #创建爬虫程序,baidu是爬虫名,定位爬虫的名字
#写完域名以后默认会有一个url,

3、scrapy settings --get BOT_NAME  #获取配置文件

#全局:4、scrapy runspider budui.py

5、scrapy runspider AMAZON\spiders\amazon.py  #执行爬虫程序
   在项目下:scrapy crawl amazon  #指定爬虫名,定位爬虫程序来运行程序
    #robots.txt 反爬协议:在目标站点建一个文件,里面规定了哪些能爬,哪些不能爬
    # 有的国家觉得是合法的,有的是不合法的,这就产生了反爬协议
    # 默认是ROBOTSTXT_OBEY = True
    # 修改为ROBOTSTXT_OBEY = False  #默认不遵循反扒协议

6、scrapy shell https://www.baidu.com  #直接超目标站点发请求
     response
     response.status
     response.body
     view(response)

7、scrapy view https://www.taobao.com #如果页面显示内容不全,不全的内容则是ajax请求实现的,以此快速定位问题

8、scrapy version  #查看版本

9、scrapy version -v #查看scrapy依赖库锁依赖的版本

10、scrapy fetch --nolog http://www.logou.com    #获取响应的内容

11、scrapy fetch --nolog --headers http://www.logou.com  #获取响应的请求头
    (venv3_spider) E:\twisted\scrapy框架\AMAZON>scrapy fetch --nolog --headers http://www.logou.com
    > Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    > Accept-Language: en
    > User-Agent: Scrapy/1.5.0 (+https://scrapy.org)
    > Accept-Encoding: gzip,deflate
    >
    < Content-Type: text/html; charset=UTF-8
    < Date: Tue, 23 Jan 2018 15:51:32 GMT
    < Server: Apache
    >代表请求
    <代表返回

10、scrapy shell http://www.logou.com #直接朝目标站点发请求

11、scrapy check  #检测爬虫有没有错误

12、scrapy list  #所有的爬虫名

13、scrapy parse http://quotes.toscrape.com/ --callback parse #验证回调函函数是否成功执行

14、scrapy bench #压力测试



创建项目以及启动爬虫



scrapy startproject xx 
cd xx 
scrapy genspider chouti chouti.com 

scrapy crawl chouti --nolog



scrapy 取得响应页的cookies_python_02

 默认只能在cmd中执行爬虫,如果想在pycharm中执行需要如下操作



#在项目目录下新建:entrypoint.py
from scrapy.cmdline import execute
# execute(['scrapy', 'crawl', 'amazon','--nolog'])  # 不要日志打印
# execute('scrapy crawl amazon'.split())  # 需要列表的形式, 也可以字符串切割为列表传入 

# 多个参数的传递也是一个一个传即可
# "acrapy crawl amzaon -a keyword=iphone8"
execute(['scrapy', 'crawl', 'amazon1','-a','keyword=iphone8','--nolog'])  

# execute(['scrapy', 'crawl', 'amazon1'])



 记得设置编码格式在 windows 环境下



import sys,os 
sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')



项目结构



project_name/
   scrapy.cfg
   project_name/
       __init__.py
       items.py
       pipelines.py
       settings.py
       spiders/
           __init__.py
           爬虫1.py
           爬虫2.py
           爬虫3.py



scrapy 取得响应页的cookies_shell_03