zoukankan      html  css  js  c++  java
  • 爬虫之Scrapy框架

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中。
    其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。

    Scrapy 使用了 Twisted异步网络库来处理网络通讯。整体架构大致如下

    Scrapy主要包括了以下组件:

    • 引擎(Scrapy)
      用来处理整个系统的数据流处理, 触发事务(框架核心)
    • 调度器(Scheduler)
      用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
    • 下载器(Downloader)
      用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
    • 爬虫(Spiders)
      爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
    • 项目管道(Pipeline)
      负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
    • 下载器中间件(Downloader Middlewares)
      位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
    • 爬虫中间件(Spider Middlewares)
      介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。
    • 调度中间件(Scheduler Middewares)
      介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。

    Scrapy运行流程大概如下:

        1. 引擎从调度器中取出一个链接(URL)用于接下来的抓取
        2. 引擎把URL封装成一个请求(Request)传给下载器
        3. 下载器把资源下载下来,并封装成应答包(Response)
        4. 爬虫解析Response
        5. 解析出实体(Item),则交给实体管道进行进一步的处理
        6. 解析出的是链接(URL),则把URL交给调度器等待抓取

    Scrapy的安装:

      Linux系统:

    pip install scrapy

      Windows系统:

          a. pip3 install wheel
    
          b. 下载twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
    
          c. 进入下载目录,执行 pip3 install Twisted‑17.1.0‑cp35‑cp35m‑win_amd64.whl
    
          d. pip3 install pywin32
    
          e. pip3 install scrapy

    Scrapy基本使用

    1.基本命令

    # 创建项目
    scrapy startproject corn
    # 进入项目
    cd corn
    # 创建爬虫程序
    scrapy genspider 应用名称 爬取网页的起始url (例如:scrapy genspider corn www.xxx.com)
    # 运行爬虫
    scrapy crawl 爬虫名称(corn) --nolog

    2.项目结构

    3.编写代码

    # -*- coding: utf-8 -*-
    import scrapy
    
    
    class XiaohuarSpider(scrapy.Spider):
        name = 'xiaohuar' #爬虫程序名
        # 允许爬取的域名(如果遇到非该域名的url则爬取不到数据)
        allowed_domains = ['www.xxx.com']
        # 起始爬取的url
        start_urls = ['http://www.xiaohuar.com/']
    
        # 访问起始URL并获取结果后的回调函数,该函数的response参数就是向起始的url发送请求后,获取的响应对象.该函数返回值必须为可迭代对象或者NUll
    
        def parse(self, response):
            print(response.text) #获取字符串类型的响应内容
            print(response.body)#获取字节类型的相应内容

    4.修改配置(setting.py)

    修改内容及其结果如下:
    19行:USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36' #伪装请求载体身份
    
    22行:ROBOTSTXT_OBEY = False  #可以忽略或者不遵守robots协议

    5.执行爬虫程序

    scrapy crawl xiaohuar(爬虫程序名字)

    执行程序后就拿到了整个页面的数据

    小试牛刀:

    将糗事百科首页中段子的内容和标题进行爬取

    # -*- coding: utf-8 -*-
    import scrapy
    
    class QiubaiSpider(scrapy.Spider):
        name = 'qiubai'
        allowed_domains = ['https://www.qiushibaike.com/']
        start_urls = ['https://www.qiushibaike.com/']
    
        def parse(self, response):
            #xpath为response中的方法,可以将xpath表达式直接作用于该函数中
            odiv = response.xpath('//div[@id="content-left"]/div')
            content_list = [] #用于存储解析到的数据
            for div in odiv:
                #xpath函数返回的为列表,列表中存放的数据为Selector类型的数据。我们解析到的内容被封装在了Selector对象中,需要调用extract()函数将解析的内容从Selecor中取出。
                author = div.xpath('.//div[@class="author clearfix"]/a/h2/text()')[0].extract()
                content=div.xpath('.//div[@class="content"]/span/text()')[0].extract()
    
                #将解析到的内容封装到字典中
                dic={
                    '作者':author,
                    '内容':content
                }
                #将数据存储到content_list这个列表中
                content_list.append(dic)
    
            return content_list

    执行程序:

        scrapy crawl 爬虫名称 :该种执行形式会显示执行的日志信息
        scrapy crawl 爬虫名称 --nolog:该种执行形式不会显示执行的日志信息
  • 相关阅读:
    c#调用系统资源大集合1
    ASP.NET GridView,DataList,Repeater日期格式显示
    msSQL存储过程中使用 IF ELSE 的规范示例
    PHP DOMDocument简单用法(XML创建、添加、删除、修改)
    PHP解析XML文档属性并编辑
    php修改和增加xml结点属性
    asp.net FileUpload控件文件格式的判断及文件大小限制
    《Linux内核设计与实现》读书笔记(四) 进程的调度
    《Linux内核设计与实现》读书笔记(七) 中断处理
    红黑树
  • 原文地址:https://www.cnblogs.com/zycorn/p/10268498.html
Copyright © 2011-2022 走看看