1,python 常用数据结构有哪些?请简要介绍一下。
答:列表,元组,字典,集合等
列表:有序集合,可随时改变元素
元组:有序集合,一旦初始化,不可变
字典:无序集合,以key-value形式存储,key可为元组,字符串,整数等,不可重复,可随时更改
集合:无序集合,key储存,可随时增删查改
2,简要描述 Python 中单引号、双引号、三引号的区别。
答:单引号和双引号的用法是一样的,但如果字符串中要有相同的字符,要用转义符进行转义,三引号是“所见即所得”,原格式输出。
3,如何在一个 function 里面设置一个全局的变量?
答:用global进行设置全局变量
4,Python 里面如何拷贝一个对象?(赋值、浅拷贝、深拷贝的区别)
答:赋值(=),把一个变量赋给另一个变量,一个变量改变,另一个也随之改变
所谓“浅拷贝”,是指创建一个新的对象,其内容是原对象中元素的引用。(拷贝组合对象,不拷贝子对象)
常见的浅拷贝有:切片操作、工厂函数、对象的copy()方法、copy模块中的copy函数。
所谓“深拷贝”,是指创建一个新的对象,然后递归的拷贝原对象所包含的子对象。深拷贝出来的对象与原对象没有任何关联。
深拷贝只有一种方式:copy模块中的deepcopy函数。
5,如果 custname 字符串的内容为 utf-8 的字符,如何将 custname 的内容转为 gb18030 的字符串?
答:“custname ”.decode('utf-8).encoding('gb18030)
6,请写出一段 Python 代码实现删除一个 list 里面的重复元素。
答:alist = list(set([1,2,3,3,4,4]))
7,这两个参数是什么意思:args,*kwargs?
答:是可变参数,如果我们不确定要往函数中传入多少个参数,或者我们要想以列表或者元组的形式传参,那就用*args,
如果我们不知道要往函数中传多少个关键字参数,或者要传入字典的值作为关键字参数,那就要使用*kwargs
8,统计如下 list 单词及其出现次数。
a=['apple', 'banana', 'apple', 'tomato', 'orange', 'apple', 'banana', 'watermeton']
给列表中的字典排序:假设有如下 list 对象
alist=[{"name":"a", "age":20}, {"name":"b", "age":30}, {"name":"c", "age":25}]
将 alist 中的元素按照 age 从大到小排序。
9,假设有如下两个 list:a = ['a', 'b', 'c', 'd', 'e'],b = [1, 2, 3, 4, 5],将 a 中的元素作为 key,b 中元素作为 value,将 a,b 合并为字典。
答:dict_a = dict(zip(a,b))
10,http的报文组成结构?
答:请求报文:请求行,请求头,空行,请求数据
响应报文:响应行,响应头,空行,响应数据
11,解释下Http请求头和常见的响应状态码
答: cookie:这个头信息把之前发送到浏览器的 cookies 返回到服务器。
host: 这个头信息指定原始的 URL 中的主机和端口。
refer: 这个头信息指示所指向的 Web 页的 URL。例如,如果您在网页 1,点击一个链接到网页 2,当浏览器请求网页 2 时,网页 1 的 URL 就会包含在 Referer 头信息中。
User-Agent:这个头信息识别发出请求的浏览器或其他客户端,并可以向不同类型的浏览器返回不同的内容。
200:客户端请求成功;
400:客户端请求有语法错误,不被服务器理解;
403: 服务器收到请求,但是拒绝提供服务;
404 Not Found:请求资源不存在,eg:输入了错误的url;
500:服务器发生了不可预估的错误;
503:服务器当前不能处理客户端的请求,一段时间和恢复正常
12,http和https协议有什么区别?
http是超文本传输协议,被用于在web浏览器和服务器之间传递信息。http协议工作是以明文的方式发送内容,不提供任何形式的数据加密。而这也是很容易被黑客利用的地方。所以http协议不适合用于传输一些重要,敏感的信息。
https协议,是安全套接字层协议,是为了弥补http协议的缺点而出生的,https在http的基础上加了ssl协议,ssl依靠证书来验证服务器的身份,为浏览器和服务器之间的通信加密。
https协议需要用到ca证书,一般免费的很少,需要费用,而http协议则不用。
https协议是超文本传输协议,是明文传输信息,而https协议则是具有安全性的ssl加密传输协议。
http协议传输使用的端口是80,而https协议传输的端口是443
http协议的链接是很简单的,无状态的,https协议是由SSL+HTTP协议构成的加密传输协议、身份认证的网络协议 比HTTP协议安全
13,HTTP协议的特点有哪些?
答:1.支持C/S模式即客户端/服务器模式,2.简单快捷 3.灵活
14,如何提高爬虫的效率?
答:1.爬取方面,使用异步io; 2.处理方面,利用消息队列,做生产者消费者模型; 3,多进程、多线程;4,分布式; 5,提高网速
15,请简述一下scrapy的工作流程?
答:1,首先Spider将要发送请求的url经过ScrapyEngine(引擎)交给Scheduler(调度器)
2,调度器处理后,经过引擎和下载器中间件(可选)交给下载器(Downloader)
3,下载器向互联网发请求,并接受下载响应(response)。将响应经过引擎或爬虫中间件(可选)交给Spider
4,Spider处理response,提取数据并将数据经过引擎交给ItemPipline保存(可以是本地,也可以说数据库)
5,提取url重新经过引擎交给调度器进行下一个循环。知道没有url进行请求时程序停止。
16,多进程和多线程的区别?
答:1,线程是共享内存空间,进程的内存是独立的。
2,同一个进程之间的线程可以互相直接交流;两个进程之间想通信,必须通过一个中间代理来实现。
3,创建新线程简单,但创建新进程需要对其父进程进行一次克隆。
4.一个线程可以操作和控制同一进程里的其他线程;但是进程只能操作子进程。
5,改变主线程可能会影响其他线程,改变父进程,不影响子进程。
17,爬虫爬取的内容怎样进行去重?
1,利用数据库,根据特定的字段去重。
2,根据数据或url进行去重。
3,根据scrapy自带的去重机制去重。
4,还可以使用md5加密后在比较。
5,可以使用布隆过滤去重
18,用正则怎样匹配手机号?
答:“(1[3,4,5,7,8]\d{9})”
19,有一个文本,以#或@对其进行分割。例如“123#456@abccccc@d”,分割结果为[“123”, “456”, “abccccc”, “d”]
答: import re
string = “123#456@abccccc@d”
pat = re.compile(r'#|@', re.S)
result = pat.spilt(string)
print(result)
20,写一个正则,匹配文本(a+b)*(a1-b1)/2中所有变量(a, b, a1, b1)
import re
string = (a+b)*(a1-b1)/2
pattern = re.compile(r'[a-z]+\d*')
pattern = re.compile(r'[a-zA-Z] + \d*')
data = re.findall(pattern, string)
print(data)
21,在re模块中,match() 和 search() 的区别?
答: match() 只检查第一个匹配的字符,search()扫描整个字符串
22,session和cookie的联系与区别;
答:在储存位置上:session储存在服务器端,cookie储存在客户端
在目的上:cookie是跟踪会话,也可以保存用户偏好设置或者用户名和密码;session也是跟踪会话
在安全性上:cookie不安全; session 比较安全
23,什么是robot协议?
答:robot协议(爬虫协议,爬虫规则,机器人协议等)也就是robot.txt,网站通过robot协议告诉搜索引擎,哪些页面可以抓取,哪些数据不能抓取。robot协议是网站国际互联网通行的道德规范,确保用户个人的隐私不被侵犯,因其不是命令,所以需要搜索引擎自觉遵守。