姓名:_________ 分数:_________ 总分:100分
一、填空题
1. list1 = [x for x in range(5, 2, -1)],则打印list1的结果是_____[5, 4, 3]______。(2分)
2. Python中的编码格式你用过哪些?___GBK_____,___ASCII_____,____Unicode(utf8)____。(2分)
3. 数据库大致分为_____关系型数据库______,______非关系型数据库______类型,列举你学过的数据库名称___MySQL____,____Redis____,____Mongodb____,_____sqlite____。(4分)
4. 字典和列表的区别有哪些?(2分)
i)字典通过键建立与值得关系,列表通过索引建立和值得关系。
ii)字典存储得数据不是按照数据添加得先后顺序存储的,而列表是按照数据添加得先后顺序保存得。
iii)字典通过键取值,不支持切片查询;列表通过索引取值,支持切片查询。
5. Scrapy创建项目、创建爬虫、运行爬虫的命令分别为(3分)
scrapy startproject spider
scrapy genspider zhihu zhihu.com
scrapy crawl zhihu
6. 列举常用的数据解析方式及解析用到的包(2分)
Xpath、css、bs4、lxml
7. 写一个匿名函数,用于计算两个数的和
lambda x,y: x+y。
二、简答题
1. 通过代码创建一个.xls的文件到本地,并写入多条数据,比如姓名,年龄,身高,体重等。(3分)
import xlwt
book = xlwt.Workbook()
sheet = book.add_sheet('stu')
sheet.write(0, 0, '姓名')
sheet.write(0, 1, '年龄')
sheet.write(0, 2, '身高')
sheet.write(0, 3, '体重')
list1 = [('zhangsan','20','180','80'), ('lisi','30','170','60')]
row = 1
for name, age, height, weight in list1:
sheet.write(row, 0, name)
sheet.write(row, 1, age)
sheet.write(row, 2, height)
sheet.write(row, 3, weight)
row += 1
book.save('stu.xls')
2. 类中的关键字self和super的区别是什么?(2分)
self在类中表示当前类得对象。
Super在类中表示当前类。
3. requests模块如何实现cookie的自动化管理,通过代码将主要逻辑实现出来。(3分)
From http.cookiejar import LWPCookiejar
Import requests
Session = requests.Session()
Session.cookies = LWPCookieJar(filename=’test.txt’)
Response = session.get()/session.post()
# 保存cookie
Session.cookies.save()
# 加载cookie
Session.cookie.load()
4. GET请求和POST请求的区别有哪些?(3分)
1> GET请求将参数设置在url中,以?和&得形式拼接;POST请求将参数设置在请求体中;
2> GET请求没有POST请求安全,重要数据容易暴露;
3> GET请求一般用于获取服务器资源;POST请求用于在服务器上创建资源。
5. cookie和session的区别是什么?详细描述cookie和session中间的交互过程。(5分)
区别:cookie保存在客户端。Session保存在服务器端。
交互过程:
1>用于首次访问网站得时候,服务器会通过Set-Cookie字段向客户端返回一些cookie信息;
2>客户端在接收到服务器响应之后,会解析响应头中得Set-Cookie字段,将数据缓存在本地;
3>客户端再次访问服务器得时候,会在请求头中携带这些cookie信息,用于表明客户端和服务器之间得连接状态;
6. 类的继承有哪些优势?面向对象的三大特征是什么?(2分)
优势:继承可以实现代码得重用,可以在父类已有功能得基础上,扩展新得功能。
特征:多态、继承、封装。
7. 正则表达式中的.*和.*?的区别是什么?(2分)
.*: 贪婪匹配,在能够匹配正确结果得前提下,尽可能多得匹配字符。
.*?: 非贪婪匹配,在能够匹配正确结果得前提下,尽可能少得匹配字符。
8. scrapy是什么?有哪些优势?(2分)
Scrapy是一个爬虫框架。
优势:
1>扩展性强,可以自定义管道和中间件;
2>速度快,是一个基于异步多线程得框架;
3>自由控制爬虫得爬取速度,线程数,并发数等控制爬虫爬取过快得方法;
9. scrapy自身支持获取动态网站数据吗?如果支持,怎么实现?如果不支持,怎么实现?(2分)
自身不支持
需要结合自动化测试框架selenium爬取动态网站。
10. 列举网站中常见的反爬虫措施。(2分)
User-Agent
Cookie
代理IP
请求头Host、Referer
多账号
11. 类中的__init__()函数的作用是什么?类中__new__()函数的作用是什么?(2分)
__init__()是对一个类得对象进行初始化得操作。
__new__()是创建一个类得对象。
12. scrapy各部分之间的数据流向是如何交互的,详细描述一下。(5分)
1>引擎将起始url构造成Request交给调度器;
2>调度器对Request对象生成指纹信息,根据是否去重来决定是否将Request放入队列中;
3>引擎从调度器得队列中不断得获取下一个Request请求;
4>引擎将Reques请求交给下载器Downloader进行下载,期间会经过下载器中间件process_request得处理;
5>下载器下载完成以后,经过process_response将Response对象返回给引擎;
6>引擎将Response对象交给爬虫Spider进行解析,提取数据,期间经过爬虫中间件;
7>爬虫Spider将提取得结果传递给引擎,引擎将item交给管道,将Request对象交给调度器继续调度;
13. DownoadMiddleware的作用是什么?如何自定义DownloadMiddleware,描述需要实现的函数。(3分)
作用:下载器中间件,可以在发起请求之前对Request对象添加必要得信息,比如请求头,Cookie等。
自定义:
需要实现process_request()函数和process_response()函数。
14. ItemPipeline的作用是什么?如何自定义ItemPipeline,描述需要实现的函数。(3分)
作用:对爬虫解析出来得item对象进行数据得保存。
自定义:process_item()函数。
15. ItemLoader获取的数据如何进行数据的提取和过滤的?描述原始数据到最终的结果的数据简要过滤过程。(3分)
1>在创建item_loader对象得时候,会执行item对象中input_processor和output_processor得初始化;
2>在执行add_xpath、add_css、add_value函数得时候,会将提取得结果交给input_processor进行结果得处理,结果处理完以后暂时保存在item_loader中;
3>等数据提取完毕,调用load_item()方法,执行output_processor将最终结果复制给item对象;
16. scrapy设置User-Agent的方式有哪几种?简要描述出来。(2分)
1>在settings.py中通过USER_AGENT进行配置;
2>在下载器中间件中得process_request函数中,通过request.headers.setdefault(b’User-Agent’, ‘’)设置;
3>在自定义得爬虫文件.py中,定义在headers = {‘User-Agent’: ‘ ’}中;
17. 描述scrapy的url去重原理。(2分)
1>需要将dont_filter设置为False开启去重,默认是True,没有开启去重;
2>对于每一个url得请求,调度器都会根据请求得相关信息加密得到一个指纹信息,并且将指纹信息和set()集合中得指纹信息进行比对,如果set()集合中已经存在这个数据,就不在将这个Request放入队列中。如果set()集合中没有存在这个加密后得数据,就将这个Request对象放入队列中,等待被调度。
18. scrapy能实现自定义图片的下载地址和图片名称吗?如果可以,可以通过哪些函数实现?(3分)
可以。
get_media_request()、file_path()、item_complated()
19. scrapy项目的settings.py文件中:DOWNLOAD_DELAY的作用是什么?ROBOTSTXT_OBEY的作用是什么?(2分)
DOWNLOAD_DELAY: 设置请求间隔时间,可以降低爬取速度;
ROBOTSTXT_OBEY:用来控制是否遵循robot协议得配置,如果遵守,则网站得一部分内容是无法爬取得。
20. scrapy shell的作用是什么?(2分)
可以通过scrapy shell http://www.baidu.com来连接一个网址,连接完成以后,不会终端,可以在这个命令下对xpath()和css()语法进行检测,而不用去频繁得对一个网站发送请求,降低被反爬得可能性。
21. Python的虚拟环境是如何进入虚拟环境和查看当前虚拟环境?为什么需要搭建虚拟环境?(2分)
Workon
1>搭建虚拟环境主要是为了保证环境得统一性,对于不同得应用建立专属得python环境,比如针对后台开发得django可以建立一个虚拟环境,针对爬虫开发得应用可以建立一个虚拟环境,避免环境之间产生冲突。
2>可以避免一个环境造成得安装包过的多,导致环境加载缓慢。
22. 常见的css选择器有哪几种(至少列出5种)?(3分)
class选择器
Id选择器
后代选择器
父子选择器
属性选择器
交集选择器
伪类选择器
23. Mysql数据库和MongoDB数据库的区别是什么?(2分)
Mysql是关系型数据库,需要建立多张表,通过需要建立表于表之间得关系。
MongoDB是非关系型数据库,不需要多张表,而是在一张表中通过键值得关系来保存数据。
24. scrapy中间件中,处理request请求的函数,它的返回值有哪几种情况,分别有什么作用?(3分)
Retuen None: 将请求交给后续得中间件进行处理;
Return Request: 将请求交给调度器重新调度,并终止后续中间件得执行;
Return Response: 终止后续中间件及下载器得执行,直接将Response交给引擎。
Return Except: 抛出异常
25. scrapy中间件中,处理response响应的函数,它的返回值有哪几种情况,分别有什么作用?(3分)
Return Request: 终止后续中间件得执行,将请求重新交给调度器进行调度。
Return Response: 继续执行后续得中间件。
Return Except: 抛出异常。
26. 正则表达式match()和search()函数的区别是什么?(2分)
Match()只匹配一个结果,并且只有正确结果在目标字符串得开头位置才能匹配到,如果不在开头位置,无法匹配。
Search()至匹配一个结果,但是正确结果可以在目标字符串得任意位置。
27. JSON模块中dumps()和loads()函数的作用分别是什么?(2分)
Dumps: 将一个字典转化为json字符串
Loads: 将一个json字符串转化为字典
28. *args和**args这两种参数的区别是什么?(2分)
*args: 表示元组
**args: 表示字典
29. smtplib模块发送邮件的基本步骤是什么,用代码将主要逻辑写出来。(2分)
创建客户端对象 client = smtplib.SMTP_SSL()
建立连接 client.connect(host, port)
登录授权 client.login(发件人,授权码)
发送邮件 client.sendmail()
30. 关键字return和yield的在函数中的作用分别是什么?(2分)
return是直接中断函数的执行,并返回一个结果,return之后的代码不会执行。
yield也是返回一个结果,但是yield之后的代码仍然可以执行
函数内有return,这个函数是一个普通的有返回值的函数。
函数内有yield,这个函数是一个生成器对象。
31. 通过列表生成式,生成这样一个结果列表[1, 9, 25, 49, 81]。(2分)
[x * x for x in range(1, 11) if x%2 != 0]
32. selenium中driver.switch_to.window()方法和driver.switch_to.frame()方法的区别是什么?(2分)
driver.switch_to.window(): 切换窗口,一般是指多个标签选项卡之间的切换,每一个选项卡都是一个window窗口;
driver.switch_to.frame(): 切换html内部框架,一般是在html嵌套的有<iframe>标签时会使用。
33. 三种时间等待的区别:(3分)
1>time.sleep(); 2>WebDriverWait(...).until(...); 3>driver.implicitly_wait();
1>强制等待固定的时间;
2>针对某一个元素设置智能等待时间;
3>针对整个页面的加载,设置一个智能等待时间;
34. 列举你所用过的python内置装饰器,至少2个。(2分)
@property
@staticmethod
@classmethod