台北Unity开发者研讨会 笔记

当今天只要持续更新 **scrapy爬取美女图片 **一连串文章,可是发现
**动用免费的代办ip都格外勿安静,有时候连接达,有时候连接不达到
**,所以我思找到 **安定的代办i p,下次再次创新scrapy爬取美女图片的许本着倒爬虫 **
文章。(自家的新书《Python爬虫开发以及品类实战》颁发了,大家在这边可以观看样章

正文转自:http://ndark.wordpress.com/2013/05/12/20130511-台北unity开发者研讨会-笔记/
(墙外)


图片 1图片 2

吓了,废话不多说,咱们上今天的主题。这同首文章是有关爬取盗墓笔记,主要技术中心是
**scrapy的使用 **,scrapy框架中 **使用mongodb数据库 **,
文件之保存

说明

正文仅只是是记,若发生笔误敬请谅解。


连锁参考连结

  1. 你不能不了解之Unity引擎知识

  2. Unity Asia Bootcamp 台北场–
    线上张

  3. Unity 今日篇糟糕在台设立亚洲开发者研讨会–
    巴哈姆特

  4. Unity着色器系统介绍(幻灯片)

  5. Unity 开发者论坛-台北场(Unity ASIA BOOTCAMP TOUR TAIPEI
    )研讨会
  6. 个别专访:Unity 教育说明和台湾高等教育的吃水对谈| Unity IN |
    社群✕媒体✕平台
  7. Unity –
    Mecanim性能及优化

总论

  1. 开发者成长速度和左侧快是Unity在台湾的优势。
  2. 当Facebook与360刘灠器中预设安装Unity Plugin。
  3. 大陸有超過400個Android商城。
  4. 征培训(新竹教育大学,高应科大等院校)。
  5. 鬼武者魂由Unity開發,Server端使用PHP。
  6. 开发者必须要留意的老三等:开发-平台-广告金流。

而不可不知的Unity開發技巧

  1. Unity三種網頁發佈的法子:WebPlayer,Flash(效能低下),Chrome
    NaCl(Native C++,不需要Plugin)。
  2. Plugin的本子分别:Stable,Release,Beta,Alpha。可以修改网页码来指定plugin的下载版本和来自。
  3. Web缓存许可证(收费):“我们提供的合Web播放器,可以在地方缓存的财力管之奇异扩展这是因我们的政工支出集团获得了扳平项合计,授权一般是授权为开发者提供了比较生之料想收益与。没有框框较小的功底“。
  4. 什么动态更新Unity产品的Source
    Code:透过将程式码输出为二维底TextAsset,然后在包至AssetBundle中。
  5. Unity4已救助动态字型,nGUI2.6才拉动态字型(东亚书)。(EZGUI时即令曾拉-感谢永康ㄉㄉ堤供情报)
  6. GameObject.Destroy不见面更换除了该物件的资源(Mesh,Texture,Material等)。
  7. Scaleform的光支援Unity3.5.x
  8. 网路伺服器的清单:Photon,Electron,SmartFox,uLink,SlimNet,SlimIOCP。
  9. NavMesh.Triangle()函式
  10. 皇帝的剑<蓝港在线>使用Unity开发之2D玩。
  11. 支付2D打的插件:Sprite
    Manager,Ex2D。
  12. Unity Cache Server是支付集团用来在不同平台(资源)发布时的加速法。
  13. Asset Server已无建議使用。
  14. 狂风,91都见面协调付出对Unity的金流SDK。
  15. 经设定优化发布之成品档案大小。

<p>
<p>
<p>
<p>
这次爬取的网址是
seputu.com。之前为时时在上面在线看盗墓笔记

活动平台优化中心

  1. 每个动态物件(角色)的三角形形面数在300至2000之间。
  2. 每个动态物件(角色)的Skinned Mesh Renderer仅用一个。
  3. 每个动态物件(角色)的质料数特所以一个。
  4. 每个动态物件(角色)的架子限制以30清以下。
  5. 使用Dynamic
    Batching合并那些杂类的动态物件。
  6. 静态物件设定为Static,方可进行Static Batching。
  7. 在3.5应用静态物件时移除Animation的零部件。
  8. 形势(Terrain)的开始解析度設定為257以下。
  9. 形势(Terrain)筆刷貼圖數目控制在4以下。
  10. 贴图解析度大小决定在1024以下。
  11. 3D游戏展Mipmap会增加记忆体但是只是加快效能。
  12. 貼圖uv控制在0~1。
  13. 乐档案利用ogg/mp3,短音效使用wav。
  14. 光源使用Light Map/Light Probe来取代动态光源。
  15. 以方向就。
  16. Pixel Light控制在1~2。
  17. 控制摄影机的z-near与z-far平面。
  18. 设定物件的删除距离。
  19. 稍物件又老远得时就无须打。
  20. 粒子系统将粒子总数控制在200以下。
  21. 粒子系统每个发射器发射粒子控制在50以下。
  22. 粒子的大大小小越聊越好。
  23. 十分小之粒子去掉alpha channel。
  24. 不要开粒子的打。
  25. 碰撞類型不要用Mesh Collider。
  26. 減少使用Animation組件。
  27. 不缩放的卡通,去除Scale Curves的参数。
  28. 倘只有以一个AnimationClip,就采用Unity 3.5之动画片系统。
  29. 应用Macanim(Unity 4的動畫系統),要衬托使用Body Mask。
  30. IK選用Generic Mode。Humanoid Mode在Android上會耗費嚴重的功用。
  31. 渲染时减少使用Alpha测试与alpha混合。
  32. Draw Call
    Batching分为Static与Dynamic。后者点数控制在900下,若含Position,Normal,UV,则是300。
  33. 使Texture Packing将不同物件的质料变为相同,但必须手动修改UV。
  34. 使用遮挡剔除时不时小心翼翼设定谨慎设定封堵器(墙)与Occludee的角色。设定PVS只,PV和动态目标,自动生成门户(会转移之山头)。
  35. 程式码,使用项目变数来暂存指标。
  36. 设定Fixed Delta Time在0.04到0.067之间。
  37. IOS发布每每以的很快和生不支持的颁发形式。
  38. Shader减少用数学函式,减少下Discard。Vertex使用Float,TextureUV使用Half,颜色及仅仅用Fixed。
  39. 于PowerVR的硬体下发生时光用有限独Vec2反会于快。
  40. 使用Profiler。
  41. 使用Manager的架构来支配物件会比较拿每个物件都悬挂上脚论效率高。

准我们之前的学习爬虫的做法,行使firebug审查元素,查看如何解析html
<p>
这次我们要拿写之名称,章节,章节名称,章节链接抽取出来,存储到数据库被,同时以文章的始末取出来存成txt文件。
<p>

资产包

  1. Resource这种读取资源的相(有2G限制)会渐渐移除,统一改用Asset
    Bundle(可离线创造)
  2. Web缓存只能放资产包。
  3. Asset Bundle建出之后是起相容性的,ios与android的Asset
    Bundle与另平台互不相容。
  4. BuildPipeline.BuildAssetBundle()是因此来树多只资本的资产包。
  5. BuildPipeline.BuildStreamedSceneAssetBundle()则是为此来树立多个情景的资产包。
  6. 用BuildAssetBundleOptions.DeterministicAssetBundle来建对基金的杂凑的ID做增量发布。
  7. 成本 assetBundleObj = WWW.AssetBundle->使用受到的资产包。 新
    捆绑可又开展加密动作。AssetBundle.Load() –
    >载入资产。
  8. 卸載流程:
    GameObject.Destroy()
    AssetBundle.Unload
    (false)只會卸載WWW.AssetBundle,AssetBundle.Unload(true)則會卸載WWW.AssetBundle以及相關資源。true的企图相較於使用false再下Resources.UnloadUnusedAssets
    ()作用並不相同。 把同之資源基底打包為Asset捆绑
    使用BuildPipeline.PushAssetDependencies()来树资金管里面的关连性。
  9. 范例1:把共同接入资源打包。
    Push
    Build共通资源包
    Push
    Build物件包1
    Pop
    Push
    Build物件包2
    Pop
    Pop
  10. 范例2:把Level所运用的资源为做成依赖形式。
    Push
    Build Level1
    Push
    Build Level2 (依赖于Level1)
    Push
    Build Level3 (依赖于Level2与Level2)
  11. 范例3:把场景包依赖让一块通资源包
  12. 将设定各资源包依赖关系的XML设定为ScriptableObject并包到Asset
    Bundle内
  13. 拿气象切割为Asset Bundle的法门,等分,如切成九宫格。
  14. 用气象切割为Asset
    Bundle的法,分大物件,中物件,小物件。让雅物件先念入先显示。
  15. WWW.LoadFromCacheOrDownload()可设定版号。
  16. WWW.LoadFromCacheOrDownload的crc产生办法而透过错误采取以及一个函式来发出真确值。
  17. 程式碼的加密過程:Assembly->Byte->TextAsset->加密->Asset
    Bundle->加密->TextAsset->Asset Bundle。
  18. 用native dll来保护要程式码,但Web应用不克采用dll。

<p>
看一下html结构就会意识是页面结构异常鲜明,标题的html节点是 **
div class = ”mulu-title”,章节的节点是 div class= “box”
**,每一样章节的节点是 div class= “box”中的li标签

集合在色器系统

  1. 经Shader Name就见面自动出选择Shader的架。
  2. SubShader可视为真正的Shader,由上而下执行。
  3. SubShader的Tag表示什么履行:可指定执行之顺序。
  4. SubShader的Tag表示什么表現。
  5. 著色方式Vertex Lit:快,限制多。
  6. 着色方式Forward:将灯光分为最根本+不根本和另外重大。区分方式可手动,也足以以强度及动向来自动决定。
  7. 着色方式Deferred:手机不可知采用,也未扶透明。
  8. CG/HSSL会被转译为GLSL。
  9. 动用基本Shader会需要写132实践之程式,使用Surface
    Shader来举行隐藏简化:标明surfae code与light code。
  10. #pragma debug可以用潜伏的程式码显示在程式码中。
  11. 由此user define keyword将参数传入shader中。

<p>

然后我们用首先章的链接
http://seputu.com/biji1/1.html开拓,上面就是是文章的始末。
<p>

<p>
足见到文章的内容是以 **div class =”content-body”中的p标签
**包装起来的,总体来说提取难度颇聊。

打开cmd,输入 **scrapy startproject daomubiji
**,这时候会扭转一个工,然后我将全路工程复制到 **pycharm **中

**齐图虽是工程的结构 **。

    DaomubijiSpider.py ------Spider 蜘蛛

    items.py -----------------对要爬取数据的模型定义

    pipelines.py-------------处理要存储的数据(存到数据库和写到文件)

    settings.py----------------对Scrapy的配置

    main.py -------------------启动爬虫

    test.py -------------------- 测试程序(不参与整体运行)

下面将 **分析和储存
**的代码贴一下,完整代码已经上传到github:https://github.com/qiyeboy/daomuSpider。

DaomubijiSpider.py (解析html)
#coding:utf-8
import scrapy
from scrapy.selector import Selector
from daomubiji.items import DaomubijiItem


class daomuSpider(scrapy.Spider):
    name = "daomu"
    allowed_domains = ["seputu.com"]
    start_urls = ["http://seputu.com/"]
    ''.split()

    def parse(self, response):
        selector = Selector(response)
        mulus= selector.xpath("//div[@class='mulu']/div[@class='mulu-title']/center/h2/text()").extract()#将目录提取出来
        boxs = selector.xpath("//div[@class='mulu']/div[@class='box']")#.extract()
        for i in range(len(mulus)):
            mulu = mulus[i]#提取出来一个目录
            box = boxs[i]#提取出来一个box
            texts = box.xpath(".//ul/li/a/text()").extract()#将文本提取出来
            urls  = box.xpath(".//ul/li/a/@href").extract()#将链接提取出来
            for j in range(len(urls)):
                item = DaomubijiItem()
                item['bookName'] = mulu
                try:
                    item['bookTitle'] = texts[j].split(' ')[0]
                    item['chapterNum'] = texts[j].split(' ')[1]
                    item['chapterName'] = texts[j].split(' ')[2]
                    item['chapterUrl'] = urls[j]
                    request = scrapy.Request(urls[j],callback=self.parseBody)
                    request.meta['item'] = item
                    yield request


                except Exception,e:
                    print 'excepiton',e
                    continue



    def parseBody(self,response):
        '''
        解析小说章节中的内容
        :param response:
        :return:
        '''
        item = response.meta['item']
        selector = Selector(response)

        item['chapterContent'] ='\r\n'.join(selector.xpath("//div[@class='content-body']/p/text()").extract())
        yield item

   pipelines.py:(处理要存储的数据)

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
import os
from scrapy.pipelines.files import FilesPipeline
from daomubiji import settings
from pymongo import MongoClient

class DaomubijiPipeline(object):
    def process_item(self, item, spider):#将小说进行存储
        dir_path = '%s/%s/%s'%(settings.FILE_STORE,spider.name,item['bookName']+'_'+item['bookTitle'])#存储路径
        print 'dir_path',dir_path
        if not os.path.exists(dir_path):
            os.makedirs(dir_path)
        file_path = '%s/%s'%(dir_path,item['chapterNum']+'_'+item['chapterName']+'.txt')
        with open(file_path,'w') as file_writer:
            file_writer.write(item['chapterContent'].encode('utf-8'))
            file_writer.write('\r\n'.encode('utf-8'))

        file_writer.close()
        return item

class DaomuSqlPipeline(object):

    def __init__(self):
    #连接mongo数据库,并把数据存储
        client = MongoClient()#'mongodb://localhost:27017/'///'localhost', 27017///'mongodb://tanteng:123456@localhost:27017/'
        db = client.daomu
        self.books = db.books

    def process_item(self, item, spider):
        print 'spider_name',spider.name
        temp ={'bookName':item['bookName'],
               'bookTitle':item['bookTitle'],
               'chapterNum':item['chapterNum'],
               'chapterName':item['chapterName'],
               'chapterUrl':item['chapterUrl']
               }
        self.books.insert(temp)

        return item

属下切换到main.py所于目录,运行python main.py起先爬虫。

从未喽几分钟,爬虫就得了了,咱们扣押一下爬取的数量与文书

数据库数据:

今日的享用就顶此处,如果大家认为还可呀,记得打赏