爬虫部分

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

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

11.scrapy中间件的应用?

扫描二维码关注公众号,回复: 9617548 查看本文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

26.验证码如何处理?

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

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

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

  1. 简述scrapy的去重原理?

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

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

D

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

33.写代码:实现一个冒泡排序。
"""
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))
"""
34.写代码:实现一个快速排序。
"""
while low < high:\n",
if alist[high] < mid: #high小于基数
alist[low] = alist[high]
break
else: #基数如果小于了high,将high向左偏移
high -= 1 #high想左偏移了一位

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

猜你喜欢

转载自www.cnblogs.com/zcc52/p/12425640.html
今日推荐