大黄先生

导航

Python爬虫工程师面试(1)

毕业后的第一次面试,是杭州一家不大不小的公司,面试是通过电话进行,期间还是很紧张的(太久没面试的原因,以下是面试官问的一些问题:

1.Python的基本数据类型(当时就回答了整型和字符串,其他的脑子一片空白~

  六种数据类型:数字(number)、字符串(str)、列表(list)、字典(dict)、元组(tuple)、集合(set)

2.如何两个列表的交集和并集?(当时回答了,两个for循环一个个判断。。。自己都懵~

  (1).当然两个for循环挨个判断也能取出交并集~但,Python嘛,最大的优势就是函数多,简便为主

  (2).先将两个List转为Set,集合有现成的方法求交并集:

    并集:set1.union(set2)

    交集:set1.intersection(set2)

3.一个列表中,存有字典({name:xxx, age:xx, addr:xxx}),要求按照age的大小进行排序?(当时说的是,先取出age的值,然后再进行排序...

  (1).确实可以通过两个for循环取出age的值进行排序,不作讨论~
  (2).使用operator进行排序:

      list2  = sort(list1, key=operator.itemgetter('age'))  # 升序  ---降序 reverse=True

    使用lambda进行排序:

      list = sorted(list1, key= lambda list1: list1["age"])  #升序  ---降序 reverse = True

    

4.介绍Python中的函数参数的可变参数和关键字参数?(当时是真懵,之前从来没去了解这个~

  Python函数参数有4种:必选参数、默认参数、可变参数、关键字参数.(顺序不可变)

  必选参数:

    def(x):

      a = x * x

    x为必选参数,在调用函数时必须传入参数x的值~

  默认参数:

    def(x, y=2):

      a = x * y

    y为可选参数,当调用函数时,不给y传入参数时,y就使用默认值2。

  可变参数:

    def(*args):

      print(args)

    args为可变参数,在函数内部,args接收到的是一个tuple,在调用参数时,可以传入任意参数(包括零个)。

  关键字参数:

    def(**kw):

      print(kw)

    kw为关键字参数,调用参数时,kw可以设置为任意键值对或者字典,如:def("age":18)、def({"name": xx, "age": 18})

  参考:函数的参数

5.Selenium的显示等待和隐式等待的区别?(当时回答了没用过这两个,平时都是使用强制等待(time.sleep)...

  显示等待:(一般配合until()或until_not()使用

    WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)    

    

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


def Explicit_Waits(driver, way, path):
    try:
        ele = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((way, path)))
        return ele
    except Exception as e:
        print('元素寻找失败: ' + str(e))


driver = webdriver.Chrome()
driver.get('http://qzhu.co.cnki.net/Login.html?dp=&r=1592891501994')

# By.ID直接传入,元素path传入字符串
# By.后的方法是全大写如By.XPATH
ele = Explicit_Waits(driver, By.ID, 'username')
ele.send_keys('hello')

  隐式等待:

    driver.implicitly_wait(10)

    通过一定时间来等待页面上某个元素加载完成,如果超时,则会抛出异常。

6.Selenium的click和window.open的区别?(当时回答的是,我平时只用到了click,不太清楚window.open

  两种情况:

    1.当a标签中有属性target="_blank"时:

      使用click和window.open都会打开一个新的tab来打开页面

    2.当a标签中没有属性target="_blank"时:

      click:在当前tab中直接打开对应的页面

      window.open:新建一个tab打开对应的页面

7.如何通过Xpath定位兄弟节点?

  定位id=3的a标签://a[@id='3']

  下一个标签:following-sibling::*[1]

  下n个a标签:following-sibling::a[n]

  上一个标签:preceding-sbiling::*[1]

8.如何实现文本追加内容?(当时扯了一通是文本写入内容的,并不是追加。。。

  # file = open("text.txt", 'w')  写入文本,覆盖

  file = open("text.txt", 'a')  # 追加文本,不覆盖

  file.write(str)   

9.Python如何处理异常?(当时已经放弃了,直接说不知道~

try:
    正常的操作
   ......................
except:
    发生异常,执行这块代码
   ......................
else:
    如果没有异常执行这块代码

10.requests如何使用代理?(当时是问requests如何使用,我答出了分get和post两个请求方法需要的参数有:url,headers,data,然后没说到代理,确实也是没用过,hr就追问了这个问题。。。

  requests.get(url,headers,proxies)

  proxies就是其中的代理,但是我还不清楚在什么情况下是ip被封。

11.问我清不清楚什么事Python装饰器?

  这个有机会儿再单独写~

12.问我了不了解堆栈溢出?  

  简单理解就是一直入栈(函数一直在调用),分配的内存不足,导致的溢出。采用尾递归可以解决堆栈溢出。

 

总结:

  这次的面试肯定是没戏了!!!

  这是毕业后第一次面试,其中有很多问题是只要稍微思考一下还是可以回答得更好的,只是第一次面试还是比较紧张的,当时感觉脑子一片空白。确实也有一些是自己没涉及到的技术,比如selenium的显示等待和隐式等待、click和window.open的区别....Xpanth查找兄弟节点....这些平时自己都不太常用到的(但还是挺重要的,自己也没太注意。

下次加油吧~

posted on 2020-06-23 17:07  大黄先生  阅读(564)  评论(1编辑  收藏  举报