爬虫找工作之面试题(1)

#### 1.什么是爬虫并解释其概念?

```python
(1)爬虫又叫网页蜘蛛,是模拟人操作客户端向服务器发起请求,抓取数据的自动化程序或脚本
(2)说明:
①模拟:用爬虫程序伪装出人的行为,避免被服务器识别为爬虫程序
②客户端:浏览器、app都可以实现人与服务器之间的交互行为,应用客户端从服务器获取数据
③自动化:数据量较小可以人工获取,但往往在公司里爬取的数据量在百万条、千万条级别,所以要程序自动化获取数据
```

---

#### 2.http协议与https协议的区别

```python
1.http协议需要到ca申请证书,一般免费证书较少,因而需要一定费用
2.http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议
3.http和https使用的是完全不同的连接方式,用的端口不一样,前者是80,后者是443
4.http的连接很简单,是无状态的,https协议是有ssl+http协议构建的可进行加密传输、身份认证的网络协议,比http协议安全
```

---

#### 3.谈谈你对tcp协议与udp协议的理解

```python
(1)两者都是传输层协议
(2)Tcp协议,是一种面向连接的,可靠的,基于字节流的传输层通信协议,其具有以下4个特性:
①有序性
②正确性
③可靠性
④可控性
(3)Udp协议,是用户数据协议,面向无连接的传输层协议,传输不可靠,其具有以下3个特点:
①无连接,数据可能丢失或损坏
②报文小,传输速度快
③吞吐量大的网络传输,可以在一定程度上承受数据丢失
```

---

#### 4.什么是robots协议?阐述robots协议与爬虫的关系?

```python
(1)Robots协议是约定哪些内容允许哪些爬虫抓取
(2)通用爬虫需遵守robots协议,而我们写的聚焦爬虫则不需要遵守
```

---

#### 5.默认端口信息:

```python
(1)Mysql:3306
(2)ssh:22
(3)MongoDB:27017
(4)Redis:6379
(5)https:443
(6)http:80
```

---

##### 6.Requests模块发送get请求的参数:

```python
(1)Url
(2)Headers
(3)Params
(4)Proxies
proxy
proxies
```

---

#### 7.Requests模块发送post请求的参数:

```python
(1)Url
(2)Headers
(3)Data
(4)Proxies
```

---

##### 8.简述聚焦爬虫的设计思路

```python
(1)确定url,模拟浏览器向服务器发送请求
(2)获取响应数据并进行数据解析
(3)将目标数据持久化到本地
```

---

##### 9.简述爬虫的分类及各类爬虫的概念

```python
(1)通用爬虫:爬取网页数据,为搜索引擎提供检索服务
(2)聚焦爬虫:针对某一领域爬取特定数据的爬虫
```

---

#### 10.请写出8中常用的请求方法

```python
(1)Get
(2)Post
(3)Put
(4)Delete
(5)Trace
(6)Head
(7)Connect
(8)Options
```

---

#### 11.列举反爬虫机制(至少8种)

```python
(1)UA检测
(2)Robots协议
(3)验证码
(4)IP封禁
(5)账号封禁
(6)动态数据加载
(7)Js数据加密
(8)隐藏参数
(9)字体反爬
```

---

#### 12Requests发送请求时携带headers参数及作用(至少写3点)

```python
UserAgent:实现UA伪装
Cookie:模拟登陆
Accept:接受数据类型
```

---

#### 13请列举三个可以实现网页请求的库

```python
(1)Requests
(2)Urllib
(3)Aiohttp
```

---

#### 14.简述html、css、JavaScript的作用

```python
(1)Html:定义网页骨架
(2)Css:定义网页样式
(3)JavaScript:定义网页行为
```

---

#### 15.针对requests请求的响应对象,如何获取其文本形式,二进制形式及json数据

```python
(1)Res.text:获取html源码
(2)Res.content:获取二进制流,多用于图片、视频下载等
(3)Res.json():获取json数据,多用ajax请求
```

---

#### 16.请列举三种数据持久化的方式

```python
(1)Csv
(2)Json
(3)Mysql
(4)Mongodb
(5)Redis
```

---

### B:

#### 17.正则表达式中(.*)和(.*?)匹配区别

```python
(1)(.*):贪婪匹配,尽可能多的匹配
(2)(.*?):非贪婪匹配,尽可能少的匹配
```

---

#### 18.Re模块常用的三个匹配方法,并简述其特点

```python
(1)re.findall():以列表形式返回所有满足条件的对象
(2)re.search():匹配到第一个就返回一个对象,用group()取值,匹配不到返回None
(3)re.match():从字符串开头匹配,匹配返回一个对象,用group()取值,匹配不到返回None
```

---

#### 19请简述单属性多值匹配,多属性匹配概念及使用到的函数或关键字

```python
(1)单属性多值匹配:根据节点某属性包含的某个值进行定位,使用contains函数
(2)多属性匹配:根据节点的多个属性,共同定位该节点,使用关键字and
```

---

#### 20.请列举爬虫中解析数据的模块(至少三种)

```python
(1)Lxml
(2)Bs4
(3)Pyquery
```

---

#### 21.Cookie和session的区别

```python
(1)数据存储位置不同,cookie存在客户端,session存在服务器
(2)安全程度不同,cookie存客户端本地,分析cookie,实现cookie欺骗,考虑到安全性,所以用session
(3)性能不同,session存服务器,访问 量大时,会增加服务器负载,考虑到性能,所以用cookie
(4)数据存储大小不同,单个cookie不超过4k,部分浏览器会限制cookie的存储个数,但session存在服务器,故不受客户端浏览器限制
```

---

#### 22.Xpath如何定位节点的基本语法(至少写三点)

```python
(1)根据节点名定位:nodename
(2)根据节点属性定位:nodename[@attribute=”value”]
(3)从当前节点的根节点向下匹配:./
(4)从当前节点的任意位置向下匹配:.//
```

---

#### 23.请描述xpath表达式中的./div[@id=”name”]和.//div[@id=”name”]的含义

```python
(1)从当前节点的根节点向下匹配,匹配一个div标签,该div标签的id属性值是“name”
(2)从当前节点的任意位置向下匹配,匹配一个div标签,该div标签的id属性值是“name”
```

---

#### 24.请写出xpath表达式中的/text()与//text()的区别

```python
(1)/text():获取已定位节点的直接子文本
(2)//text():获取已定节点的子孙节点文本
```

---

#### 25.请写出tcp/udp协议,ip协议,arp协议,http/https协议及ftp协议分别位于tcp/ip五层模型的哪一层

```python
(1)TCP/UDP协议:传输层
(2)IP:网络层
(3)ARP协议:数据链路层
(4)HTTP/HTTPS:应用层
(5)FTP协议:应用层
```

---

#### 26.请画出tcp/ip五层模型

```python
(1)应用层
(2)传输层
(3)网络层
(4)数据链路层
(5)物理层
```
1、应用层:针对你特定应用的协议
2、表示层:设备固定的数据格式和网络标准数据格式之间的转化
3、会话层:通信管理,负责建立和单开通信连接,管理传输层 以下分层
4、传输层:管理两个节点之间的数据传递。负责可靠传输
5、网络层:地址管理和路由选择
6、数据链路层:互联设备之间传送和识别数据帧
7、物理层:界定连接器和网线之间的规格


---

#### 27.请写出ftp协议,ssh协议、mysql、MongoDB、redis等协议或软件的默认端口号

```python
(1)ftp:21
(2)Ssh:22
(3)Mysql:3306
(4)Mongodb:27017
(5)Redis:6379
```

---

#### 28.请列举三个第三方提取数据的Python库

```python
(1)lxml
(2)BS4
(3)pyquery
```

---

#### 29.Beautifulsoup使用步骤

```python
from bs4 import BeautifulSoup
Soup=BeautifulSoup(res.text,’lxml’)
Soup.select(‘css选择器’)
```

---

#### 30.请简述bs4中get_text()和string的区别

```python
(1)String:获取节点的直接子文本
(2)get_text():获取节点下子孙节点文本
```

#### 32.Bs4对定位到的标签如何获取其直接文本,子孙节点文本和属性

```python
(1)直接子文本:string
(2)子孙节点文本:get_text()
(3)属性:tag[“attribute”]
```

---

#### 33.请列举至少四种selenium的交互操作

```python
(1)Clear()
(2)Click()
(3)Send_keys()
(4)Double_click()
```

---

#### 34列举selenium至少四种定位页面元素的方式

```python
(1)Find_element_by_name
(2)Find_element_by_id
(3)Find_element_by_xpath
(4)Find_element_css_selector
```

---

#### 35.假如实例化的浏览器对象名为broswer,请写出该对象打开百度首页的代码以及获取百度首页源码的代码

```python
From selenium import webdriver
Borwser = webdriver.chrome(“dirverpath”)
Borwser.get(“http://www.baidu.com”)
Html = browser.page_source
```

#### 36.请写出mongodb数据的相关命令

```python
创建并使用集合:use xxx
查看当前工作的集合:db
查看所有非空集合:showdbs
查看当前集合的所有数据:db.table.find()
```

---

#### 37.请列举三种关系型数据库与两种菲关系型数据库

```python
(1)关系型数据库:Mysql、orcale、sql_server
(2)非关系数据库:redis、mongodb
```

---

### C:

#### 38.Mongodb数据库的优点

```python
(1)模式*,面向集合存储,项目增删字段不影响程序运行
(2)具有丰富的查询表达式,支持动态查询,以满足项目的数据查询需求
(3)良好的索引支持,文档内嵌对象和数组,均可创建索引
(4)支持二进制数据存储,可以将图片视频等文件转换为二进制流存储起来
(5)以内存映射为存储引擎,大幅度提升性能
```

---

#### 39.简述什么是i/o密集型和计算密集型

```python
(1).Io密集型是指程序运行时,大部分状况是CPU在等待i/o,即磁盘读写,其特点是程序达到性能极限时,CPU占用率依然很低,涉及到网络,磁盘ID的任务都是io密集型
(2).计算密集型,又称CPU密集型,即程序运行过程中,IO操作很短时间内完成,而CPU占用很大,有许多运算要处理,其特点是要进行大量的运算,消耗CPU资源
```

---

#### 40.简述scrapy五大核心组件及作用

```python
(1)引擎:负责各个组件之间的通讯信号及数据的传递
(2)爬虫:定义了爬取行为和解析规则,提交item并传给管道
(3)调度器:接受引擎传递的request,并整理排列,然后进行请求的调度
(4)下载器:负责下载request,提交响应给引擎,引擎传递给spider
(5)管道:负责处理spider传递来的item,如去重、持久化存储等
```

---

#### 41.Scrapy框架有哪些优点

```python
(1)框架封装的组件丰富,适用于开发大规模的抓取项目
(2)框架基于Twisted异步框架,异步处理请求,更快捷,更高效
(3)拥有强大的社区支持,拥有丰富的插件来扩展其功能
```

---

#### 42.如何判断scrapy管道类是否需要return item

```python
在scrapy框架中,可以自定义多个管道类,以满足不同的数据持久化需求,当定义多管理类时,多个管道需传递item来进行存储,管道类各有自己的权重,权重越小,我们认为越接近引擎,越先接受引擎传递来的item进行存储,故欲使权重大的管道能够接受到item,前一个管道必须returnitem,如果一个管道类后无其他管道类,该管道则无需return item
```

---

#### 43.请问为什么下载器返回的相应数据不是直接通过引擎传递给管道,而是传递给spider

```python
由于在scrapy中,spider不但定义了爬取的行为,还定义了数据解析规则,所以响应数据需传递给spider进行数据解析后,才能将目标数据传递给管道,进行持久化存储
```

---

#### 44简述详情页爬取的思路

```python
(1).访问列表页
(2).从列表页的响应数据中获取详情页url
(3).请求详情页url,使用scrapy.request手动发送请求并指定回调
(4).解析数据在回调中获取目标数据
```

---

##### 45.Scrapy框架中间件的分类及其作用

```python
(1)下载中间件:拦截请求与响应,用于篡改响应
(2)爬虫中间件:除下载中间件的作用以外,还可以实现item丢弃
```

---

#### 46.Scrapy框架下载中间件的核心方法及其作用

```python
(1)Process_request:拦截非异常请求
(2)Process_response:拦截所有响应
(3)Process_exception:拦截异常请求
```

---

#### 47.动态数据加载的两种情况及相应的解决方案

```python
(1)ajax请求方案:如果url有规律,直接构建url实现请求,如果url无规律,则用selenium
(2)Js动态数据加载方案:可以采用scrapy框架与selenium框架对接,实现动态数据加载
```

---

#### 48.请写出selenium的常用节点交互操作(至少5条)

```python
(1)Clear():清空
(2)send_keys():输入
(3)Click():点击
(4)Quit():退出
(5)double_click():双击
```

---

#### 49.简述pipeline的核心方法及各方法实现什么功能

```python
(1)From_crawler:它是一个类方法,用@classmethod装饰,用于获取项目的配置
(2)Open_spider:在爬虫开启时被调用,可在其中连接数据库
(3)process_item:在该方法中实现与数据库的交互,存储数据
(4)close_spider:在爬虫关闭时调用,可在其中关闭数据库连接
```

---

#### 50列举三种常用的网络数据爬取的模块或框架

```python
(1)Requests
(2)Scrapy
(3)Urllib
(4)Aiohttp
(5)Pyspider
```