知识点七
scrapy框架的基本调用方式 命令行创建爬虫:scrapy startproject youyuan 命令行创建爬虫:scrapy genspider -t crawl yy 'youyuan.com' 爬虫名不能跟项目名相同 运行爬虫:scrapy crawl yy(爬虫名) 分布式爬虫运行:scrapy runspider yy.py(爬虫文件名) 分布式发送指令 lpush yyspider:start_urls + 起始网址 with一个对象执行该对象的__enter__方法然后执行__exit__方法,这两个方法需要配合使用。 python的默认解析式html.parser 成员修饰符 私有属性只能在自己内部直接调用,如果要在外部或者子类中调用方式为_Foo__age_ 3. Local的作用? 类似于threading.local的作用,但是是他的升级版(greentlet.get_current()) __storage__ = { 1231: {}, 1231: {} } 4. LocalStack作用? 将Local中__storage__的值维护成一下结构: __storage__ = { 1231: {stack:[],}, 1231: {stack:[],} } 5. 为什么导入request,就可以使用? 每次执行request.xx方法时,会触发LocalProxy对象的__getattr__等方法,由方法每次动态的使用 LocalStack去Local中获取数据。 6.如何学的? - 网上找一些博客学习 - 春生博客 - 官方文档 - 源码 7.flask使用的组件? 扩展: 1. flask-session 2. DBUtils 3. wtforms 4. sqlalchemy 8. metaclass相关 - 默认类时有谁创建:type创建 - 类创建2中方式: class Foo:pass type('Foo',(object,),{}) - 执行创建类的mytype class Foo(metaclass=MyType): # __metaclass__ = MyType pass MyType('Foo',(object,),{}) - 源码 如果类以基类中未指定metaclass: - __new__ - __init__ 如果类以基类中指定metaclass: - 创建类 MyType.__init__ - 创建对象 MyType.__call__ - __new__ - __init__ 9. 令你印象深刻的事(好神奇)。 class Foo(object): def __init__(self,name,age): self.name = name self.__age = age def func(self): print(self.__age) obj = Foo('oldboy',50) print(obj.name) print(obj._Foo__age) PS:私有字段子类中也不能访问 10.索引实现原理 - B+ tree - hash 11.无法命中索引 - like - 函数 - > - != - group by - or 12. 数据库优化方案 - 避免使用select * - 固定长度在前面 - 内存代替表,如:性别等 - 读写分离 - 分库 - 分表 - 水平分表 - 垂直分表 - 命中索引 - 组合索引代替索引合并 - 尽量使用短索引 - 如果取一条数据时,使用limit 1 select id,name from tb where name ='alex' limit 1; - 使用连接(JOIN)来代替子查询(Sub-Queries) 注意:char/varchar区别