北京建网站需要多少钱动漫网站html
news/
2025/9/26 9:31:21/
文章来源:
北京建网站需要多少钱,动漫网站html,如何把做的网站变成链接,购物网站设计说明一、 python语法
1. 请说一下你对迭代器和生成器的区别#xff1f;
2. 什么是线程安全#xff1f;
3. 你所遵循的代码规范是什么#xff1f;请举例说明其要求#xff1f;
4. Python中怎么简单的实现列表去重#xff1f;
5. python 中 yield 的用法…
一、 python语法
1. 请说一下你对迭代器和生成器的区别
2. 什么是线程安全
3. 你所遵循的代码规范是什么请举例说明其要求
4. Python中怎么简单的实现列表去重
5. python 中 yield 的用法
6. 什么是面向对象编程
7. python2和python3的区别?
8. 谈谈你对GIL锁对python多线程的影响
9. python是如何进行内存管理的
二、 Linux基础和数据结构与算法
1. 10个常用的Linux命令
2. find和grep的区别
3. 什么是阻塞什么是非阻塞
4. 描述数组、链表、队列、堆栈的区别
5. 你知道几种排序,讲一讲你最熟悉的一种?
三、 Web框架
1.django 中当一个用户登录 A 应用服务器进入登录状态然后下次请求被 nginx 代理到 B 应用服务器会出现什么影响
2.跨域请求问题django怎么解决的原理
3.请解释或描述一下Django的架构
4.django对数据查询结果排序怎么做降序怎么做查询大于某个字段怎么做
5.说一下DjangoMIDDLEWARES中间件的作用
6.你对Django的认识
7. Django重定向你是如何实现的用的什么状态码
8.ngnix的正向代理与反向代理
9. Tornado 的核是什么
10.Django 本身提供了 runserver为什么不能用来部署
四、 网络编程和前端
1.AJAX是什么如何使用AJAX
2. 常见的HTTP状态码有哪些
3. Post和get区别
4.cookie 和session 的区别
5.创建一个简单tcp服务器需要的流程
6.请简单说一下三次握手和四次挥手什么是2msl为什么要这样做
五、 爬虫和数据库
1.scrapy和scrapy-redis有什么区别为什么选择redis数据库
2. 你用过的爬虫框架或者模块有哪些谈谈他们的区别或者优缺点
3.你常用的mysql引擎有哪些各引擎间有什么区别
4.描述下scrapy框架运行的机制
5.什么是关联查询有哪些
6.写爬虫是用多进程好还是多线程好 为什么
7.数据库的优化
8.常见的反爬虫和应对方法
9.分布式爬虫主要解决什么问题
10.爬虫过程中验证码怎么处理 请说一下你对迭代器和生成器的区别 答1迭代器是一个更抽象的概念任何对象如果它的类有next方法和iter方法返回自己本身。对于string、list、dict、tuple等这类容器对象使用for循环遍历是很方便的。在后台for语句对容器对象调用iter()函数iter()是python的内置函数。iter()会返回一个定义了next()方法的迭代器对象它在容器中逐个访问容器内元素next()也是python的内置函数。在没有后续元素时next()会抛出一个StopIteration异常
2生成器Generator是创建迭代器的简单而强大的工具。它们写起来就像是正规的函数只是在需要返回数据的时候使用yield语句。每次next()被调用时生成器会返回它脱离的位置它记忆语句最后一次执行的位置和所有的数据值
区别生成器能做到迭代器能做的所有事,而且因为自动创建了__iter__()和next()方法,生成器显得特别简洁,而且生成器也是高效的使用生成器表达式取代列表解析可以同时节省内存。除了创建和保存程序状态的自动方法,当发生器终结时,还会自动抛出StopIteration异常
什么是线程安全
线程安全是在多线程的环境下能够保证多个线程同时执行时程序依旧运行正确, 而且要保证对于共享的数据可以由多个线程存取但是同一时刻只能有一个线程进行存取。多线程环境下解决资源竞争问题的办法是加锁来保证存取操作的唯一性。
你所遵循的代码规范是什么请举例说明其要求
PEP8
1变量
常量:大写加下划线 USER_CONSTANT
私有变量 : 小写和一个前导下划线 _private_value
Python 中不存在私有变量一说若是遇到需要保护的变量使用小写和一个前导下划线。但这只是程序员之间的一个约定用于警告说明这是一个私有变量外部类不要去访问它。但实际上外部类还是可以访问到这个变量。
内置变量 : 小写两个前导下划线和两个后置下划线 __class__
两个前导下划线会导致变量在解释期间被更名。这是为了避免内置变量和其他变量产生冲突。用户定义的变量要严格避免这种风格。以免导致混乱。
2 函数和方法
总体而言应该使用小写和下划线。但有些比较老的库使用的是混合大小写即首单词小写之后每个单词第一个字母大写其余小写。但现在小写和下划线已成为规范。
私有方法 小写和一个前导下划线 这里和私有变量一样并不是真正的私有访问权限。同时也应该注意一般函数不要使用两个前导下划线(当遇到两个前导下划线时Python 的名称改编特性将发挥作用)。
特殊方法 小写和两个前导下划线两个后置下划线
这种风格只应用于特殊函数比如操作符重载等。
函数参数 : 小写和下划线缺省值等号两边无空格
3 类
类总是使用驼峰格式命名即所有单词首字母大写其余字母小写。类名应该简明精确并足以从中理解类所完成的工作。常见的一个方法是使用表示其类型或者特性的后缀例如:
SQLEngineMimeTypes对于基类而言可以使用一个 Base 或者 Abstract 前缀BaseCookieAbstractGroup
4 模块和包
除特殊模块 __init__ 之外模块名称都使用不带下划线的小写字母。
若是它们实现一个协议那么通常使用lib为后缀例如:
import smtplib
import os
import sys
5 关于参数
5.1 不要用断言来实现静态类型检测。断言可以用于检查参数但不应仅仅是进行静态类型检测。 Python 是动态类型语言静态类型检测违背了其设计思想。断言应该用于避免函数不被毫无意义的调用。
5.2 不要滥用 *args 和 **kwargs。*args 和 **kwargs 参数可能会破坏函数的健壮性。它们使签名变得模糊而且代码常常开始在不应该的地方构建小的参数解析器。
6 其他
6.1 使用 has 或 is 前缀命名布尔元素
is_connect True has_member False
6.2 用复数形式命名序列
members [user_1, user_2]
6.3 用显式名称命名字典
person_address {user_1:10 road WD, user_2 : 20 street huafu}
6.4 避免通用名称
诸如 list, dict, sequence 或者 element 这样的名称应该避免。
6.5 避免现有名称
诸如 os, sys 这种系统已经存在的名称应该避免。
7 一些数字
一行列数 : PEP 8 规定为 79 列。根据自己的情况比如不要超过满屏时编辑器的显示列数。
一个函数 : 不要超过 30 行代码, 即可显示在一个屏幕类可以不使用垂直游标即可看到整个函数。
一个类 : 不要超过 200 行代码不要有超过 10 个方法。一个模块 不要超过 500 行。
8 验证脚本
可以安装一个 pep8 脚本用于验证你的代码风格是否符合 PEP8。
Python中怎么简单的实现列表去重
Set
python 中 yield 的用法
答 yield简单说来就是一个生成器这样函数它记住上次返 回时在函数体中的位置。对生成器第 二次或n 次调用跳转至该函 次调用跳转至该函 数。
什么是面向对象编程
面向对象编程是一种解决软件复用的设计和编程方法。 这种方法把软件系统中相近相似的操作逻辑和操作 应用数据、状态,以类的型式描述出来,以对象实例的形式在软件系统中复用,以达到提高软件开发效率的作用。
python2和python3的区别?
1.性能 Py3.0运行 pystone benchmark的速度比Py2.5慢30%。Guido认为Py3.0有极大的优化空间在字符串和整形操作上可 以取得很好的优化结果。 Py3.1性能比Py2.5慢15%还有很大的提升空间。 2.编码 Py3.X源码文件默认使用utf-8编码 3. 语法 1去除了全部改用! 2去除全部改用repr() 3关键词加入as 和with还有True,False,None 4整型除法返回浮点数要得到整型结果请使用// 5加入nonlocal语句。使用noclocal x可以直接指派外围非全局变量 6去除print语句加入print()函数实现相同的功能。同样的还有 exec语句已经改为exec()函数 7改变了顺序操作符的行为例如xy当x和y类型不匹配时抛出TypeError而不是返回随即的 bool值 8输入函数改变了删除了raw_input用input代替 2.X:guess int(raw_input(Enter an integer : )) # 读取键盘输入的方法 3.X:guess int(input(Enter an integer : ))
9去除元组参数解包。不能def(a, (b, c)):pass这样定义函数了 10新式的8进制字变量相应地修改了oct()函数。 11增加了 2进制字面量和bin()函数
12扩展的可迭代解包。在Py3.X 里a, b, *rest seq和 *rest, a seq都是合法的只要求两点rest是list 对象和seq是可迭代的。 13新的super()可以不再给super()传参数
14新的metaclass语法 class Foo(*bases, **kwds): pass 15支持class decorator。用法与函数decorator一样 4. 字符串和字节串 1现在字符串只有str一种类型但它跟2.x版本的unicode几乎一样。
2关于字节串请参阅“数据类型”的第2条目 5.数据类型 1Py3.X去除了long类型现在只有一种整型——int但它的行为就像2.X版本的long 2新增了bytes类型对应于2.X版本的八位串定义一个bytes字面量的方法如下 str对象和bytes对象可以使用.encode() (str - bytes) or .decode() (bytes - str)方法相互转化。 3dict的.keys()、.items 和.values()方法返回迭代器而之前的iterkeys()等函数都被废弃。同时去掉的还有 dict.has_key()用 in替代它吧 6.面向对象 1引入抽象基类Abstraact Base ClassesABCs。 2容器类和迭代器类被ABCs化。 3迭代器的next()方法改名为__next__()并增加内置函数next()用以调用迭代器的__next__()方法 4增加了abstractmethod和 abstractproperty两个 decorator编写抽象方法属性更加方便。 7.异常 1所以异常都从 BaseException继承并删除了StardardError 2去除了异常类的序列行为和.message属性 3用 raise Exception(args)代替 raise Exception, args语法 4捕获异常的语法改变引入了as关键字来标识异常实例
5异常链因为__context__在3.0a1版本中没有实现 8.模块变动 1移除了cPickle模块可以使用pickle模块代替。最终我们将会有一个透明高效的模块。 2移除了imageop模块 3移除了 audiodev, Bastion, bsddb185, exceptions, linuxaudiodev, md5, MimeWriter, mimify, popen2, rexec, sets, sha, stringold, strop, sunaudiodev, timing和xmllib模块 4移除了bsddb模块(单独发布可以从http://www.jcea.es/programacion/pybsddb.htm获取) 5移除了new模块 6os.tmpnam()和os.tmpfile()函数被移动到tmpfile模块下 7tokenize模块现在使用bytes工作。主要的入口点不再是generate_tokens而是 tokenize.tokenize() 9.其它 1xrange() 改名为range()要想使用range()获得一个list必须显式调用 list(range(10)) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2bytes对象不能hash也不支持 b.lower()、b.strip()和b.split()方法但对于后两者可以使用 b.strip(b’ \n\t\r \f’)和b.split(b’ ‘)来达到相同目的 3zip()、map()和filter()都返回迭代器。而apply()、 callable()、coerce()、 execfile()、reduce()和reload ()函数都被去除了现在可以使用hasattr()来替换 callable(). hasattr()的语法如hasattr(string, __name__)
4string.letters和相关的.lowercase和.uppercase被去除请改用string.ascii_letters 等 5如果x y的不能比较抛出TypeError异常。2.x版本是返回伪随机布尔值的 6__getslice__系列成员被废弃。a[i:j]根据上下文转换为a.__getitem__(slice(I, j))或 __setitem__和 __delitem__调用 7file类被废弃
谈谈你对GIL锁对python多线程的影响
GIL的全称是Global Interpreter Lock(全局解释器锁)来源是python设计之初的考虑为了数据安全所做的决定。每个CPU在同一时间只能执行一个线程在单核CPU下的多线程其实都只是并发不是并行并发和并行从宏观上来讲都是同时处理多路请求的概念。但并发和并行又有区别并行是指两个或者多个事件在同一时刻发生而并发是指两个或多个事件在同一时间间隔内发生。
在Python多线程下每个线程的执行方式
1、获取GIL
2、执行代码直到sleep或者是python虚拟机将其挂起。
3、释放GIL
可见某个线程想要执行必须先拿到GIL我们可以把GIL看作是“通行证”并且在一个python进程中GIL只有一个。拿不到通行证的线程就不允许进入CPU执行。
在Python2.x里GIL的释放逻辑是当前线程遇见IO操作或者ticks计数达到100ticks可以看作是Python自身的一个计数器专门做用于GIL每次释放后归零这个计数可以通过 sys.setcheckinterval 来调整进行释放。而每次释放GIL锁线程进行锁竞争、切换线程会消耗资源。并且由于GIL锁存在python里一个进程永远只能同时执行一个线程(拿到GIL的线程才能执行)。 IO密集型代码(文件处理、网络爬虫等)多线程能够有效提升效率(单线程下有IO操作会进行IO等待造成不必要的时间浪费而开启多线程能在线程A等待时自动切换到线程B可以不浪费CPU的资源从而能提升程序执行效率)所以多线程对IO密集型代码比较友好。
python是如何进行内存管理的
一、垃圾回收python不像CJava等语言一样他们可以不用事先声明变量类型而直接对变量进行赋值。对Python语言来讲对象的类型和内存都是在运行时确定的。这也是为什么我们称Python语言为动态类型的原因这里我们把动态类型可以简单的归结为对变量内存地址的分配是在运行时自动判断变量类型并对变量进行赋值。
二、引用计数Python采用了类似Windows内核对象一样的方式来对内存进行管理。每一个对象都维护这一个对指向该对对象的引用的计数。当变量被绑定在一个对象上的时候该变量的引用计数就是1(还有另外一些情况也会导致变量引用计数的增加),系统会自动维护这些标签并定时扫描当某标签的引用计数变为0的时候该对就会被回收。
三、内存池机制Python的内存机制以金字塔行-1-2层主要有操作系统进行操作 第0层是C中的mallocfree等内存分配和释放函数进行操作 第1层和第2层是内存池有Python的接口函数PyMem_Malloc函数实现当对象小于256K时有该层直接分配内存 第3层是最上层也就是我们对Python对象的直接操作
在 C 中如果频繁的调用 malloc 与 free 时,是会产生性能问题的.再加上频繁的分配与释放小块的内存会产生内存碎片. Python 在这里主要干的工作有: 如果请求分配的内存在1~256字节之间就使用自己的内存管理系统,否则直接使用 malloc. 这里还是会调用 malloc 分配内存,但每次会分配一块大小为256k的大块内存. 经由内存池登记的内存到最后还是会回收到内存池,并不会调用 C 的 free 释放掉.以便下次使用.对于简单的Python对象例如数值、字符串元组tuple不允许被更改)采用的是复制的方式(深拷贝?)也就是说当将另一个变量B赋值给变量A时虽然A和B的内存空间仍然相同但当A的值发生变化时会重新给A分配空间A和B的地址变得不再相同
Linux基础和数据结构与算法
1. 10个常用的Linux命令
答案略
2. find和grep的区别
grep命令是一种强大的文本搜索工具grep搜索内容串可以是正则表达式允许对文本文件进行模式查找。如果找到匹配模式 grep打印包含模式的所有行。
find通常用来在特定的目录下搜索符合条件的文件也可以用来搜索特定用户属主的文件。
3. 什么是阻塞什么是非阻塞
阻塞调用是指调用结果返回之前当前线程会被挂起。函数只有在得到结果之后才会返回。有人也许会把阻塞调用和同步调用等同起来实际上他是不同的。对于同步调用来说很多时候当前线程还是激活的只是从逻辑上当前函数没有返回而已。例如我们在CSocket中调用Receive函数如果缓冲区中没有数据这个函数就会一直等待直到有数据才返回。而此时当前线程还会继续处理各种各样的消息。如果主窗口和调用函数在同一个线程中除非你在特殊的界面操作函数中调用其实主界面还是应该可以刷新。socket接收数据的另外一个函数recv则是一个阻塞调用的例子。当socket工作在阻塞模式的时候如果没有数据的情况下调用该函数则当前线程就会被挂起直到有数据为止。
非阻塞和阻塞的概念相对应指在不能立刻得到结果之前该函数不会阻塞当前线程而会立刻返回。
4. 描述数组、链表、队列、堆栈的区别
数组与链表是数据存储方式的概念数组在连续的空间中存储数据而链表可以在非连续的空间中存储数据
队列和堆栈是描述数据存取方式的概念队列是先进先出而堆栈是后进先出队列和堆栈可以用数组来实现也可以用链表实现。
5. 你知道几种排序,讲一讲你最熟悉的一种?
Web框架
1.django 中当一个用户登录 A 应用服务器进入登录状态然后下次请求被 nginx 代理到 B 应用服务器会出现什么影响
如果用户在A应用服务器登陆的session数据没有共享到B应用服务器纳米之前的登录状态就没有了。
2.跨域请求问题django怎么解决的原理
启用中间件
post请求
验证码
表单中添加{%csrf_token%}标签
3.请解释或描述一下Django的架构
对于Django框架遵循MVC设计并且有一个专有名词MVT
M全拼为Model与MVC中的M功能相同负责数据处理内嵌了ORM框架
V全拼为View与MVC中的C功能相同接收HttpRequest业务处理返回HttpResponse
T全拼为Template与MVC中的V功能相同负责封装构造要返回的html内嵌了模板引擎
4.django对数据查询结果排序怎么做降序怎么做查询大于某个字段怎么做
排序使用order_by()
降序需要在排序字段名前加-
查询字段大于某个值使用filter(字段名_gt值)
5.说一下DjangoMIDDLEWARES中间件的作用
答中间件是介于request与response处理之间的一道处理过程相对比较轻量级并且在全局上改变django的输入与输出。 6.你对Django的认识
Django是走大而全的方向它最出名的是其全自动化的管理后台只需要使用起ORM做简单的对象定义它就能自动生成数据库结构、以及全功能的管理后台。
Django内置的ORM跟框架内的其他模块耦合程度高。 应用程序必须使用Django内置的ORM否则就不能享受到框架内提供的种种基于其ORM的便利理论上可以切换掉其ORM模块但这就相当于要把装修完毕的房子拆除重新装修倒不如一开始就去毛胚房做全新的装修。
Django的卖点是超高的开发效率其性能扩展有限采用Django的项目在流量达到一定规模后都需要对其进行重构才能满足性能的要求。
Django适用的是中小型的网站或者是作为大型网站快速实现产品雏形的工具。
Django模板的设计哲学是彻底的将代码、样式分离 Django从根本上杜绝在模板中进行编码、处理数据的可能。
7. Django重定向你是如何实现的用的什么状态码
使用HttpResponseRedirect
redirect和reverse
状态码302,301
8.ngnix的正向代理与反向代理
答正向代理 是一个位于客户端和原始服务器(origin server)之间的服务器为了从原始服务器取得内容客户端向代理发送一个请求并指定目标(原始服务器)然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。
反向代理正好相反对于客户端而言它就像是原始服务器并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间中的内容发送普通请求接着反向代理将判断向何处(原始服务器)转交请求并将获得的内容返回给客户端就像这些内容原本就是它自己的一样。
9. Tornado 的核是什么
Tornado 的核心是 ioloop 和 iostream 这两个模块前者提供了一个高效的 I/O 事件循环后者则封装了 一个无阻塞的 socket 。通过向 ioloop 中添加网络 I/O 事件利用无阻塞的 socket 再搭配相应的回调 函数便可达到梦寐以求的高效异步执行。
10.Django 本身提供了 runserver为什么不能用来部署
runserver 方法是调试 Django 时经常用到的运行方式它使用 Django 自带的
WSGI Server 运行主要在测试和开发中使用并且 runserver 开启的方式也是单进程 。 uWSGI 是一个 Web 服务器它实现了 WSGI 协议、uwsgi、http 等协议。注意 uwsgi 是一种通信协议而 uWSGI 是实现 uwsgi 协议和 WSGI 协议的 Web 服务器。uWSGI 具有超快的性能、低内存占用和多 app 管理等优点并且搭配着 Nginx
就是一个生产环境了能够将用户访问请求与应用 app 隔离开实现真正的部署 。相比来讲支持的并发量更高方便管理多进程发挥多核的优势提升性能。 网络编程和前端
1.AJAX是什么如何使用AJAX
ajax(异步的javascript 和xml) 能够刷新局部网页数据而不是重新加载整个网页。
第一步创建xmlhttprequest对象var xmlhttp new XMLHttpRequest);XMLHttpRequest对象用来和服务器交换数据。
第二步使用xmlhttprequest对象的open和send方法发送资源请求给服务器。
第三步使用xmlhttprequest对象的responseText或responseXML属性获得服务器的响应。
第四步onreadystatechange函数当发送请求到服务器我们想要服务器响应执行一些功能就需要使用onreadystatechange函数每次xmlhttprequest对象的readyState发生改变都会触发onreadystatechange函数。
2. 常见的HTTP状态码有哪些
200 OK
301 Moved Permanently
302 Found
304 Not Modified
307 Temporary Redirect
400 Bad Request
401 Unauthorized
403 Forbidden
404 Not Found
410 Gone
500 Internal Server Error
501 Not Implemented
3. Post和get区别
1、GET请求请求的数据会附加在URL之后以?分割URL和传输数据多个参数用连接。URL的编码格式采用的是ASCII编码而不是uniclde即是说所有的非ASCII字符都要编码之后再传输。
POST请求POST请求会把请求的数据放置在HTTP请求包的包体中。上面的itembandsaw就是实际的传输数据。
因此GET请求的数据会暴露在地址栏中而POST请求则不会。
2、传输数据的大小
在HTTP规范中没有对URL的长度和传输的数据大小进行限制。但是在实际开发过程中对于GET特定的浏览器和服务器对URL的长度有限制。因此在使用GET请求时传输数据会受到URL长度的限制。
对于POST由于不是URL传值理论上是不会受限制的但是实际上各个服务器会规定对POST提交数据大小进行限制Apache、IIS都有各自的配置。
3、安全性
POST的安全性比GET的高。这里的安全是指真正的安全而不同于上面GET提到的安全方法中的安全上面提到的安全仅仅是不修改服务器的数据。比如在进行登录操作通过GET请求用户名和密码都会暴露再URL上因为登录页面有可能被浏览器缓存以及其他人查看浏览器的历史记录的原因此时的用户名和密码就很容易被他人拿到了。除此之外GET请求提交的数据还可能会造成Cross-site request frogery攻击。
4.cookie 和session 的区别
1、cookie数据存放在客户的浏览器上session数据放在服务器上。
2、cookie不是很安全别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多会比较占用服务器的性能考虑到减轻服务器性能方面应当使用COOKIE。
4、单个cookie保存的数据不能超过4K很多浏览器都限制一个站点最多保存20个cookie。
5、建议 将登陆信息等重要信息存放为SESSION 其他信息如果需要保留可以放在COOKIE中 5.创建一个简单tcp服务器需要的流程
1.socket创建一个套接字
2.bind绑定ip和port
3.listen使套接字变为可以被动链接
4.accept等待客户端的链接
5.recv/send接收发送数据
6.请简单说一下三次握手和四次挥手什么是2msl为什么要这样做 2MSL即两倍的MSLTCP的TIME_WAIT状态也称为2MSL等待状态 当TCP的一端发起主动关闭在发出最后一个ACK包后
即第3次握 手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态
必须在此状态上停留两倍的MSL时间
等待2MSL时间主要目的是怕最后一个 ACK包对方没收到
那么对方在超时后将重发第三次握手的FIN包
主动关闭端接到重发的FIN包后可以再发一个ACK应答包。
在TIME_WAIT状态 时两端的端口不能使用要等到2MSL时间结束才可继续使用。
当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。
不过在实际应用中可以通过设置 SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。 爬虫和数据库
1.scrapy和scrapy-redis有什么区别为什么选择redis数据库
1) scrapy是一个Python爬虫框架爬取效率极高具有高度定制性但是不支持分布式。而scrapy-redis一套基于redis数据库、运行在scrapy框架之上的组件可以让scrapy支持分布式策略Slaver端共享Master端redis数据库里的item队列、请求队列和请求指纹集合。
2) 为什么选择redis数据库因为redis支持主从同步而且数据都是缓存在内存中的所以基于redis的分布式爬虫对请求和数据的高频读取效率非常高。
2. 你用过的爬虫框架或者模块有哪些谈谈他们的区别或者优缺点
Python自带urlliburllib2
第 三 方requests
框 架Scrapy
urllib和urllib2模块都做与请求URL相关的操作但他们提供不同的功能。
urllib2.urllib2.urlopen可以接受一个Request对象或者url在接受Request对象时候并以此可以来设置一个URL 的headersurllib.urlopen只接收一个url
urllib 有urlencode,urllib2没有因此总是urlliburllib2常会一起使用的原因
scrapy是封装起来的框架他包含了下载器解析器日志及异常处理基于多线程 twisted的方式处理对于固定单个网站的爬取开发有优势但是对于多网站爬取 100个网站并发及分布式处理方面不够灵活不便调整与括展。
request 是一个HTTP库 它只是用来进行请求对于HTTP请求他是一个强大的库下载解析全部自己处理灵活性更高高并发与分布式部署也非常灵活对于功能可以更好实现.
Scrapy优缺点
优点scrapy 是异步的
采取可读性更强的xpath代替正则
强大的统计和log系统
同时在不同的url上爬行
支持shell方式方便独立调试
写middleware,方便写一些统一的过滤器
通过管道的方式存入数据库
缺点基于python的爬虫框架扩展性比较差
基于twisted框架运行中的exception是不会干掉reactor并且异步框架出错后是不会停掉其他任务的数据出错后难以察觉。
3.你常用的mysql引擎有哪些各引擎间有什么区别
主要 MyISAM 与 InnoDB 两个引擎其主要区别如下
一、InnoDB 支持事务MyISAM 不支持这一点是非常之重要。事务是一种高
级的处理方式如在一些列增删改中只要哪个出错还可以回滚还原而 MyISAM
就不可以了
二、MyISAM 适合查询以及插入为主的应用InnoDB 适合频繁修改以及涉及到
安全性较高的应用
三、InnoDB 支持外键MyISAM 不支持
四、MyISAM 是默认引擎InnoDB 需要指定
五、InnoDB 不支持 FULLTEXT 类型的索引
六、InnoDB 中不保存表的行数如 select count(*) from table 时InnoDB需要
扫描一遍整个表来计算有多少行但是 MyISAM 只要简单的读出保存好的行数即
可。注意的是当 count(*)语句包含 where 条件时 MyISAM 也需要扫描整个表
七、对于自增长的字段InnoDB 中必须包含只有该字段的索引但是在 MyISAM
表中可以和其他字段一起建立联合索引
八、清空整个表时InnoDB 是一行一行的删除效率非常慢。MyISAM 则会重
建表
九、InnoDB 支持行锁某些情况下还是锁整表如 update table set a1 where
user like %lee%
4.描述下scrapy框架运行的机制
答从start_urls里获取第一批url并发送请求请求由引擎交给调度器入请求队列获取完毕后调度器将请求队列里的请求交给下载器去获取请求对应的响应资源并将响应交给自己编写的解析方法做提取处理1. 如果提取出需要的数据则交给管道文件处理2. 如果提取出url则继续执行之前的步骤发送url请求并由引擎将请求交给调度器入队列...)直到请求队列里没有请求程序结束。
5.什么是关联查询有哪些
答将多个表联合起来进行查询主要有内连接、左连接、右连接、全连接外连接
6.写爬虫是用多进程好还是多线程好 为什么
答IO密集型代码(文件处理、网络爬虫等)多线程能够有效提升效率(单线程下有IO操作会进行IO等待造成不必要的时间浪费而开启多线程能在线程A等待时自动切换到线程B可以不浪费CPU的资源从而能提升程序执行效率)。在实际的数据采集过程中既考虑网速和响应的问题也需要考虑自身机器的硬件情况来设置多进程或多线程
7.数据库的优化
1. 优化索引、SQL 语句、分析慢查询
2. 设计表的时候严格根据数据库的设计范式来设计数据库
3. 使用缓存把经常访问到的数据而且不需要经常变化的数据放在缓存中能
节约磁盘IO
4. 优化硬件采用SSD使用磁盘队列技术(RAID0,RAID1,RDID5)等
5. 采用MySQL 内部自带的表分区技术把数据分层不同的文件能够提高磁
盘的读取效率
6. 垂直分表把一些不经常读的数据放在一张表里节约磁盘I/O
7. 主从分离读写采用主从复制把数据库的读操作和写入操作分离开来
8. 分库分表分机器数据量特别大主要的的原理就是数据路由
9. 选择合适的表引擎参数上的优化
10. 进行架构级别的缓存静态化和分布式
11. 不采用全文索引
12. 采用更快的存储方式例如 NoSQL存储经常访问的数据
8.常见的反爬虫和应对方法
1.通过Headers反爬虫
从用户请求的Headers反爬虫是最常见的反爬虫策略。很多网站都会对Headers的User-Agent进行检测还有一部分网站会对Referer进行检测一些资源网站的防盗链就是检测Referer。如果遇到了这类反爬虫机制可以直接在爬虫中添加Headers将浏览器的User-Agent复制到爬虫的Headers中或者将Referer值修改为目标网站域名。对于检测Headers的反爬虫在爬虫中修改或者添加Headers就能很好的绕过。
2.基于用户行为反爬虫
还有一部分网站是通过检测用户行为例如同一IP短时间内多次访问同一页面或者同一账户短时间内多次进行相同操作。
大多数网站都是前一种情况对于这种情况使用IP代理就可以解决。可以专门写一个爬虫爬取网上公开的代理ip检测后全部保存起来。这样的代理ip爬虫经常会用到最好自己准备一个。有了大量代理ip后可以每请求几次更换一个ip这在requests或者urllib2中很容易做到这样就能很容易的绕过第一种反爬虫。
对于第二种情况可以在每次请求后随机间隔几秒再进行下一次请求。有些有逻辑漏洞的网站可以通过请求几次退出登录重新登录继续请求来绕过同一账号短时间内不能多次进行相同请求的限制。
3.动态页面的反爬虫
上述的几种情况大多都是出现在静态页面还有一部分网站我们需要爬取的数据是通过ajax请求得到或者通过JavaScript生成的。首先用Fiddler对网络请求进行分析。如果能够找到ajax请求也能分析出具体的参数和响应的具体含义我们就能采用上面的方法直接利用requests或者urllib2模拟ajax请求对响应的json进行分析得到需要的数据。
能够直接模拟ajax请求获取数据固然是极好的但是有些网站把ajax请求的所有参数全部加密了。我们根本没办法构造自己所需要的数据的请求。这种情况下就用seleniumphantomJS调用浏览器内核并利用phantomJS执行js来模拟人为操作以及触发页面中的js脚本。从填写表单到点击按钮再到滚动页面全部都可以模拟不考虑具体的请求和响应过程只是完完整整的把人浏览页面获取数据的过程模拟一遍。
用这套框架几乎能绕过大多数的反爬虫因为它不是在伪装成浏览器来获取数据上述的通过添加 Headers一定程度上就是为了伪装成浏览器它本身就是浏览器phantomJS就是一个没有界面的浏览器只是操控这个浏览器的不是人。利seleniumphantomJS能干很多事情例如识别点触式12306或者滑动式的验证码对页面表单进行暴力破解等。
9.分布式爬虫主要解决什么问题
1)ip
2)带宽
3cpu
4io
10.爬虫过程中验证码怎么处理
1.scrapy自带但是成功率不高
2.付费接口若快http://www.ruokuai.com/home/pricetype
其他
更多面试资料请加关注
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/918048.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!