1.什么是对象?什么是类?
对象是对类的具体表达,类是对象的抽象表达。
类只是为所有的对象定义了抽象的属性与行为。
———————————————————————————————————————————
●re.search 函数返回的结果是 一个Match对象
●re.findall 函数返回的结果是一个列表
———————————————————————————————————————————
●设计模式:六大原则
单一职责 (一个方法实现一个功能)
里氏替换原则
依赖倒置原则
接口隔离原则
开闭原则(对扩展开放修改关闭)
迪米特原则(降低模块间耦合)
———————————————————————————————————————————
2.面向对象有三大特性,封装、继承和多态
面向对象就是将程序模块化,对象化,把具体的事物特性和通过这些属性来实现一些动作的具体方法放到类里面,就是封装。
继承:就是父类的属性子类可以重复使用
多态:重写父类方法并覆盖父类里相同的方法
———————————————————————————————————————————
3.Mysql 数据类型?
数值类型 int
浮点型 float
日期和时间 date datetime
字符串类型 char
———————————————————————————————————————————
———————————————————————————————————————————
4.反爬虫措施?解决措施?
一般网站从三个方面反爬虫:
1用户请求的headers(大部分网站都会检测请求头,部分网站的防盗链是对referer检测)
措施:模仿浏览器设置请求头
2用户行为
措施:1模仿用户行为,设置休眠时间
2使用代理ip (每请求几次更换一次ip)
3网站目录和数据加载方式
措施:Selenium+PhantomJS 无界面浏览器采集数据
———————————————————————————————————————————
5.爬取速度过快出现的验证码处理?
跳转第三方24小时人工在线手动解决
———————————————————————————————————————————
6.Scrapy
●五个核心模块
爬虫模块,引擎模块,调度模块,下载模块,管道模块
●Scrapy去重原理
scrapy本身自带一个去重中间件
scrapy源码中可以找到一个dupefilters.py去重器
将返回值放到集合set中,实现去重
●scrapy中间件有几种类
爬虫中间件:主要功能是在爬虫运行过程中进行一些处理
下载中间件:主要功能在请求到网页后,页面被下载时进行一些处理
●scrapy中间件再哪里起的作用
下载中间件
- process_request request通过下载中间件时,该方法被调用
- process_response 下载结果经过中间件时被此方法处理
- process_exception 下载过程中出现异常时被调用
7.代理
●为什么会用到代理
8.使用代理i分布式
p可有效避免ip被禁的问题
●代理失效怎么处理
???
———————————————————————————————————————————
●分布式原理
Scrapy-Redis则是一个基于Redis的Scrapy分布式组件。它利用Redis对用于爬取的请求(Requests)进行存储和调度(Schedule),并对爬取产生的项目(items)存储以供后续处理使用。scrapy-redi重写了scrapy一些比较关键的代码,将scrapy变成一个可以在多个主机上同时运行的分布式爬虫
●分布式去重原理
redis的set实现url去重
———————————————————————————————————————————
9.数据库问题
- 关系型数据库和非关系型数据库的区别?
关系型数据库:Mysql ,Oracle,SQLSERVER
非关系型数据库:Redis,Mangodb
- 各种数据库支持的数据类型,和特点?
关系型数据库
●优点:
可以进行Join等复杂查询
其中能够保持数据的一致性是关系型数据库的最大优势
●不足:
不擅长处理大量数据
不擅长字段不固定时应用
———————————————————————————————————————————
10.迭代器,生成器,装饰器
●迭代器
可以用在 for 语句进行循环的对象就是可迭代对象
迭代器的实质是实现了next()方法的对象,常见的元组、列表、字典都是迭代器
●生成器
生成器是包含yield关键字的函数
●装饰器
拓展原来函数功能的一种函数
好处就是在不用更改原函数的代码前提下给函数增加新的功能
———————————————————————————————————————————
11.python的数据类型
Number(数字) 包括int,long,float,complex
String(字符串) 例如:hello,"hello",hello
List(列表) 例如:[1,2,3],[1,2,3,[1,2,3],4]
Dictionary(字典) 例如:{1:"nihao",2:"hello"}
Tuple(元组) 例如:(1,2,3,abc)
Bool(布尔) 包括True、False
———————————————————————————————————————————
12.协议问题
●http协议,请求由什么组成,每个字段分别有什么用,https和http有什么差距?
组成:
1、请求方法 和 URI及使用的协议
GET、POST、HEAD、OPTIONS、PUT、DELETE和TRACE
2、请求头
服务端的有用信息,如服务器的类型、内容类型和长度
3、请求正文
响应正文
●两者区别:
https需要得到ca申请证书,一般免费证书较少,因而需要一定的费用。
http是超文本传输协议,信息是明文传输的,https则是具有安全性的ssl加密传输协议
http(80)和https(443)使用的完全不同的连接方式,用的端口号也不一样。
http的连接简单是无状态的;https协议是有ssl+http协议构建的可进行加密传输、身份认证的网络协议,比http协议更安全。
———————————————————————————————————————————
13.TCP,UDP各种相关问题
●1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
●2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。
●3、UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。
●4.每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
●5、TCP对系统资源要求较多,UDP对系统资源要求较少。
———————————————————————————————————————————
14.套接字
套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认
———————————————————————————————————————————
15.TCP和Http的区别
HTTP连接显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”,HTTP连接是一种“短连接”
HTTP协议是建立在TCP协议之上的一种应用
●TCP连接
建立起一个TCP连接需要经过“三次握手”:
第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
———————————————————————————————————————————
16.四次挥手(连接终止协议)
(1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。
(2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
(3) 服务器关闭客户端的连接,发送一个FIN给客户端。
(4) 客户端发回ACK报文确认,并将确认序号设置为收到序号加1。
———————————————————————————————————————————
17.linux配置命令
chmod命令是非常重要的,用于改变文件或目录的访问权限。用户用它控制文件或目录的访问权限
———————————————————————————————————————————
18.常见设计模式
●单例模式
通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。
即一个类只有一个对象实例。
●门面模式
门面模式,是指提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使得子系统更容易使用。
缺点:
不符合开闭原则。所谓的开闭原则是软件工程里面一个最基本的原则:对扩展开放,对修改关闭
●简单工厂模式是属于创建型模式
简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例
———————————————————————————————————————————
19.前端和后端
前端即网站前台部分,运行在PC端,移动端等浏览器上展现给用户浏览的网页。
后端是封装在后台,
———————————————————————————————————————————
确保requests爬虫出现错误继续爬虫?
———————————————————————————————————————————
20.urllib2,requests
●urllib2是python2内置模块操作较为底层,步骤繁琐,主要用于了解爬虫工作机制。
requests是第三方模块,封装大量爬虫底层函数,对python2,3有友好支持。
●requests提供的函数请求get,post,等其他请求
●通过urllib.urlencode()编码参数的方式,是在urllib2底层操作中使用的
●
———————————————————————————————————————————
21反爬虫操作:
较为高端的反爬虫操作:字段属性加密
客户提交数据必需附带服务端加密数据,如果没有加密数据或加密数据不一致,不返回数据
解决措施:参数加密处理,了解加密的流程,对方加密的步骤和操作,还原加密的过程,获得加密的数据,采集目标数据。
所有可能出现验证码的情况的一般都为post请求,提交会改变数据。
人工打码(24小时)啦啦打码,打码兔
———————————————————————————————————————————
22.Xpath
Python提供对Xpath的友好支持引入第三方模块 lxml
XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言
———————————————————————————————————————————
23.云图(三个模块)
中文分词:jieba
数据渲染:
将词语按云图形式处理:wordcloud
数据展示:matplotlib
中文处理:虚拟环境》lib》修改site.py
reload(sys)
Sys.setdedaultencoding(‘GBK’)
———————————————————————————————————————————
24.数据库入库
DDL、DML 数据库定义语言,数据库操作语言
Mysql数据库,pymysql模块
pymysql,mysqldb区别?
都是mysql数据库使用的第三方模块
Mysqldb是python操作的mysql数据模块(官方)旧版本使用
Pymysql是第三方模块新版本使用
———————————————————————————————————————————
25.Pymysql操作mysql数据库
CRUD操作:
增删改:insert,delete,update [execute|executeMany]
查:select[execute|fetchone|fetchMany|fetchAll]
把pymysql操作数据库,封装成工具模块,提供给其他模块引用使用,操作数据模块[db_utils]
———————————————————————————————————————————
26.数据筛选
数据分为:结构化的数据 非结构化的数据
正则表达 效率非常高
Xpath、Jsonpath 效率高
BeautifulSoup4(可结合正则,xpath)效率较高
结构化数据:Xpath、Jsonpath、BS4、正则
非结构化数据:正则
pip
install beautifulsoup4
BS 对象:可以直接操作网页中的文档数
Findall
:ret=soup.findall()
主要:css select
# 1.
CSS 标签选择器:根据标签名称查询标签对象
res1 =
soup.select("span")
print(res1)
# 2.
CSS ID选择器:根据ID查询标签对象
res2 =
soup.select("#gender")
print(res2)
# 3.
CSS 类选择器:根据class属性查询标签对象
res3 =
soup.select(".intro")
print(res3)
———————————————————————————————————————————
27.scrapy深度爬虫
环境配置:
Windows
安装可执行的安装包
Python中安装一个交互模块 pypiwin32
创建scrapy项目:
Scrapy
startproject 项目名
或者 进入到目录里scrapy genspider baidu(‘爬虫项目’) baidu.com(网站域名)直接创建好
Item封装采集数据类型
2.item中设置封装采集数据
———————————————————————————————————————————
拓展
安装 buildwith模块 通过 buildwith.parse(url) 查看网页实现技术
安装 python-whois 模块查看目标网站的所属组织
———————————————————————————————————————————
.extract() 将取出的文本转换为unicode编码
#yield
协程 类似于多线程
yield response.follow(next_page[0], callback=self.parse)
有下一页链接,加到相应队列,yield将请求对象交给scrapy引擎模块,引擎模块交给调度模块进行排队下载完 callback 交给 self.parse
———————————————————————————————————————————
28. 启用piplines
ITEM_PIPELINES
= {
‘zhilianspider.pipelines.ZhilianspiderPipeline‘: 300,
}
300 是优先级 越小越先执行
———————————————————————————————————————————
29.scrapy.spider
Import
scrapy
创建一个爬虫项目 【scrapy startproject 项目名】
Cd 项目 在spiders目录下创建爬虫程序
自定义一个爬虫程序继承 scrapy.Spider
设置 名字 允许域名 目标采集地址
定义parse函数 筛选对应信息
判断下一页 ,yeild response.follow(next_page[0],callback=self.parse) 交给自身继续采集
缺点:只适合简单爬取,如果采集信息深度再加深,函数功能太复杂,不符合模块开发面向对象的开发原则,
单一,高内聚,低耦合
●深度爬虫: CrawlSpider
Scrapy
自动采集数据,我们只负责定义Rule和指定的处理函数scrapy会根据指定的规则自动分类筛选数据,
将筛选的数据直接交给我们指定好的函数进行处理
定义筛选链接的方式: scrapy.linkextractors.LinkExtractor
定义筛选规则:scrapy.spider.Rule
1.创建一个爬虫项目 【scrapy startproject 项目名】
2.Cd 项目 在spiders目录下创建爬虫程序
需要引入模块:
爬虫模块: from scrapy.spider import CrawlSpider
链接提取模块:from scrapy.linkextractors import LinkExtractor
规则模块: from scrapy.spider import rule
3自定义一个爬虫程序继承 CrawlSpider
4 设置 名字 允许域名 目标采集地址
5 定义提取链接
Link1= LinkExtractor(restrict_xpaths=(""))
定义提取下一页
Link2=
LinkExtractor(restrict_xpaths=(""))
6定义提取规则和指定函数
rules
= [
# 第一个提取方式,第二个处理函数,follow跟进
Rule(link_job,
callback="parse_job"),
Rule(link_page, follow=True),
]
———————————————————————————————————————————
30.无界面浏览器
Selenium+PhantomJS
引入测试模块
from
selenium.webdriver import PhantomJS
创建无界面浏览器对象
browser=PhantomJS(“./phantomjs-2.1.1-windows/bin/phantomjs”)
访问网页
brower.get(“http://www.baidu.com”)
输入文本
input=brower.find_element_by_id(‘kw’)
Input.send_keys(‘lvfei’)
保存访问到的网页
brower.save_screenshot(“baidu1.png”)
点击百度一下
btn=brower.find_element_by_id(‘su’)
tn.click()
退出浏览器
brower.quit()
———————————————————————————————————————————
31.Scrapy-Redis 分布式爬虫
Redis数据库【内存数据库】:专门用于在内存中处理程序中的数据操作的数据库软件
Key-value存储系统
Redis为了提升数据操作效率,将和程序交互的数据临时在内存中交互【内存中的交互要比在硬盘中的交互方式快速太多】,同时检测了内存中数据的读写次数,如果当一个数据长时间没有进行数据读写时,直接同步到硬盘中,占荣的内存空间释放其它资源使用。
Redis特点:
支持数据的持久化,可以将内存中的数据存在磁盘中,重启的时候再次加载进行使用
不仅仅支持简单的key-value类型的数据,还提供list set hash等数据结构的存储
Redis 性能极高 读110000次/s 写81000次/s
Redis 官方只支持linux unix系统安装 windows下 github上面下载
32.python如何进行内存管理?
Python内部使用引用计数,来保持追踪内存中的对象,python内部记录了对象有多少个引用,即引用计数,
当对象被创建时就创建了一个引用计数,当这个对象的引用计数为0时,它被垃圾回收。
———————————————————————————————————————————
33.Python实现tuple和list转换?
———————————————————————————————————————————
34.什么是lambda函数,好处?
Lambda函数是一个可以接收任意多个参数并且返回单个表达式值的函数。
好处:比较轻便,很适合完成一项功能,只在此处应用
匿名函数一般用来给filter,map这样的函数编程服务
作为回调函数传递给某些应用,比如消息传递
———————————————————————————————————————————
35.为什么要用单例模式?
单例模式是常用的软件设计模式,核心结构只包含一个被称为单例类的特殊类,单例模式保证一个类只有一个实例而且
该实例易于外界访问,从而方便对实例个数控制并节约资源。
———————————————————————————————————————————
36.什么是协程?
概念:协程是一种用户状态的轻量级线程
理解:线程是系统级别的,有操作系统调度,协程是程序级别的,由程序员根据需要自己调度,一个线程的一个函数
叫做子程序,子程序在执行过程中可以中断去执行别的子程序,别的子程序也可以中断回来继续执行之前的子程序。
优点:避免了无意义的调度,提高了性能,方便切换,适合高并发
缺点:协程的本质就是单线程,无法利用多核资源,若进行阻塞会阻塞掉整个程序
———————————————————————————————————————————
37.闭包的作用?
闭包:外部函数定义的内部函数就是闭包
闭包的作用及好处:
闭包给访问外部函数定义的内部函数变量创造了条件,将关于函数的一切封闭到了函数内部,减少了全局变量
什么时候使用闭包?
当每次调用函数A时都要改变全局变量B,且B只与A有关。可以将B定义为A的内部变量,同时A内定义闭包C,并将C当值返回
———————————————————————————————————————————
38.Cookie session 的区别和联系?
|
Cookie |
Session |
储存位置 |
客户端 |
服务器端 |
目的 |
跟踪会话,也可以保存用户偏好设置或者保存用户名密码等 |
跟踪会话 |
安全性 |
不安全 |
安全 |
———————————————————————————————————————————
39.管理不同版本代码?
Svn/
Git
———————————————————————————————————————————
40服务器部署Django应用?
Uwsgi+nginx
———————————————————————————————————————————
赋值,深拷贝,浅拷贝的区别?
(1)直接赋值是一个完完全全的引用,对新变量的任何改动都会影响到原对象。
(2)浅拷贝创建了新的对象,但是只拷贝了序列的元素,对于元素也是一个序列的情况(即子对象),只复制了对这个序列的引用!
(3)深拷贝是完完全全的拷贝,把原对象完整地拷贝到了新对象中。
浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向新的内存
Python查询和替换一个文本字符串?
正则匹配
import re str=‘hello‘ p=re.compile(r‘l‘) p2=p.sub(‘o‘,str) print p2 p2=heooo
find()方法可以在一个较长的字符串中查找子串,返回子串坐在位置的最左端索引
# str=‘012hello456‘ # str1=str.find(‘l‘) # print str1
找第一个l位置索引 str=‘012hello456‘ str1=str.rfind(‘l‘) print str1
找最后一个l位置索引 replace()方法返回某字符串的所有匹配项均被替换之后得到的字符串
str=‘everyone‘ str1=str.replace(‘e‘,‘a‘) print str1
静态方法,类方法,实例方法?
数组和元组的区别?
列表可以修改,而元组不可以修改,如果元组中仅有一个元素,则要在元素后加上逗号。
元组和列表的查询方式一样。
元组只可读不可修改
Python2 ,3 的区别?
●编码:python2 ascii 编码 源代码文件都不支持中文源代码代码中第一行的位置,添加支持中文的注释
python3 unicode编码
●爬虫工作主流版本:2.x
[都是从网络上采集数据,采集的数据文本数据、二进制数据,为了方便并且统一的进行采集数据的处理,使用python2操作更加灵活]
Python2在爬虫方向支持的第三方模块更多
●python2 print 被 python3 print() 取代
●字符串类型
版本 |
python2 |
python3 |
字节字符串 |
str |
bytes |
文本字符串 |
Unicode |
str |
●python2中/的结果是整型,python3中是浮点类型
单双三引号区别?
单双引号如果字符串要换行要用\ 三引号则不用
32. redis 数据库端口号 6379 mysql(关系型数据库的明星) 端口号 3306 mongodb (文档型数据库的翘楚)端口号50107
Redis 启动默认情况下启动16个数据库,分别使用0-15个整数进行编号
存储数据 以key value 存储
Mysql 和 mongodb的区别?
Mongodb文档型数据库:提供可扩展的高性能数据存储
基于分布式的文件存储,高负载情况下添加更多的节点,保证服务器的性能,将数据存储为一个文档
Mongodb对数据间的事物关系支持比较弱
Mongodb优势:
●适合对数据库具体数据格式不明确或者数据库数据格式经常发生变化的需求模型,对开发者友好。
●自带分布式文件系统,很方便的部署到服务器集群上
●自带map-reduce运算框架的支持,方便进行数据的统计
传统数据库由:数据库 表 记录 组成
Mongodb由:数据库 集合 文档对象 组成
49.可变与不可变
数字,字符串,布尔值,元组(其他都是可变的)
不可变类型传递后,一方进行了修改,不影响另一方
可变类型传递后,一方修改了,影响另一方
50.迭代器 生成器
在Python中,这种一边循环一边计算的机制,称为生成器:generator。
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
51.*args and **kwargs
*args 用来将参数打包成tuple给函数体调用
**kwargs 打包关键字参数成dict给函数体调用
顺序问题 必须是 arg, *args,**kwargs 不然程序会报错
52.装饰器
装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。
装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。
概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
53.python重载
函数重载主要是为了解决两个问题。
- 可变参数类型。
- 可变参数个数。
- __new__是一个静态方法,而__init__是一个实例方法.
- __new__方法会返回一个创建的实例,而__init__什么都不返回.
- 只有在__new__返回一个cls的实例时后面的__init__才能被调用.
- 当创建一个新实例时调用__new__,初始化一个实例时用__init__.
54. __new__和__init__的区别
55. import方法
作为python的模块是天然的单例模式
56.全局锁GIL
线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的限制,说白了就是一个核只能在同一时间运行一个线程.
57.协程
简单点说协程是进程和线程的升级版,进程和线程都面临着内核态和用户态的切换问题而耗费许多切换时间,而协程就是用户自己控制切换的时机,不再需要陷入系统的内核态.
58.Python里最常见的yield就是协程的思想! Scrapy爬虫中的yield
59.闭包
闭包(closure)是函数式编程的重要的语法结构。闭包也是一种组织代码的结构,它同样提高了代码的可重复使用性。
- 必须有一个内嵌函数
- 内嵌函数必须引用外部函数中的变量
- 外部函数的返回值必须是内嵌函数
60.Python 垃圾回收机制
Python GC主要使用引用计数(reference counting)来跟踪和回收垃圾。在引用计数的基础上,通过“标记-清除”(mark and sweep)解决容器对象可能产生的循环引用问题,通过“分代回收”(generation collection)以空间换时间的方法提高垃圾回收效率。
PyObject是每个对象必有的内容,其中ob_refcnt就是做为引用计数。当一个对象有新的引用时,它的ob_refcnt就会增加,当引用它的对象被删除,它的ob_refcnt就会减少.引用计数为0时,该对象生命就结束了。
优点:简单、实时性
缺点:维护引用计数消耗资源、循环引用
61.Python里面如何实现tuple和list的转换?
tuple可以说是不可变的list,访问方式也是通过下表索引
62.Python中 is:
is是对比地址,==是对比值
63.什么是python?
Python:Python是一种解释型语言,Python代码在运行之前不需要编译
Python是动态类型语言,指的是你在声明变量时,不需要说明变量的类型
Python非常适合面向对象的编程(OOP),因为它支持通过组合(composition)与继承(inheritance)的方式定义类(class)
Python代码编写快,但是运行速度比编译语言通常要慢
Python让困难的事情变得容易,因此程序员可以专注于算法和数据结构的设计,而不用处理底层的细节
64.死锁
原因:1竞争资源程 2序推进顺序不当
必要条件:互斥条件、请求和保持条件、不剥夺条件、环路等待条件
处理死锁基本方法:预防死锁(摒弃除1以外的条件)、避免死锁(银行家算法)、检测死锁(资源分配图)、解除死锁(剥夺资源、撤销进程)
65.数据库索引
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。
索引分为聚簇索引和非聚簇索引两种,聚簇索引 是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。
66.乐观锁和悲观锁
悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。
67.urllib和urllib2的区别
- urllib提供urlencode方法用来GET查询字符串的产生,而urllib2没有。这是为何urllib常和urllib2一起使用的原因。
- urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL。这意味着,你不可以伪装你的User Agent字符串等。
68.Post和get的区别?
Post不能被缓存,get可以被缓存
GET对数据长度有限制,当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。POST无限制。
GET只允许 ASCII 字符。POST没有限制。也允许二进制数据。
与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。在发送密码或其他敏感信息时绝不要使用 GET !POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。
69.列表中去重?
列表去重
list(set(l1))
用字典
1 2 3 |
l1 = [‘b‘,‘c‘,‘d‘,‘b‘,‘c‘,‘a‘,‘a‘] l2 = {}.fromkeys(l1).keys() print l2 |
用字典并保持顺序
1 2 3 4 |
l1 = [‘b‘,‘c‘,‘d‘,‘b‘,‘c‘,‘a‘,‘a‘] l2 = list(set(l1)) l2.sort(key=l1.index) print l2 |
tornado django的区别?
Tornado是可扩展非阻塞型web服务器速度相当快
69.常见状态代码、状态描述、说明:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
70、请简要说明视图的作用
1.数据库视图隐藏了数据的复杂性。
2.数据库视图有利于控制用户对表中某些列的访问。
3.数据库视图使用户查询变得简单。
71.python网络爬虫所用到的网络数据包
requests、urllib、urllib2
python网络爬虫所用到的解析数据包
BeautifulSoup、pyquery、Xpath、lxml
73.map 函数
tmp_list=[1,2,3,4] def fun(number): return number+1 print map(fun,tmp_list) [2,3,4,5] print filter(fun,tmp_list)
[1,2,3,4]
74.切片
a=[1,2,3,4,5] #取前两个 print a[:2] 【1,2】 #取依次隔两位取 print a[::2] 【1,3,5】 #为空 print a[-10:-8] 【】为空 print a[-8:] 【1,2,3,4,5】 #从前往后取 print a[-4:] 【2,3,4,5】
75.Map
python map(fun,[arg]+)函数最少有两个参数,第一参数为一个函数名,第二个参数是对应的这个函数的参数(一般为一个或多个list)
>>>def fun(x):
... return x+1 ...
>>>list(map(fun,[1,2,3]))
>>>[2,3,4]
76.Lambda
# a=[1,2,3,4] # b=[] # for x in a: # b.append(x*x) # # print b
A=[(lambda x:x*x) (x) for x in range(1,5)] print A
77. 多线程 多进程
多进程和多线程都可以执行多个任务,线程是进程的一部分。线程的特点是线程之间可以共享内存和变量,
资源消耗少(不过在Unix环境中,多进程和多线程资源调度消耗差距不明显,Unix调度较快),缺点是线
程之间的同步和加锁比较麻烦
78. Python常用模块
模块分为:自定义模块,内置模块,开源模块
内置模块: time模块 datetime模块
sys模块、os模块、hashlib模块,random模块、json模块、
re模块:compile 、 match 、search、findall、group
match:只在第一个字符串开始找,如果没有匹配,则不再继续找,如果第一个字符串中有,则只输出第一个
searh: 在所有内容里找,直到找到为止,但只输出找到的第一个
findall:把所有找到的匹配的内容,都通过列表的形式打印出来
compile: 编译之后再去匹配,这样可以加快匹配的速度
group: 把他匹配的内容输出出来
1.什么是对象?什么是类?
对象是对类的具体表达,类是对象的抽象表达。
类只是为所有的对象定义了抽象的属性与行为。
———————————————————————————————————————————
●re.search 函数返回的结果是 一个Match对象
●re.findall 函数返回的结果是一个列表
———————————————————————————————————————————
●设计模式:六大原则
单一职责 (一个方法实现一个功能)
里氏替换原则
依赖倒置原则
接口隔离原则
开闭原则(对扩展开放修改关闭)
迪米特原则(降低模块间耦合)
———————————————————————————————————————————
2.面向对象有三大特性,封装、继承和多态
面向对象就是将程序模块化,对象化,把具体的事物特性和通过这些属性来实现一些动作的具体方法放到类里面,就是封装。
继承:就是父类的属性子类可以重复使用
多态:重写父类方法并覆盖父类里相同的方法
———————————————————————————————————————————
3.Mysql 数据类型?
数值类型 int
浮点型 float
日期和时间 date datetime
字符串类型 char
———————————————————————————————————————————
———————————————————————————————————————————
4.反爬虫措施?解决措施?
一般网站从三个方面反爬虫:
1用户请求的headers(大部分网站都会检测请求头,部分网站的防盗链是对referer检测)
措施:模仿浏览器设置请求头
2用户行为
措施:1模仿用户行为,设置休眠时间
2使用代理ip (每请求几次更换一次ip)
3网站目录和数据加载方式
措施:Selenium+PhantomJS 无界面浏览器采集数据
———————————————————————————————————————————
5.爬取速度过快出现的验证码处理?
跳转第三方24小时人工在线手动解决
———————————————————————————————————————————
6.Scrapy
●五个核心模块
爬虫模块,引擎模块,调度模块,下载模块,管道模块
●Scrapy去重原理
scrapy本身自带一个去重中间件
scrapy源码中可以找到一个dupefilters.py去重器
将返回值放到集合set中,实现去重
●scrapy中间件有几种类
爬虫中间件:主要功能是在爬虫运行过程中进行一些处理
下载中间件:主要功能在请求到网页后,页面被下载时进行一些处理
●scrapy中间件再哪里起的作用
下载中间件
- process_request request通过下载中间件时,该方法被调用
- process_response 下载结果经过中间件时被此方法处理
- process_exception 下载过程中出现异常时被调用
7.代理
●为什么会用到代理
8.使用代理i分布式
p可有效避免ip被禁的问题
●代理失效怎么处理
???
———————————————————————————————————————————
●分布式原理
Scrapy-Redis则是一个基于Redis的Scrapy分布式组件。它利用Redis对用于爬取的请求(Requests)进行存储和调度(Schedule),并对爬取产生的项目(items)存储以供后续处理使用。scrapy-redi重写了scrapy一些比较关键的代码,将scrapy变成一个可以在多个主机上同时运行的分布式爬虫
●分布式去重原理
redis的set实现url去重
———————————————————————————————————————————
9.数据库问题
- 关系型数据库和非关系型数据库的区别?
关系型数据库:Mysql ,Oracle,SQLSERVER
非关系型数据库:Redis,Mangodb
- 各种数据库支持的数据类型,和特点?
关系型数据库
●优点:
可以进行Join等复杂查询
其中能够保持数据的一致性是关系型数据库的最大优势
●不足:
不擅长处理大量数据
不擅长字段不固定时应用
———————————————————————————————————————————
10.迭代器,生成器,装饰器
●迭代器
可以用在 for 语句进行循环的对象就是可迭代对象
迭代器的实质是实现了next()方法的对象,常见的元组、列表、字典都是迭代器
●生成器
生成器是包含yield关键字的函数
●装饰器
拓展原来函数功能的一种函数
好处就是在不用更改原函数的代码前提下给函数增加新的功能
———————————————————————————————————————————
11.python的数据类型
Number(数字) 包括int,long,float,complex
String(字符串) 例如:hello,"hello",hello
List(列表) 例如:[1,2,3],[1,2,3,[1,2,3],4]
Dictionary(字典) 例如:{1:"nihao",2:"hello"}
Tuple(元组) 例如:(1,2,3,abc)
Bool(布尔) 包括True、False
———————————————————————————————————————————
12.协议问题
●http协议,请求由什么组成,每个字段分别有什么用,https和http有什么差距?
组成:
1、请求方法 和 URI及使用的协议
GET、POST、HEAD、OPTIONS、PUT、DELETE和TRACE
2、请求头
服务端的有用信息,如服务器的类型、内容类型和长度
3、请求正文
响应正文
●两者区别:
https需要得到ca申请证书,一般免费证书较少,因而需要一定的费用。
http是超文本传输协议,信息是明文传输的,https则是具有安全性的ssl加密传输协议
http(80)和https(443)使用的完全不同的连接方式,用的端口号也不一样。
http的连接简单是无状态的;https协议是有ssl+http协议构建的可进行加密传输、身份认证的网络协议,比http协议更安全。
———————————————————————————————————————————
13.TCP,UDP各种相关问题
●1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
●2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。
●3、UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。
●4.每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
●5、TCP对系统资源要求较多,UDP对系统资源要求较少。
———————————————————————————————————————————
14.套接字
套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认
———————————————————————————————————————————
15.TCP和Http的区别
HTTP连接显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”,HTTP连接是一种“短连接”
HTTP协议是建立在TCP协议之上的一种应用
●TCP连接
建立起一个TCP连接需要经过“三次握手”:
第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
———————————————————————————————————————————
16.四次挥手(连接终止协议)
(1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。
(2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
(3) 服务器关闭客户端的连接,发送一个FIN给客户端。
(4) 客户端发回ACK报文确认,并将确认序号设置为收到序号加1。
———————————————————————————————————————————
17.linux配置命令
chmod命令是非常重要的,用于改变文件或目录的访问权限。用户用它控制文件或目录的访问权限
———————————————————————————————————————————
18.常见设计模式
●单例模式
通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。
即一个类只有一个对象实例。
●门面模式
门面模式,是指提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使得子系统更容易使用。
缺点:
不符合开闭原则。所谓的开闭原则是软件工程里面一个最基本的原则:对扩展开放,对修改关闭
●简单工厂模式是属于创建型模式
简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例
———————————————————————————————————————————
19.前端和后端
前端即网站前台部分,运行在PC端,移动端等浏览器上展现给用户浏览的网页。
后端是封装在后台,
———————————————————————————————————————————
确保requests爬虫出现错误继续爬虫?
———————————————————————————————————————————
20.urllib2,requests
●urllib2是python2内置模块操作较为底层,步骤繁琐,主要用于了解爬虫工作机制。
requests是第三方模块,封装大量爬虫底层函数,对python2,3有友好支持。
●requests提供的函数请求get,post,等其他请求
●通过urllib.urlencode()编码参数的方式,是在urllib2底层操作中使用的
●
———————————————————————————————————————————
21反爬虫操作:
较为高端的反爬虫操作:字段属性加密
客户提交数据必需附带服务端加密数据,如果没有加密数据或加密数据不一致,不返回数据
解决措施:参数加密处理,了解加密的流程,对方加密的步骤和操作,还原加密的过程,获得加密的数据,采集目标数据。
所有可能出现验证码的情况的一般都为post请求,提交会改变数据。
人工打码(24小时)啦啦打码,打码兔
———————————————————————————————————————————
22.Xpath
Python提供对Xpath的友好支持引入第三方模块 lxml
XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言
———————————————————————————————————————————
23.云图(三个模块)
中文分词:jieba
数据渲染:
将词语按云图形式处理:wordcloud
数据展示:matplotlib
中文处理:虚拟环境》lib》修改site.py
reload(sys)
Sys.setdedaultencoding(‘GBK’)
———————————————————————————————————————————
24.数据库入库
DDL、DML 数据库定义语言,数据库操作语言
Mysql数据库,pymysql模块
pymysql,mysqldb区别?
都是mysql数据库使用的第三方模块
Mysqldb是python操作的mysql数据模块(官方)旧版本使用
Pymysql是第三方模块新版本使用
———————————————————————————————————————————
25.Pymysql操作mysql数据库
CRUD操作:
增删改:insert,delete,update [execute|executeMany]
查:select[execute|fetchone|fetchMany|fetchAll]
把pymysql操作数据库,封装成工具模块,提供给其他模块引用使用,操作数据模块[db_utils]
———————————————————————————————————————————
26.数据筛选
数据分为:结构化的数据 非结构化的数据
正则表达 效率非常高
Xpath、Jsonpath 效率高
BeautifulSoup4(可结合正则,xpath)效率较高
结构化数据:Xpath、Jsonpath、BS4、正则
非结构化数据:正则
pip
install beautifulsoup4
BS 对象:可以直接操作网页中的文档数
Findall
:ret=soup.findall()
主要:css select
# 1.
CSS 标签选择器:根据标签名称查询标签对象
res1 =
soup.select("span")
print(res1)
# 2.
CSS ID选择器:根据ID查询标签对象
res2 =
soup.select("#gender")
print(res2)
# 3.
CSS 类选择器:根据class属性查询标签对象
res3 =
soup.select(".intro")
print(res3)
———————————————————————————————————————————
27.scrapy深度爬虫
环境配置:
Windows
安装可执行的安装包
Python中安装一个交互模块 pypiwin32
创建scrapy项目:
Scrapy
startproject 项目名
或者 进入到目录里scrapy genspider baidu(‘爬虫项目’) baidu.com(网站域名)直接创建好
Item封装采集数据类型
2.item中设置封装采集数据
———————————————————————————————————————————
拓展
安装 buildwith模块 通过 buildwith.parse(url) 查看网页实现技术
安装 python-whois 模块查看目标网站的所属组织
———————————————————————————————————————————
.extract() 将取出的文本转换为unicode编码
#yield
协程 类似于多线程
yield response.follow(next_page[0], callback=self.parse)
有下一页链接,加到相应队列,yield将请求对象交给scrapy引擎模块,引擎模块交给调度模块进行排队下载完 callback 交给 self.parse
———————————————————————————————————————————
28. 启用piplines
ITEM_PIPELINES
= {
‘zhilianspider.pipelines.ZhilianspiderPipeline‘: 300,
}
300 是优先级 越小越先执行
———————————————————————————————————————————
29.scrapy.spider
Import
scrapy
创建一个爬虫项目 【scrapy startproject 项目名】
Cd 项目 在spiders目录下创建爬虫程序
自定义一个爬虫程序继承 scrapy.Spider
设置 名字 允许域名 目标采集地址
定义parse函数 筛选对应信息
判断下一页 ,yeild response.follow(next_page[0],callback=self.parse) 交给自身继续采集
缺点:只适合简单爬取,如果采集信息深度再加深,函数功能太复杂,不符合模块开发面向对象的开发原则,
单一,高内聚,低耦合
●深度爬虫: CrawlSpider
Scrapy
自动采集数据,我们只负责定义Rule和指定的处理函数scrapy会根据指定的规则自动分类筛选数据,
将筛选的数据直接交给我们指定好的函数进行处理
定义筛选链接的方式: scrapy.linkextractors.LinkExtractor
定义筛选规则:scrapy.spider.Rule
1.创建一个爬虫项目 【scrapy startproject 项目名】
2.Cd 项目 在spiders目录下创建爬虫程序
需要引入模块:
爬虫模块: from scrapy.spider import CrawlSpider
链接提取模块:from scrapy.linkextractors import LinkExtractor
规则模块: from scrapy.spider import rule
3自定义一个爬虫程序继承 CrawlSpider
4 设置 名字 允许域名 目标采集地址
5 定义提取链接
Link1= LinkExtractor(restrict_xpaths=(""))
定义提取下一页
Link2=
LinkExtractor(restrict_xpaths=(""))
6定义提取规则和指定函数
rules
= [
# 第一个提取方式,第二个处理函数,follow跟进
Rule(link_job,
callback="parse_job"),
Rule(link_page, follow=True),
]
———————————————————————————————————————————
30.无界面浏览器
Selenium+PhantomJS
引入测试模块
from
selenium.webdriver import PhantomJS
创建无界面浏览器对象
browser=PhantomJS(“./phantomjs-2.1.1-windows/bin/phantomjs”)
访问网页
brower.get(“http://www.baidu.com”)
输入文本
input=brower.find_element_by_id(‘kw’)
Input.send_keys(‘lvfei’)
保存访问到的网页
brower.save_screenshot(“baidu1.png”)
点击百度一下
btn=brower.find_element_by_id(‘su’)
tn.click()
退出浏览器
brower.quit()
———————————————————————————————————————————
31.Scrapy-Redis 分布式爬虫
Redis数据库【内存数据库】:专门用于在内存中处理程序中的数据操作的数据库软件
Key-value存储系统
Redis为了提升数据操作效率,将和程序交互的数据临时在内存中交互【内存中的交互要比在硬盘中的交互方式快速太多】,同时检测了内存中数据的读写次数,如果当一个数据长时间没有进行数据读写时,直接同步到硬盘中,占荣的内存空间释放其它资源使用。
Redis特点:
支持数据的持久化,可以将内存中的数据存在磁盘中,重启的时候再次加载进行使用
不仅仅支持简单的key-value类型的数据,还提供list set hash等数据结构的存储
Redis 性能极高 读110000次/s 写81000次/s
Redis 官方只支持linux unix系统安装 windows下 github上面下载
32.python如何进行内存管理?
Python内部使用引用计数,来保持追踪内存中的对象,python内部记录了对象有多少个引用,即引用计数,
当对象被创建时就创建了一个引用计数,当这个对象的引用计数为0时,它被垃圾回收。
———————————————————————————————————————————
33.Python实现tuple和list转换?
———————————————————————————————————————————
34.什么是lambda函数,好处?
Lambda函数是一个可以接收任意多个参数并且返回单个表达式值的函数。
好处:比较轻便,很适合完成一项功能,只在此处应用
匿名函数一般用来给filter,map这样的函数编程服务
作为回调函数传递给某些应用,比如消息传递
———————————————————————————————————————————
35.为什么要用单例模式?
单例模式是常用的软件设计模式,核心结构只包含一个被称为单例类的特殊类,单例模式保证一个类只有一个实例而且
该实例易于外界访问,从而方便对实例个数控制并节约资源。
———————————————————————————————————————————
36.什么是协程?
概念:协程是一种用户状态的轻量级线程
理解:线程是系统级别的,有操作系统调度,协程是程序级别的,由程序员根据需要自己调度,一个线程的一个函数
叫做子程序,子程序在执行过程中可以中断去执行别的子程序,别的子程序也可以中断回来继续执行之前的子程序。
优点:避免了无意义的调度,提高了性能,方便切换,适合高并发
缺点:协程的本质就是单线程,无法利用多核资源,若进行阻塞会阻塞掉整个程序
———————————————————————————————————————————
37.闭包的作用?
闭包:外部函数定义的内部函数就是闭包
闭包的作用及好处:
闭包给访问外部函数定义的内部函数变量创造了条件,将关于函数的一切封闭到了函数内部,减少了全局变量
什么时候使用闭包?
当每次调用函数A时都要改变全局变量B,且B只与A有关。可以将B定义为A的内部变量,同时A内定义闭包C,并将C当值返回
———————————————————————————————————————————
38.Cookie session 的区别和联系?
|
Cookie |
Session |
储存位置 |
客户端 |
服务器端 |
目的 |
跟踪会话,也可以保存用户偏好设置或者保存用户名密码等 |
跟踪会话 |
安全性 |
不安全 |
安全 |
———————————————————————————————————————————
39.管理不同版本代码?
Svn/
Git
———————————————————————————————————————————
40服务器部署Django应用?
Uwsgi+nginx
———————————————————————————————————————————
赋值,深拷贝,浅拷贝的区别?
(1)直接赋值是一个完完全全的引用,对新变量的任何改动都会影响到原对象。
(2)浅拷贝创建了新的对象,但是只拷贝了序列的元素,对于元素也是一个序列的情况(即子对象),只复制了对这个序列的引用!
(3)深拷贝是完完全全的拷贝,把原对象完整地拷贝到了新对象中。
浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向新的内存
Python查询和替换一个文本字符串?
正则匹配
import re str=‘hello‘ p=re.compile(r‘l‘) p2=p.sub(‘o‘,str) print p2 p2=heooo
find()方法可以在一个较长的字符串中查找子串,返回子串坐在位置的最左端索引
# str=‘012hello456‘ # str1=str.find(‘l‘) # print str1
找第一个l位置索引 str=‘012hello456‘ str1=str.rfind(‘l‘) print str1
找最后一个l位置索引 replace()方法返回某字符串的所有匹配项均被替换之后得到的字符串
str=‘everyone‘ str1=str.replace(‘e‘,‘a‘) print str1
静态方法,类方法,实例方法?
数组和元组的区别?
列表可以修改,而元组不可以修改,如果元组中仅有一个元素,则要在元素后加上逗号。
元组和列表的查询方式一样。
元组只可读不可修改
Python2 ,3 的区别?
●编码:python2 ascii 编码 源代码文件都不支持中文源代码代码中第一行的位置,添加支持中文的注释
python3 unicode编码
●爬虫工作主流版本:2.x
[都是从网络上采集数据,采集的数据文本数据、二进制数据,为了方便并且统一的进行采集数据的处理,使用python2操作更加灵活]
Python2在爬虫方向支持的第三方模块更多
●python2 print 被 python3 print() 取代
●字符串类型
版本 |
python2 |
python3 |
字节字符串 |
str |
bytes |
文本字符串 |
Unicode |
str |
●python2中/的结果是整型,python3中是浮点类型
单双三引号区别?
单双引号如果字符串要换行要用\ 三引号则不用
32. redis 数据库端口号 6379 mysql(关系型数据库的明星) 端口号 3306 mongodb (文档型数据库的翘楚)端口号50107
Redis 启动默认情况下启动16个数据库,分别使用0-15个整数进行编号
存储数据 以key value 存储
Mysql 和 mongodb的区别?
Mongodb文档型数据库:提供可扩展的高性能数据存储
基于分布式的文件存储,高负载情况下添加更多的节点,保证服务器的性能,将数据存储为一个文档
Mongodb对数据间的事物关系支持比较弱
Mongodb优势:
●适合对数据库具体数据格式不明确或者数据库数据格式经常发生变化的需求模型,对开发者友好。
●自带分布式文件系统,很方便的部署到服务器集群上
●自带map-reduce运算框架的支持,方便进行数据的统计
传统数据库由:数据库 表 记录 组成
Mongodb由:数据库 集合 文档对象 组成
49.可变与不可变
数字,字符串,布尔值,元组(其他都是可变的)
不可变类型传递后,一方进行了修改,不影响另一方
可变类型传递后,一方修改了,影响另一方
50.迭代器 生成器
在Python中,这种一边循环一边计算的机制,称为生成器:generator。
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
51.*args and **kwargs
*args 用来将参数打包成tuple给函数体调用
**kwargs 打包关键字参数成dict给函数体调用
顺序问题 必须是 arg, *args,**kwargs 不然程序会报错
52.装饰器
装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。
装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。
概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
53.python重载
函数重载主要是为了解决两个问题。
- 可变参数类型。
- 可变参数个数。
- __new__是一个静态方法,而__init__是一个实例方法.
- __new__方法会返回一个创建的实例,而__init__什么都不返回.
- 只有在__new__返回一个cls的实例时后面的__init__才能被调用.
- 当创建一个新实例时调用__new__,初始化一个实例时用__init__.
54. __new__和__init__的区别
55. import方法
作为python的模块是天然的单例模式
56.全局锁GIL
线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的限制,说白了就是一个核只能在同一时间运行一个线程.
57.协程
简单点说协程是进程和线程的升级版,进程和线程都面临着内核态和用户态的切换问题而耗费许多切换时间,而协程就是用户自己控制切换的时机,不再需要陷入系统的内核态.
58.Python里最常见的yield就是协程的思想! Scrapy爬虫中的yield
59.闭包
闭包(closure)是函数式编程的重要的语法结构。闭包也是一种组织代码的结构,它同样提高了代码的可重复使用性。
- 必须有一个内嵌函数
- 内嵌函数必须引用外部函数中的变量
- 外部函数的返回值必须是内嵌函数
60.Python 垃圾回收机制
Python GC主要使用引用计数(reference counting)来跟踪和回收垃圾。在引用计数的基础上,通过“标记-清除”(mark and sweep)解决容器对象可能产生的循环引用问题,通过“分代回收”(generation collection)以空间换时间的方法提高垃圾回收效率。
PyObject是每个对象必有的内容,其中ob_refcnt就是做为引用计数。当一个对象有新的引用时,它的ob_refcnt就会增加,当引用它的对象被删除,它的ob_refcnt就会减少.引用计数为0时,该对象生命就结束了。
优点:简单、实时性
缺点:维护引用计数消耗资源、循环引用
61.Python里面如何实现tuple和list的转换?
tuple可以说是不可变的list,访问方式也是通过下表索引
62.Python中 is:
is是对比地址,==是对比值
63.什么是python?
Python:Python是一种解释型语言,Python代码在运行之前不需要编译
Python是动态类型语言,指的是你在声明变量时,不需要说明变量的类型
Python非常适合面向对象的编程(OOP),因为它支持通过组合(composition)与继承(inheritance)的方式定义类(class)
Python代码编写快,但是运行速度比编译语言通常要慢
Python让困难的事情变得容易,因此程序员可以专注于算法和数据结构的设计,而不用处理底层的细节
64.死锁
原因:1竞争资源程 2序推进顺序不当
必要条件:互斥条件、请求和保持条件、不剥夺条件、环路等待条件
处理死锁基本方法:预防死锁(摒弃除1以外的条件)、避免死锁(银行家算法)、检测死锁(资源分配图)、解除死锁(剥夺资源、撤销进程)
65.数据库索引
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。
索引分为聚簇索引和非聚簇索引两种,聚簇索引 是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。
66.乐观锁和悲观锁
悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。
67.urllib和urllib2的区别
- urllib提供urlencode方法用来GET查询字符串的产生,而urllib2没有。这是为何urllib常和urllib2一起使用的原因。
- urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL。这意味着,你不可以伪装你的User Agent字符串等。
68.Post和get的区别?
Post不能被缓存,get可以被缓存
GET对数据长度有限制,当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。POST无限制。
GET只允许 ASCII 字符。POST没有限制。也允许二进制数据。
与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。在发送密码或其他敏感信息时绝不要使用 GET !POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。
69.列表中去重?
列表去重
list(set(l1))
用字典
1 2 3 |
l1 = [‘b‘,‘c‘,‘d‘,‘b‘,‘c‘,‘a‘,‘a‘] l2 = {}.fromkeys(l1).keys() print l2 |
用字典并保持顺序
1 2 3 4 |
l1 = [‘b‘,‘c‘,‘d‘,‘b‘,‘c‘,‘a‘,‘a‘] l2 = list(set(l1)) l2.sort(key=l1.index) print l2 |
tornado django的区别?
Tornado是可扩展非阻塞型web服务器速度相当快
69.常见状态代码、状态描述、说明:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
70、请简要说明视图的作用
1.数据库视图隐藏了数据的复杂性。
2.数据库视图有利于控制用户对表中某些列的访问。
3.数据库视图使用户查询变得简单。
71.python网络爬虫所用到的网络数据包
requests、urllib、urllib2
python网络爬虫所用到的解析数据包
BeautifulSoup、pyquery、Xpath、lxml
73.map 函数
tmp_list=[1,2,3,4] def fun(number): return number+1 print map(fun,tmp_list) [2,3,4,5] print filter(fun,tmp_list)
[1,2,3,4]
74.切片
a=[1,2,3,4,5] #取前两个 print a[:2] 【1,2】 #取依次隔两位取 print a[::2] 【1,3,5】 #为空 print a[-10:-8] 【】为空 print a[-8:] 【1,2,3,4,5】 #从前往后取 print a[-4:] 【2,3,4,5】
75.Map
python map(fun,[arg]+)函数最少有两个参数,第一参数为一个函数名,第二个参数是对应的这个函数的参数(一般为一个或多个list)
>>>def fun(x):
... return x+1 ...
>>>list(map(fun,[1,2,3]))
>>>[2,3,4]
76.Lambda
# a=[1,2,3,4] # b=[] # for x in a: # b.append(x*x) # # print b
A=[(lambda x:x*x) (x) for x in range(1,5)] print A
77. 多线程 多进程
多进程和多线程都可以执行多个任务,线程是进程的一部分。线程的特点是线程之间可以共享内存和变量,
资源消耗少(不过在Unix环境中,多进程和多线程资源调度消耗差距不明显,Unix调度较快),缺点是线
程之间的同步和加锁比较麻烦
78. Python常用模块
模块分为:自定义模块,内置模块,开源模块
内置模块: time模块 datetime模块
sys模块、os模块、hashlib模块,random模块、json模块、
re模块:compile 、 match 、search、findall、group
match:只在第一个字符串开始找,如果没有匹配,则不再继续找,如果第一个字符串中有,则只输出第一个
searh: 在所有内容里找,直到找到为止,但只输出找到的第一个
findall:把所有找到的匹配的内容,都通过列表的形式打印出来
compile: 编译之后再去匹配,这样可以加快匹配的速度
group: 把他匹配的内容输出出来
原文地址:https://www.cnblogs.com/lvjing/p/9322742.html