换了个地方,来北京工作,面试了4家python爬虫,写一些这四家(记得的)笔试题(1)

1、请简要说明视图的作用

数据库视图,隐藏数据复杂性;有利于用户对于数据库中某些列数据的访问

使用户查询变得简单

2、列举您使用过的python网络爬虫所用到的网络数据包(最熟悉的在前):

 requests,urllib2,urllib

3、列举您使用过的python网络爬虫所用到的解析数据包(最熟悉的在前):

 xpath, beautifulsoup

4、列举您使用过的python中的编码方式(最熟悉的在前):

 utf-8,gbk

5、python3.5语言中enumerate的意思是_______________________

 python中是列表,枚举

6、99的八进制表示是_______________________

 143

7、请举出三种常用的排序算法

 冒泡,选择,快速

8、列出比较熟悉的爬虫框架

 scrapy

9、     49 27四个数字,可以使用+-*/,每个数字使用一次,使表达式的结果为24,表达式是_____________________________

 24=9+7-4*2

10、     您最熟悉的Unix环境是_____________.Unix下查询环境变量的命令是________,查询脚本定时任务的命令是____________________

 ubentu,echo $环境变量名称;crontab -l

11、     写出在网络爬虫爬取数据的过程中,遇到的防爬虫问题的解决方案

 1. 应用手机的网页页面;2. 设置多个

通过headers反爬虫:解决策略,伪造headers

 基于用户行为反爬虫:动态变化去爬取数据,模拟普通用户的行为

 基于动态页面的反爬虫:跟踪服务器发送的ajax请求,模拟ajax请求

 

12、     阅读以下Python程序

for i in range(5,0,-1):

      print(i)

请在下面写出打印结果

 54321

13、在某系统中一个整数占用两个八位字节,使用Python按下面的要求编写完整程序。

    接收从标准输入中依次输入的五个数字,将其组合成为一个整数,放入全局变量n中,随后在标准输出输出这个整数。(ord(char)获取字符ASCII值的函数)

 

 

14postget有什么区别?

 1. 根据HTTP规范,GET一般用于获取/查询资源信息,应该是安全的和幂等。而POST一般用于更新资源信息2. get是在url中传递数据,数据放在请求头中。 post是在请求体中传递数据3. get传送的数据量较小,只能在请求头上发送数据。post传送的数据量较大,一般被默认为不受限制。5. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。

建议:1get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;

Get url中传递数据,数据信息放在请求头中;而post请求信息放在请求体中进行传递数据;get传输数据的数据量较小,只能在请求头中发送数据。

Post传输数据信息比较大,一般不受限制;

Get数据传输安全性低,post传输数据安全性高

在执行效率来说,getpost

2httphttps协议有什么区别?

 https 相对于http 来说对于网页更安全;

http协议是超文本传输协议,被用于在web浏览器和网站服务器之间传递信息。http协议工作是以明文方式发送内容,不提供任何形式的数据加密,而这也是很容易被黑客利用的地方,如果黑客截取了web浏览器和网站服务器之间的传输信息,就可以直接读懂其中的信息,因此http协议不适合传输一些重要的、敏感的信息,比如信用卡密码及支付验证码等。

安全套接字层https协议就是为了解决http协议的这一安全缺陷而出生的,为了数据传输的安全,httpshttp的基础上加入了ssl协议,ssl依靠证书来验证服务器的身份,为浏览器和服务器之间的通信加密,这样的话即使黑客借去了发送过程中的信息,也无法破解读懂它,我们网站及用户的信息便得到了最大的安全保障。

 

https协议需要到ca申请证书,一般免费证书很少,需要费用。

http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议

httphttps使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443

http的连接很简单,是无状态的, HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全

http是超文本传输协议,信息明文传输;httpshttpssl加密传输的

http连接的端口应用的是80https连接的端口应用443

http连接无状态;而https连接是应用httpssl协议进行连接,可以进行加密传输与身份验证等服务,比http更加安全

3、 域名和IP之间有什么关系,如何查看某个域名对应的所有IP

 国际互联网(Internet)上有成千百万台主机(host),为了区分这些主机,人们给每台主机都分配了一个专门的地址作为标识,称为IP地址

由于IP地址全是些的数字,为了便于用户记忆,Internet上引进了域名服务系统DNSDomain Name System)。

当您键入某个域名的时候,这个信息首先到达提供此域名解析的服务器上,再将此域名解析为相应网站的IP地址。完成这一任务的过程就称为域名解析。

1.ping  2.nslookup 3.使用站长工具等

在互联网上有成千上万的主机,为了区分这些主机,为每一个主机分配了IP,IP全是数字,为了方便人们记忆,生成了域名,

Ping;站长工具

4http协议头中,keep-alive字段有什么作用?

 HTTP协议采用请求-应答模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成 之后立即断开连接(HTTP协议为无连接的协议);

当使用Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服 务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。

通过使用keep-alive机制,可以减少tcp连接建立次数,也意味着可以减少TIME_WAIT状态连接,以此提高性能和提高httpd服务器的吞吐率(更少的tcp连接意味着更少的系统内核调用,socketaccept()close()调用)

 

5robots协议是什么?

 Robots协议(也称为爬虫协议、爬虫规则、机器人协议等)也就是robots.txt,网站通过robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。

Robots协议是网站国际互联网界通行的道德规范,其目的是保护网站数据和敏感信息、确保用户个人信息和隐私不被侵犯。因其不是命令,故需要搜索引擎自觉遵守。

 

6、 列出几种常见的关系型数据库和非关系型数据库?(每种至少两个)

 mysql,oracle  mongoDB,redis

OracleMysqlSQLServerDB2           Redis MongoDB Cassandra

 

7、 内存泄露是什么?如何避免?

 指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。

内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。

导致程序运行速度减慢甚至系统崩溃等严重后果。

 

__del__() 函数的对象间的循环引用是导致内存泄漏的主凶。

 

不使用一个对象时使用:del object 来删除一个对象的引用计数就可以有效防止内存泄漏问题.

通过 Python 扩展模块 gc 来查看不能回收的对象的详细信息

可以通过 sys.getrefcount(obj) 来获取对象的引用计数,并根据返回值是否为 0 来判断是否内存泄漏

 

Python的内存管理机制1.引用计数:通过引用计数来保持对内存中的变量跟踪,Python内部记录中所有在使用对象各有多少个引用。

Python中有个内部跟踪变量叫做引用计数器,每个变量有多少个引用,简称引用计数。当对象被创建时就创建了一个引用计数。

当某个对象的引用计数为0时,对象就不在需要,就列入了垃圾回收队列。

引用计数增加:1.对象被创建:x=4;2.另外的别人被创建:y=x;3.被作为参数传递给函数:foo(x);4.作为容器对象的一个元素:a=[1,x,'33'];

引用计数减少时:1.一个本地引用离开了它的作用域。比如上面的foo(x)函数结束时,x指向的对象引用减1;

                2.对象的别名被显式的销毁:del x ;或者del y;

                3.对象的一个别名被赋值给其他对象:x=789

                4.对象从一个窗口对象中移除:myList.remove(x)

                5.窗口对象本身被销毁:del myList,或者窗口对象本身离开了作用域。

2.垃圾回收1.引用计数: 每个对象中都有ob-refcnt来做引用计数。当一个对象...,ob-refcnt就会增加,当引用的对象删除,那么ob-refcnt就会减少当ob-refcnt为零,就会释放该对象的内存空间2.标记清除: 解决循环引用的问题。先按需分配,等到没有空闲内存的时候,从寄存器和程序栈上的引用出发,遍历所有对象和引用把所有能访问的打标记,最后将没有标记的对象释放掉3.分代技术: 提高效率,提高垃圾回收的效率,按照存活时间,分成不同的集合。将内存块按照其存活时间划分为不同的集合。每个集合就称为一个,垃圾回收的频率随代的存活时间增大而减小。。Python默认定义分代对象集合,引用数越大,对象的存活时间越长

3.内存池机制

Python中,大多数申请的都是小块的内存,会执行大量的mallocfree操作。Python引入了一个内存池机制,用于管理对小块内存的申请和释放,即Pymalloc机制。

它将不用的内存放到内存池而不是返回给操作系统。1. 当申请的内存小于256字节时,PyObject_Malloc会在内存池中申请内存;当申请的内存大于256字节时,PyObject_Malloc的行为将蜕化为malloc的行为。当然,通过修改Python源代码,我们可以改变这个默认值,从而改变Python的默认内存管理行为。2. 对于Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。

 

8、 列举几个常用的dom解析项目、插件

 xpathxml

xmllibxml2 lxml xpath

 

9、 常见的反爬虫机制有哪些?

 爬取过程中,生成多个headers,伪造;

通过headers反爬虫:解决策略,伪造headers

基于用户行为反爬虫:动态变化去爬取数据,模拟普通用户的行为

基于动态页面的反爬虫:跟踪服务器发送的ajax请求,模拟ajax请求

动态爬取数据,模仿用户行为;

1. 伪装user agent

2.使用代理

3. 降低访问频率

4. 动态爬取数据,模拟用户行为;或通过ajax请求进行模拟。

10、如何提高爬取效率?

 爬虫下载慢主要原因是阻塞等待发往网站的请求和网站返回

1. 爬取方面,利用异步io2.处理方面,利用消息队列做生产者消费者模型

1. 采用异步与多线程,扩大,电脑的cpu利用率;

2. 采用消息队列模式

3. 提高带宽

 

1、楼梯问题

1.1、给一个楼梯,从最下面往上走,每次可以走1n步,求总共有多少种走法?

1.2、给一个楼梯,从最下面往上走,每次可以走1步或2步,求总共有多少种走法?

1.3、给一个楼梯,从最下面往上走,每次可以走1步或2步或3步,求总共有多少种走法?

 # 1、 给一个楼梯,从最下面往上走,每次可以走12步,求总共有多少种走法?

# 假设只有一个台阶,那么只有一种跳法,那就是一次跳一级,f(1)=1;如果有两个台阶,那么有两种跳法,第一种跳法是一次跳一级,第二种跳法是一次跳两级,f(2)=2

# 如果有大于2级的n级台阶,那么假如第一次跳一级台阶,剩下还有n-1级台阶,有f(n-1)种跳法,假如第一次条2级台阶,剩下n-2级台阶,有f(n-2)种跳法。这就表示f(n)=f(n-1)+f(n-2)def walk_stairs(stairs):

    if stairs == 1:

        return 1

    if stairs == 2:

        return 2

    else:

        return walk_stairs(stairs-1) + walk_stairs(stairs-2)

# 2、给一个楼梯,从最下面往上走,每次可以走1n步,求总共有多少种走法?

# 1个台阶 1

# 2个台阶 2

# 3个台阶 4

# 4个台阶 8

# n个台阶 2^(n-1)

# 3、给一个楼梯,从最下面往上走,每次可以走1步或2步或3步,求总共有多少种走法?

# 1个台阶 2^(1-1)

# 2个台阶 2^(2-1)

# 3个台阶 2^(3-1)

# f(n) = f(n-1) + f(n-2) + f(n-3)

 

2、 给一个字符数组,字符包含a-z1-9,比如:a b c 4 b 2 a c 1 1 3,求只出现一次的第一次出现的字符

 str_list = ['a', 'b', 'c', 4, 'b', 2, 'a', 'c', 1, 1, 3]

def find_only_one(alist):

    for string in alist:

        count = alist.count(string)

        if count == 1:

            return string

    return None

 

3、 有一个html文本字符串,让我取出<a href="提示我这个链接地址">sflkj</a>这个a标签里面的href的链接地址?

from bs4 import BeautifulSoup

text = "<a href='提示我这个链接地址'>sflkj</a>"

the_html = BeautifulSoup(text,features='lxml')

print(the_html.find('a').attrs['href'])

或:from lxml import etree

Html = "<a href='提示我这个链接地址'>sflkj</a>".content.decode()

Html = etree.Html(Html)

li_temp_list = Html.xpath("//a/@href")

4、 下面是一个单线程的代码,请改写成多线程的:

start = "http://google.com"

queue = [start]

visited = {start}

while queue:

    url = queue.pop(0)

    print(url)  

    for next_url in extract_url(url):

        if next_url not in visited:

            queue.append(next_url)

        visited.add(next_url)

-----------------------------------------

 from concurrent.futures import ThreadPoolExecutor

start = "http://google.com"

queue = [start]

visited = {start}

pool = ThreadPoolExecutor(10)

def func(url):

    for next_url in extract_url(url):

        if next_url not in visited:

            queue.append(next_url)

        visited.add(next_url)

while queue:

    url = queue.pop(0)

    pool.submit(func,url)

pool.shutdown(wait=True)

  • 20
    点赞
  • 128
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值