爬虫

Python面试重点(爬虫篇)

注意:只有必答题部分计算分值,补充题不计算分值。

第一部分 必答题

注意:第31题1分,其他题均每题3分。

  1. 了解哪些基于爬虫相关的模块?
    re
    request
    BeautifulSoup
    lmlx
    selenium
    scrapy
    pandas
    numpy

  2. 常见的数据解析方式?
    pandas
    numpy

  3. 列举在爬虫过程中遇到的哪些比较难的反爬机制?
    js混淆

  4. 简述如何抓取动态加载数据?

  5. 移动端数据如何抓取?

  6. 抓取过哪些类型的数据,量级多少?
    scv,txt
    百万

  7. 了解哪些爬虫框架?
    scrapy框架

  8. 谈谈对scrapy的了解?
    Scrapy 是基于twisted框架开发而来,twisted是一个流行的事件驱动的python网络框架。因此Scrapy使用了一种非阻塞(又名异步)的代码来实现并发.

  • scrapy(异步):
    - 高性能的网络请求
    - 数据解析
    - 持久化存储
    - 全站数据爬取
    - 深度爬取
    - 分布式
  1. 如何解析出携带标签的局部页面数据?

  2. scrapy核心组件?
    引擎(Scrapy)
    用来处理整个系统的数据流处理, 触发事务(框架核心)
    调度器(Scheduler)
    用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页 的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
    下载器(Downloader)
    用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
    爬虫(Spiders)
    爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提 取出链接,让Scrapy继续抓取下一个页面
    项目管道(Pipeline)
    负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。 当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。

  3. scrapy中间件的应用?

  4. 如何实现全站数据爬取?

  5. 如何检测网站数据更新?

  6. 分布式爬虫实现原理?

  7. 如何提升爬取数据的效率(异步爬虫)

  8. 列举你接触的反爬机制?

  9. 什么是深度优先和广度优先(优劣)
    深度优先算法占内存少但速度较慢,广度优先算法占内存多但速度较快,在距离和深度成正比的情况下能较快地求出最优解。
    深度优先与广度优先的控制结构和产生系统很相似,唯一的区别在于对扩展节点选取上。由于其保留了所有的前继节点,所以在产生后继节点时可以去掉一部分重复的节点,从而提高了搜索效率。
    这两种算法每次都扩展一个节点的所有子节点,而不同的是,深度优先下一次扩展的是本次扩展出来的子节点中的一个,而广度优先扩展的则是本次扩展的节点的兄弟点。在具体实现上为了提高效率,所以采用了不同的数据结构。

  10. scrapy如何实现持久化存储

  • 基于终端指令的持久化存储
    - 只可以将parse方法的返回值存储到指定后缀(csv)文本文件中
    - 指令:scrapy crawl spiderName -o filePath
  • 基于管道的持久化存储
    - 在管道中接收item,可以将item中存储的数据进行任意形式的持久化存储(pipelines.py)
    - process_item():负责接收item对象且对其进行持久化存储
  1. 谈谈对crawlspider的理解,如何使用其进行深度爬取

  2. 如何实现数据清洗?
    处理空值

  3. 了解过机器学习吗?
    机器学习就是从样本数据中自动分析获得规律(模型),并利用规律(模型)对未知数据进行预测,分类。

  4. 在爬虫中为什么需要是用selenium?selenium和爬虫之间的关联是什么?

  5. 列举你所熟知的selenium模块中的常用方法及其作用

  6. 解释在多任务异步协程中事件循环(loop)的作用是什么?

  7. 多任务异步协程是如何实现异步的?

  8. 验证码如何处理?

  9. scrapy 和 scrapy-redis 有什么区别?

  10. 说一说打开浏览器访问 www.baidu.com 获取到结果,整个流程。

  11. 列出你知道 header 的内容以及信息

  12. 简述scrapy的去重原理?

  13. 下列叙述中错误的是:(1分)

    A.栈是线性结构	B.队列是线性结构
    C.线性列表是线性结构	D.二叉树是线性结构
    

D

  1. 简述前序、中序、后续遍历?

  2. 写代码:实现一个冒泡排序。
    """
    def sort(a_list):
    for j in range(0,len(a_list)-1):
    for i in range(len(a_list)-1-j):
    if a_list[i] > a_list[i+1]:
    a_list[i],a_list[i+1] = a_list[i+1],a_list[i]
    return a_list
    a_list = [3,5,2,0,55,32]
    print(sort(a_list))
    """

  3. 写代码:实现一个快速排序。
    """
    while low < high:\n",
    if alist[high] < mid: #high小于基数
    alist[low] = alist[high]
    break
    else:#基数如果小于了high,将high向左偏移
    high -= 1 #high想左偏移了以为

low向右偏移

while low <high:
if alist[low] < mid:#如果low小于mid则让low想右偏移
low += 1#让low向右偏移一位
else:
alist[high] = alist[low]
break
if low == high:#low和high重复,将基数赋值到low或者high的位置
alist[low] = mid #alist[high] = mid
return alist
"""

第二部分 补充题

  1. 列举常见用的git命令?
    git init:在本地新建一个repo,进入一个项目目录,执行git init,会初始化一个repo,并在当前文件夹下创建一个.git文件夹.
    git clone:获取一个url对应的远程Git repo, 创建一个local copy.
    git status:查询repo的状态。
    git log:查看一个分支的提交历史。
    git diff:查看当前文件和暂存区域之间的差异
    git commit:提交已经被add进来的改动
    git reset:还原到某个提交状态
    git checkout:切换分支
    git merge:把一个分支merge进当前的分支
    git tag:在一个提交上建立一个书签
    git pull:更新本地
    git push:提交分支到远程服务器

  2. 你们公司/团队用怎么做的协同开发?
    git/github

  3. 公司如何做代码review?谁来做?

  4. 线上代码如果出现bug如何解决?

  5. git rebase的作用?

git实战视频地址:https://www.bilibili.com/video/av70772636

posted @ 2020-03-06 11:50  mestrong  阅读(89)  评论(0编辑  收藏  举报