zoukankan      html  css  js  c++  java
  • 面试题(五)爬虫

    1、 post、get有什么区别?

    1. 根据HTTP规范,GET一般用于获取/查询资源信息,应该是安全的和幂等。而POST一般用于更新资源信息
    2. get是在url中传递数据,数据放在请求头中。 post是在请求体中传递数据
    3. get传送的数据量较小,只能在请求头上发送数据。post传送的数据量较大,一般被默认为不受限制。
    5. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
    建议:
    1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;
    2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;
    答案

    2、 http、https协议有什么区别?

    http协议是超文本传输协议,被用于在web浏览器和网站服务器之间传递信息。http协议工作是以明文方式发送内容,不提供任何形式的数据加密,而这也是很容易被黑客利用的地方,如果黑客截取了web浏览器和网站服务器之间的传输信息,就可以直接读懂其中的信息,因此http协议不适合传输一些重要的、敏感的信息,比如信用卡密码及支付验证码等。
    安全套接字层https协议就是为了解决http协议的这一安全缺陷而出生的,为了数据传输的安全,https在http的基础上加入了ssl协议,ssl依靠证书来验证服务器的身份,为浏览器和服务器之间的通信加密,这样的话即使黑客借去了发送过程中的信息,也无法破解读懂它,我们网站及用户的信息便得到了最大的安全保障。
    
    https协议需要到ca申请证书,一般免费证书很少,需要费用。
    http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议
    http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。
    http的连接很简单,是无状态的, HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全
    答案

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

    国际互联网(Internet)上有成千百万台主机(host),为了区分这些主机,人们给每台主机都分配了一个专门的“地址”作为标识,称为IP地址
    由于IP地址全是些的数字,为了便于用户记忆,Internet上引进了域名服务系统DNS(Domain Name System)。
    当您键入某个域名的时候,这个信息首先到达提供此域名解析的服务器上,再将此域名解析为相应网站的IP地址。完成这一任务的过程就称为域名解析。
    
    1.ping  2.nslookup 3.使用站长工具等
    答案

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

    HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成 之后立即断开连接(HTTP协议为无连接的协议);
    当使用Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服 务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。
    通过使用keep-alive机制,可以减少tcp连接建立次数,也意味着可以减少TIME_WAIT状态连接,以此提高性能和提高httpd服务器的吞吐率(更少的tcp连接意味着更少的系统内核调用,socket的accept()和close()调用)。
    答案

    5、 robots协议是什么?

    Robots协议(也称为爬虫协议、爬虫规则、机器人协议等)也就是robots.txt,网站通过robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。
    Robots协议是网站国际互联网界通行的道德规范,其目的是保护网站数据和敏感信息、确保用户个人信息和隐私不被侵犯。因其不是命令,故需要搜索引擎自觉遵守。
    答案

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

    Oracle、Mysql、SQLServer、DB2           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中,大多数申请的都是小块的内存,会执行大量的malloc和free操作。Python引入了一个内存池机制,用于管理对小块内存的申请和释放,即Pymalloc机制。
    它将不用的内存放到内存池而不是返回给操作系统。
    1. 当申请的内存小于256字节时,PyObject_Malloc会在内存池中申请内存;当申请的内存大于256字节时,PyObject_Malloc的行为将蜕化为malloc的行为。当然,通过修改Python源代码,我们可以改变这个默认值,从而改变Python的默认内存管理行为。
    2. 对于Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。
    答案

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

    xml、libxml2 、lxml 、xpath
    答案

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

    通过headers反爬虫:解决策略,伪造headers
    基于用户行为反爬虫:动态变化去爬取数据,模拟普通用户的行为
    基于动态页面的反爬虫:跟踪服务器发送的ajax请求,模拟ajax请求
    答案

    10、如何提高爬取效率?

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

    1、楼梯问题

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

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

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

    # 1、 给一个楼梯,从最下面往上走,每次可以走1或2步,求总共有多少种走法?
    # 假设只有一个台阶,那么只有一种跳法,那就是一次跳一级,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、给一个楼梯,从最下面往上走,每次可以走1到n步,求总共有多少种走法?
    # 上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-z、1-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'])
    答案

    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)
    答案
  • 相关阅读:
    ActiveSync合作关系对话框的配置
    WINCE对象存储区(object store)
    Wince 隐藏TASKBAR的方法
    Wince输入法换肤换语言机制
    poj 3080 Blue Jeans 解题报告
    codeforces A. Vasily the Bear and Triangle 解题报告
    hdu 1050 Moving Tables 解题报告
    hdu 1113 Word Amalgamation 解题报告
    codeforces A. IQ Test 解题报告
    poj 1007 DNA Sorting 解题报告
  • 原文地址:https://www.cnblogs.com/skiler/p/6940630.html
Copyright © 2011-2022 走看看