十二章企业真题实战
一、360 面试题
- 请拿出B 表中的accd,(A 表中和B 表中的一样的数据)?
select * from B inner join on B.name = A.name
- a = “abbbccc”,用正则匹配为abccc,不管有多少b,就出现一次?
1. 思路:不管有多少个b 替换成一个 2. re.sub(r'b+', 'b', a)
- xpath 使用的什么库?
lxml
- redis 里面list内容的长度?
len key_name
-
多线程交互,访问数据,如果访问到了就不访问了,怎么避免重读?
创建一个已访问数据列表,用于储存已经访问过的数据,并加上互斥锁,在多线程访问数据之前,查看是否已经存在已访问的列表中,若已存在就直接跳过。
- Mysql 怎么限制IP访问?
grant all privileges on .to "数据库中用户名" @“ip地址” identified by "数据库密码";
- 带参数的装饰器?
代偿参数的装饰器
def new_func(func): def warppedfun(usernaem,password): if username =='root' and password == '123456': print("通过认证!") print("开始执行附加功能") return func() else: print("用户名账号密码错误") return return warppedfun @new_func def orign(): print("开始执行函数") orign('root', '123456')
带不定长参数的装饰器。
def new_func(func): def warppedfun(*parts): if parts: counts = len(parts) print("本系统包含", end='') for part in parts: print(part, '', end='') print('等', counts, '部分') else: print('用户名或者密码错误') return func() return warpperfun @new_func def orign(): print('开始执行函数') orign('硬件', '软件', ‘用户数据’)
同时带不定长、关键字参数的装饰器。
def new_func(func): def warppedfun(*args, **kwargs): if args: counts = len(args) print('本系统包含', end='') for arg in args: print(arg, '', end='') print('等', counts, '部分') if kwargs: for k in kwargs: v = kwargs[k] print(k, '为:', v) return func() else: if kwargs: for kwarg in kwargs: print(kwarg) k, v = kwarg print(k, '为:', v) return func() return warppedfun @ new_func def orign(): print('开始执行函数') orign('硬件', '软件', ‘用户数据’, 总用户数=5, 系统版本= ‘centos’)
二、妙计旅行面试题
- python主要的内置数据内置数据类型?
str, int, float, tuple, list, dict, set - print(dir('a'))输出的是什么?
会打印出字符型的所有的内置方法
1. ['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
- 给定两个list,A和B,找出相同元素和不同元素?
A、B中相同元素:print(set(A)&set(B))
A、B中不同元素:print(set(A)^set(B)) - 请反转字符串?
new_str = old_str[::-1]
- 用select语句输出每个城市中心大于20km酒店数量?
slecet count(hotel) from hotel_table where distance > 20 group by city - 给定一个有序列表,请输出要插入值k所在的索引位置?
def instance(list, key):
if key < list[0]:
position = 0
elif key > list[-1]:
position = len(list) -1
else:
for index in range(list):
if key > list[index] and list[index] > key:
position = index - 正则表达式贪婪匹配与非贪婪匹配的区别?
在形式上非贪婪匹配模式有一个“?”作为该部分的结束标记
在功能上贪婪模式是尽可能多的匹配当前正则表达式,可能会包含好几个满足表达式的字符串,非贪婪模式,在满足所有正则表达式的情况下尽可能减少当前匹配表达式 - 写出开头匹配字母和下划线,末尾是数字的正则表达式?
^[A-Za-z]|_.*d$ - 请署名HTTP状态码的用途,请说明常见状态码及其意义?
通过状态码告诉客户端服务器的执行状态,以判断下一步改执行什么操作。
常见的状态机器码有:
100-199:表示服务器成功接收部分请求,要求客户端继续提交其余请求才能完成整个处理过程。
200-299:表示服务器成功接收请求并已完成处理过程,常用200(OK 请求成功)。
300-399:为完成请求,客户需要进一步细化请求。302(所有请求页面已经临时转移到新的url),
304、307(使用缓存资源)。
400-499:客户端请求有错误,常用404(服务器无法找到被请求页面),403(服务器拒绝访问,
权限不够)。
500-599:服务器端出现错误,常用500(请求未完成,服务器遇到不可预知的情况)。 - 当输入http://www.baidu.com 时,返回页面的过程中发生了什么?
1>浏览器想DNS服务器发送baidu.com域名请求;
2>DNS服务器返回解析后的ip发送给客户端浏览器,浏览器向该ip发送页面请求;
3>DNS服务器接收到请求后查询该页面,并将页面发送给客户端浏览器;
4>客户端浏览器接收到页面后,解析页面中的引用,并再次向服务器发送引用资源请求;
5> 服务器接收到资源请求后,查询并返回资源给客户端;
6> 客户端浏览器接收到资源后,渲染,输出页面展现给用户 -
有一个多层嵌套列表A=[1,2,[3.4["434",[...]]]]请写一段代码遍历A 中的每一个
元素并打印出来a= ["a","b",["1","3",["4","haha"]]] for b in a : for c in b : for d in c : print(d)
- 关系型数据库中,表和表之间有左连接,内连接,外连接,分别解释下塔恩的含义和区别?
内连接查询:查询结果为两个表匹配到的数据
右链接:查询的结果为两个表匹配到的数据,右表特有的数据,对于左表中不存在的数据使用null填充
左连接查询:查询结果为两个表匹配到的数据,左表特有的数据,对于右表中不存在的数据使用null填充
-
如何定时启动你的爬虫项目?
1.最简单的方法:直接使用timer类import time import os while 1: os.system("scrapy crawl News") time.sleep(86400)
2.使用sched
import sched # 初始化sched模块的scheduler类 # 第一个参数是一个可以返回时间戳的函数,第二个参数可以定时未到之前阻塞 schedule = sched.scheduler(time.time, time.sleep) #被周期性调度出发的函数 def fun(): os.system("scrapy crawl News") def perform1(inc): schedule.enter(inc,0, perform1, (inc,)) func() # 需要周期执行函数 def mymain(): schedule.enter(0,0, perform1, (86400)) if __name__ = "__main__": mymain() schedule.run() # 开始运行,直到计划时间队列变为空为止
3. 使用Crontab
0 */24 * * * cd /data/spider && scrapy crawl article
参考博客:https://blog.csdn.net/gaoshanliushui131/article/details/72721704
-
什么是scrapy-redis中的指纹,是如何去重的?
指纹:通过shal加密。把请求体,请求方式,请求url放在一起,然后进行16进制的转义符字符串生成指纹,生成一个字符串,放到一个字符串中,梵高数据库中作为唯一标识
去重:urll中按照url去重:1.按照url去重,有一个列表,发送请求之前从数据表中看一下这个url有没有请求过,有请求过就不用看了。2. 内容判断:从数据库中查询数据的表示,如果请求过了就不在请求 -
优化代码主要从哪些方面考虑?
具体的链接:http://python.jobbole.com/81956/
1.优化算法时间复杂度
2.减少冗余数据
3.合理使用copy和deepcopy
4.使用dict或set查找元素
5.合理使用生成器(generator)和yield
6.优化循环
7.优化包含多个判断表达式的顺序
8.使用join合并迭代器中的字符串
9.选择合适的格式化字符串方式
10.不借助中间变量交换两个变量的值
11.使用if is
12. 使用级联比较 x<y<z
13. while 1 比while True 更快
14.使用**而不是pow
15.使用cProfile,cStringI()和cPickle等用c实现相同功能(分别对应profile,StringI(), pickle)
16.使用最佳的反序列化方式
17.使用C扩展(Extension)
18.并行编程
19.终极大杀器:PyPy
20.性能分析工具 - Django项目的优化(web通用)
1.优化数据库查询:
1.1一次性提供所有的数据
1.2 仅提供相关的数据
2.代码优化
2.1 简化代码
2.2 更新或替换第三方软件包
2.3 重构代码
更多详情参考博客:http://python.jobbole.com/88971/
三、智慧星光面试题(
这家公司主要做舆情分析,问题主要集中在页面解析和Selenium+Phantom JS 解析复杂页面,ajax
页面请求等,图片识别,机器学习。
)
- 定义A=("a", "b", "c", "d" ),执行del A[2]后的结果为(D):
A: (“a”, “c”, “d”)
B: (“a”, “b”, “c”)
C: (“a”, “b”, “d”)
D: 异常