2018年Python面试题,爬虫阶段有哪些经典问题?

2026-05-26 12:311阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计2143个文字,预计阅读时间需要9分钟。

2018年Python面试题,爬虫阶段有哪些经典问题?

96. Git常见命令及功能:在某个文件夹中管理内容版本:进入文件夹,右键git bash,输入git init初始化,当前文件夹可被管理,且版本相关数据会存储到.git文件中。git status查看。


96. git常见命令作用

某个文件夹中的内容进行版本管理:

进入文件夹,右键git bash

  • git init 初始化,当前所在的文件夹可以被管理且以后版本相关的数据都会存储到.git文件中
  • git status 查看当前文件夹以及子目录中文件是否发生变化:内容修改/新增文件/删除,已经变化的文件会变成红色,已经add的文件会变成绿色
  • git add . 给发生变化的文件(贴上一个标签)或 将发生变化的文件放到某个地方,只写一个句点符就代表把git status中红色的文件全部打上标签
  • git commit -m ‘新增用户登录认证功能以及xxx功能’ 将“绿色”文件添加到版本中
  • git log 查看所有版本提交记录,可以获取版本号
  • git reset –hard 版本号 将最新的版本回退到更早的版本
  • git reflog 回退到之前版本后悔了,再更新到最新或者最新之前的版本
  • git reset –hard 版本 回退

97. 简述以下git中stash命令作用以及相关其他命令。

stash用于将工作区发生变化的所有文件获取临时存储在“某个地方”,将工作区还原当前版本未操作前的状态;stash还可以将临时存储在“某个地方”的文件再次拿回到工作区。

  • git stash 将当前工作区所有修改过的内容存储到“某个地方”,将工作区还原到当前版本未修改过的状态
  • git stash list 查看“某个地方”存储的所有记录
  • git stash clear 清空“某个地方”
  • git stash pop 将第一个记录从“某个地方”重新拿到工作区(可能有冲突)
  • git stash apply 编号, 将指定编号记录从“某个地方”重新拿到工作区(可能有冲突)
  • git stash drop 编号,删除指定编号的记录

98. git 中 merge 和 rebase命令 的区别。

采用merge和rebase后,git log的区别,merge命令不会保留merge的分支的commit:

99. 公司如何基于git做的协同开发?

100、如何基于git实现代码review?

利用github/gitlab自带的在线Diff展示功能做。

101. git如何实现v1.0 、v2.0 等版本的管理?

102. 什么是gitlab?

GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。安装方法是参考GitLab在GitHub上的Wiki页面。

103、github和gitlab的区别?

先说一下相同点,二者都是基于web的Git仓库,在很大程度上GitLab是仿照GitHub来做的,它们都提供了分享开源项目的平台,为开发团队提供了存储、分享、发布和合作开发项目的中心化云存储的场所。

GitHub作为开源代码库及版本控制系统,拥有超过900万的开发者用户,目前仍然是最火的开源项目托管系统。GitHub同时提供公共仓库和私有仓库,但如果要使用私有仓库,是需要付费的。

而GitLab解决了这个问题,你可以在上面创建私人的免费仓库。

GitLab让开发团队对他们的代码仓库拥有更多的控制,相比于GitHub,它有不少的特色:

允许免费设置仓库权限;允许用户选择分享一个project的部分代码;允许用户设置project的获取权限,进一步的提升安全性;可以设置获取到团队整体的改进进度;通过innersourcing让不在权限范围内的人访问不到该资源。

从代码私有性方面来看,有时公司并不希望员工获取到全部的代码,这个时候GitLab无疑是更好的选择。但对于开源项目而言,GitHub依然是代码托管的首选。

104、如何为github上牛逼的开源项目贡献代码?

对一个开源项目有足够了解的情况下,如果你发现问题或者更好的解决方案的话,可以开个issue先。

一般情况下维护这个项目的人或者其他使用这个项目的人会参与讨论的,然后基于这些讨论你可以发一些pull requests。

如果你的方案得到很多人赞同的话,项目维护人员会把他们merge,你也就成了这个项目的contributor了。

当然很多情况下,你开的这个issue已经有人提过了,或者说是你自己误解了,但是相信在和其他开发人员交流的过程中,你也能学到许多。

105、git中 .gitignore文件的作用?

一般来说每个Git项目中都需要一个“.gitignore”文件,这个文件的作用就是告诉Git哪些文件不需要添加到版本管理中。

实际项目中,很多文件都是不需要版本管理的,比如Python的.pyc文件和一些包含密码的配置文件等等。

106. 什么是敏捷开发?

敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。在敏捷开发中,软件项目在构建初期被切分成多个子项目,各个子项目的成果都经过测试,具备可视、可集成和可运行使用的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。


119、简述 requests模块的作用及基本使用?

  • 使用requests可以模拟浏览器发送的请求
  • 发送get请求:requests.get()
  • 发送post请求:requests.post()
  • 读取请求返回内容:requests.text()
  • 保存cookie:requests.cookie()

120、简述 beautifulsoup模块的作用及基本使用?

查找xml/html文本中查找指定信息的三方库

* 获取title信息 soup.title

* 获取title的属性 soup.title.attrs

121、简述 seleninu模块的作用及基本使用?

selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题

selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器

122、scrapy框架中各组件的工作流程?

  • Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。

  • Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。

  • Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理,

  • Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器),

  • Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.

    2018年Python面试题,爬虫阶段有哪些经典问题?

  • Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。

  • Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)

123、在scrapy框架中如何设置代理(两种方法)?

from scrapy.downloadermiddlewares.user:pass@hostname:9001' # 连接URL(优先于以上配置)
# REDIS_PARAMS = {} # Redis连接参数 默认:REDIS_PARAMS = {'socket_timeout': 30,'socket_connect_timeout': 30,'retry_on_timeout': True,'encoding': REDIS_ENCODING,})
# REDIS_PARAMS['redis_cls'] = 'myproject.RedisClient' # 指定连接Redis的Python模块 默认:redis.StrictRedis
# REDIS_ENCODING = "utf-8" # redis编码类型 默认:'utf-8'

b. 去重规则通过redis的集合完成,集合的Key为:

key = defaults.DUPEFILTER_KEY % {'timestamp': int(time.time())}
默认配置:
DUPEFILTER_KEY = 'dupefilter:%(timestamp)s'

c. 去重规则中将url转换成唯一标示,然后在redis中检查是否已经在集合中存在

from scrapy.utils import request
from scrapy.www.cnblogs.com/wupeiqi.html')
result = request.request_fingerprint(req)
print(result) # 8ea4fd67887449313ccc12e5b6b92510cc53675c


PS:
- URL参数位置不同时,计算结果一致;
- 默认请求头不在计算范围,include_headers可以设置指定请求头
示例:
from scrapy.utils import request
from scrapy.www.baidu.com?name=8&id=1',callback=lambda x:print(x),cookies={'k1':'vvvvv'})
result = request.request_fingerprint(req,include_headers=['cookies',])

print(result)

req = Request(url='www.baidu.com?id=1&name=8',callback=lambda x:print(x),cookies={'k1':666})

result = request.request_fingerprint(req,include_headers=['cookies',])

print(result)

!#Ensure all spiders share same duplicates filter through redis.

!#DUPEFILTER_CLASS = “scrapy_redis.dupefilter.RFPDupeFilter”

134、scrapy-redis的调度器如何实现任务的深度优先和广度优先?



标签:2018Python

本文共计2143个文字,预计阅读时间需要9分钟。

2018年Python面试题,爬虫阶段有哪些经典问题?

96. Git常见命令及功能:在某个文件夹中管理内容版本:进入文件夹,右键git bash,输入git init初始化,当前文件夹可被管理,且版本相关数据会存储到.git文件中。git status查看。


96. git常见命令作用

某个文件夹中的内容进行版本管理:

进入文件夹,右键git bash

  • git init 初始化,当前所在的文件夹可以被管理且以后版本相关的数据都会存储到.git文件中
  • git status 查看当前文件夹以及子目录中文件是否发生变化:内容修改/新增文件/删除,已经变化的文件会变成红色,已经add的文件会变成绿色
  • git add . 给发生变化的文件(贴上一个标签)或 将发生变化的文件放到某个地方,只写一个句点符就代表把git status中红色的文件全部打上标签
  • git commit -m ‘新增用户登录认证功能以及xxx功能’ 将“绿色”文件添加到版本中
  • git log 查看所有版本提交记录,可以获取版本号
  • git reset –hard 版本号 将最新的版本回退到更早的版本
  • git reflog 回退到之前版本后悔了,再更新到最新或者最新之前的版本
  • git reset –hard 版本 回退

97. 简述以下git中stash命令作用以及相关其他命令。

stash用于将工作区发生变化的所有文件获取临时存储在“某个地方”,将工作区还原当前版本未操作前的状态;stash还可以将临时存储在“某个地方”的文件再次拿回到工作区。

  • git stash 将当前工作区所有修改过的内容存储到“某个地方”,将工作区还原到当前版本未修改过的状态
  • git stash list 查看“某个地方”存储的所有记录
  • git stash clear 清空“某个地方”
  • git stash pop 将第一个记录从“某个地方”重新拿到工作区(可能有冲突)
  • git stash apply 编号, 将指定编号记录从“某个地方”重新拿到工作区(可能有冲突)
  • git stash drop 编号,删除指定编号的记录

98. git 中 merge 和 rebase命令 的区别。

采用merge和rebase后,git log的区别,merge命令不会保留merge的分支的commit:

99. 公司如何基于git做的协同开发?

100、如何基于git实现代码review?

利用github/gitlab自带的在线Diff展示功能做。

101. git如何实现v1.0 、v2.0 等版本的管理?

102. 什么是gitlab?

GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。安装方法是参考GitLab在GitHub上的Wiki页面。

103、github和gitlab的区别?

先说一下相同点,二者都是基于web的Git仓库,在很大程度上GitLab是仿照GitHub来做的,它们都提供了分享开源项目的平台,为开发团队提供了存储、分享、发布和合作开发项目的中心化云存储的场所。

GitHub作为开源代码库及版本控制系统,拥有超过900万的开发者用户,目前仍然是最火的开源项目托管系统。GitHub同时提供公共仓库和私有仓库,但如果要使用私有仓库,是需要付费的。

而GitLab解决了这个问题,你可以在上面创建私人的免费仓库。

GitLab让开发团队对他们的代码仓库拥有更多的控制,相比于GitHub,它有不少的特色:

允许免费设置仓库权限;允许用户选择分享一个project的部分代码;允许用户设置project的获取权限,进一步的提升安全性;可以设置获取到团队整体的改进进度;通过innersourcing让不在权限范围内的人访问不到该资源。

从代码私有性方面来看,有时公司并不希望员工获取到全部的代码,这个时候GitLab无疑是更好的选择。但对于开源项目而言,GitHub依然是代码托管的首选。

104、如何为github上牛逼的开源项目贡献代码?

对一个开源项目有足够了解的情况下,如果你发现问题或者更好的解决方案的话,可以开个issue先。

一般情况下维护这个项目的人或者其他使用这个项目的人会参与讨论的,然后基于这些讨论你可以发一些pull requests。

如果你的方案得到很多人赞同的话,项目维护人员会把他们merge,你也就成了这个项目的contributor了。

当然很多情况下,你开的这个issue已经有人提过了,或者说是你自己误解了,但是相信在和其他开发人员交流的过程中,你也能学到许多。

105、git中 .gitignore文件的作用?

一般来说每个Git项目中都需要一个“.gitignore”文件,这个文件的作用就是告诉Git哪些文件不需要添加到版本管理中。

实际项目中,很多文件都是不需要版本管理的,比如Python的.pyc文件和一些包含密码的配置文件等等。

106. 什么是敏捷开发?

敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。在敏捷开发中,软件项目在构建初期被切分成多个子项目,各个子项目的成果都经过测试,具备可视、可集成和可运行使用的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。


119、简述 requests模块的作用及基本使用?

  • 使用requests可以模拟浏览器发送的请求
  • 发送get请求:requests.get()
  • 发送post请求:requests.post()
  • 读取请求返回内容:requests.text()
  • 保存cookie:requests.cookie()

120、简述 beautifulsoup模块的作用及基本使用?

查找xml/html文本中查找指定信息的三方库

* 获取title信息 soup.title

* 获取title的属性 soup.title.attrs

121、简述 seleninu模块的作用及基本使用?

selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题

selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器

122、scrapy框架中各组件的工作流程?

  • Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。

  • Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。

  • Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理,

  • Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器),

  • Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.

    2018年Python面试题,爬虫阶段有哪些经典问题?

  • Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。

  • Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)

123、在scrapy框架中如何设置代理(两种方法)?

from scrapy.downloadermiddlewares.user:pass@hostname:9001' # 连接URL(优先于以上配置)
# REDIS_PARAMS = {} # Redis连接参数 默认:REDIS_PARAMS = {'socket_timeout': 30,'socket_connect_timeout': 30,'retry_on_timeout': True,'encoding': REDIS_ENCODING,})
# REDIS_PARAMS['redis_cls'] = 'myproject.RedisClient' # 指定连接Redis的Python模块 默认:redis.StrictRedis
# REDIS_ENCODING = "utf-8" # redis编码类型 默认:'utf-8'

b. 去重规则通过redis的集合完成,集合的Key为:

key = defaults.DUPEFILTER_KEY % {'timestamp': int(time.time())}
默认配置:
DUPEFILTER_KEY = 'dupefilter:%(timestamp)s'

c. 去重规则中将url转换成唯一标示,然后在redis中检查是否已经在集合中存在

from scrapy.utils import request
from scrapy.www.cnblogs.com/wupeiqi.html')
result = request.request_fingerprint(req)
print(result) # 8ea4fd67887449313ccc12e5b6b92510cc53675c


PS:
- URL参数位置不同时,计算结果一致;
- 默认请求头不在计算范围,include_headers可以设置指定请求头
示例:
from scrapy.utils import request
from scrapy.www.baidu.com?name=8&id=1',callback=lambda x:print(x),cookies={'k1':'vvvvv'})
result = request.request_fingerprint(req,include_headers=['cookies',])

print(result)

req = Request(url='www.baidu.com?id=1&name=8',callback=lambda x:print(x),cookies={'k1':666})

result = request.request_fingerprint(req,include_headers=['cookies',])

print(result)

!#Ensure all spiders share same duplicates filter through redis.

!#DUPEFILTER_CLASS = “scrapy_redis.dupefilter.RFPDupeFilter”

134、scrapy-redis的调度器如何实现任务的深度优先和广度优先?



标签:2018Python