大数据采集与预处理

发布于 2025年6月18日 13:01:22 (武汉时间)

项目1 初识动态网页数据采集与预处理

1. 1单选题

(1) 根据数据结构的不同,可将数据类型分为(C)种。
A. 1
B. 2
C. 3
D. 4

(2) 下列不属于网络爬虫的是(C)。
A. 聚焦网络爬虫
B. 深层页面爬虫
C. 增程式网络爬虫
D. 通用网络爬虫

(3) 以下不属于数据采集常用方法的是(D)。
A. 日志数据采集
B. 网络爬虫采集
C. 商业工具采集
D. 设备数据采集

(4) 以下不属于数据规约方式的是(A)。
A. 类型规约
B. 维数规约
C. 数量规约
D. 数据压缩

(5) PyCharm有(B)个版本。
A. 1
B. 2
C. 3
D. 4

6、网络爬虫又称为?C
A) 网络蜘蛛
B) 网络机器人
C) 以上都是
D) 以上都不是

7、以下哪个不是网络爬虫的应用场景?D
A) 搜索引擎
B) 舆情分析与监测
C) 聚合平台
D) 数据加密

8、HTTP协议中的URL代表什么?A
A) 统一资源定位符
B) 用户代理
C) 主机地址
D) 请求方法

9、Robots协议的作用是什么?B
A) 提供网站内容
B) 保护网站数据和敏感信息
C) 加快网页加载速度
D) 增加网站访问量

10、通用网络爬虫与聚焦网络爬虫的主要区别是?A
A) 通用网络爬虫抓取所有网页,聚焦网络爬虫只抓取特定主题网页
B) 通用网络爬虫只抓取静态网页,聚焦网络爬虫只抓取动态网页
C) 通用网络爬虫使用Python实现,聚焦网络爬虫使用Java实现
D) 通用网络爬虫不遵守Robots协议,聚焦网络爬虫遵守

11、HTTP请求格式包括哪几个部分?A
A) 请求行、请求头部、空行、请求体
B) 请求行、响应头、空行、响应体
C) 请求行、请求参数、空行、响应体
D) 请求行、请求头部、请求体、响应体

12、使用Python实现网络爬虫的优势不包括?C
A) 语法简洁
B) 开发效率高
C) 强大的网页解析能力
D) 丰富的内置模块和第三方库

13、Fiddler工具在网络爬虫中的作用是什么?B
A) 用于数据库管理
B) 记录与Web服务器之间的所有HTTP请求并支持截获、重发等操作
C) 用于前端页面设计
D) 用于提高网站安全性

14、静态网页与动态网页的主要区别在于?A
A) 静态网页内容固定不变,动态网页可以根据用户输入显示不同内容
B) 静态网页使用HTML编写,动态网页使用CSS编写
C) 静态网页可以交互,动态网页不可以
D) 静态网页需要数据库支持,动态网页不需要

15、以下哪种方法不是应对防爬虫措施的有效策略?D
A) 添加User-Agent字段
B) 降低访问频率
C) 设置代理服务
D) 删除cookies

16、在使用requests库发送GET请求时,如何正确传递查询参数?B
A. response = requests.get(url, query={'key': 'value'})
B. response = requests.get(url, params={'key': 'value'})
C. response = requests.get(url, data={'key': 'value'})
D. response = requests.get(url, args={'key': 'value'})

17、以下哪种方式可以用来设置自定义的HTTP头信息?B
A. headers = {'User-Agent': 'my-app/0.0.1'}; response = requests.get(url, headers=headers)
B. headers = {'User-Agent': 'my-app/0.0.1'}; response = requests.get(url, header=headers)
C. headers = {'User-Agent': 'my-app/0.0.1'}; response = requests.get(url, custom_headers=headers)
D. headers = {'User-Agent': 'my-app/0.0.1'}; response = requests.get(url, user_agent=headers)

18、如何检查响应状态码是否表示成功(即状态码小于400)?B
A. if response.status_code < 400: print("请求成功")
B. if response.ok: print("请求成功")
C. if response.status == "success": print("请求成功")
D. if response.code < 400: print("请求成功")

19、如何使用requests库发送一个HEAD请求来获取响应头信息而不获取响应体?A
A. response = requests.head(url)
B. response = requests.get(url, method='HEAD')
C. response = requests.request('HEAD', url)
D. response = requests.options(url)

20、如何使用requests库设置代理服务器进行请求?A
A. proxies = {'http': 'http://10.10.1.10:3128', 'https': 'http://10.10.1.10:1080'}; response = requests.get(url, proxies=proxies)
B. proxies = {'http': 'http://10.10.1.10:3128', 'https': 'http://10.10.1.10:1080'}; response = requests.get(url, proxy=proxies)
C. proxies = {'http': 'http://10.10.1.10:3128', 'https': 'http://10.10.1.10:1080'}; response = requests.get(url, use_proxy=proxies)
D. proxies = {'http': 'http://10.10.1.10:3128', 'https': 'http://10.10.1.10:1080'}; response = requests.get(url, set_proxy=proxies)

21、如何使用requests库获取二进制响应内容(例如图片)?B
A. response = requests.get(url); binary_data = response.text
B. response = requests.get(url); binary_data = response.content
C. response = requests.get(url); binary_data = response.body
D. response = requests.get(url); binary_data = response.raw

22、如何使用requests库发送一个DELETE请求?A
A. response = requests.delete(url)
B. response = requests.remove(url)
C. response = requests.request('DELETE', url)
D. response = requests.post(url, method='DELETE')

23、如何使用requests库发送一个带有Cookie信息的GET请求?A
A. cookies = {'session_id': '123456789'}; response = requests.get(url, cookies=cookies)
B. cookies = {'session_id': '123456789'}; response = requests.get(url, cookie=cookies)
C. cookies = {'session_id': '123456789'}; response = requests.get(url, with_cookies=cookies)
D. cookies = {'session_id': '123456789'}; response = requests.get(url, include_cookies=cookies)

24、如何使用requests库禁用SSL证书验证?A
A. response = requests.get(url, verify=False)
B. response = requests.get(url, ssl_verify=False)
C. response = requests.get(url, disable_ssl=True)
D. response = requests.get(url, no_verify=True)

25、如何检查响应内容的实际编码格式?B
A. print(response.encoding)
B. print(response.apparent_encoding)
C. print(response.headers['Content-Encoding'])
D. print(response.charset)

26、下列关于数据来源的描述中,哪一项属于非结构化数据?(C)
A) 信息管理系统中的二维表数据
B) JSON格式的半结构化数据
C) 邮件、图片、视频等数据
D) 物联网传感器采集的结构化数据

27、网络爬虫的基本流程中,模拟浏览器发送请求后,下一步操作是(C)。
A) 解析网页并提取资源
B) 存储资源或发送请求
C) 获取网页代码
D) 接收响应

28、以下哪种工具主要用于数据预处理中的日志数据存储和分析?(B)
A) Elasticsearch
B) Logstash
C) Kibana
D) Pig

29、PyCharm的快捷键中,用于运行当前文件的快捷键是(A)。
A) Ctrl+Shift+F10
B) Shift+F10
C) Alt+Shift+F10
D) F5

30、以下哪种数据预处理方式用于精简数据存储成本?(C)
A) 数据清洗
B) 数据集成
C) 数据归约
D) 数据转换


1.2. 多选题

1、以下属于网络爬虫用途的有(ABD)。
A) 搜索引擎数据获取
B) 电商平台商品价格比较
C) 人工电话调查
D) 数据统计分析

2、数据预处理的四个核心步骤包括(ABCD)。
A) 数据清洗
B) 数据集成
C) 数据变换
D) 数据归约

3、以下属于PyCharm功能特点的有(ABD)。
A) 支持Django框架
B) 集成版本控制
C) 图形页面调试器
D) 自动完成Python代码

4、网络爬虫的类型包括(ABCD)。
A) 通用网络爬虫
B) 增量式网络爬虫
C) 聚焦网络爬虫
D) 深层页面爬虫

5、以下属于数据预处理工具的有(ABCD)。
A) Pandas
B) Pig
C) ELK
D) Scrapy


1.3. 填空题

1、数据预处理的四个步骤分别是数据清洗、数据集成、数据变换_ 和数据归约。
2、PyCharm中用于格式化代码的快捷键是 CTRL ALT L_
3、结构化数据通常以 二维表___ 形式存储。
4、网络爬虫的 增量式_ 类型用于爬取动态更新的网页内容。
5、ELK工具中用于日志搜索和分析的组件是 Elasticsearch___


1.4. 判断题

(1) 大数据最早由维克托和肯尼斯提出,被称为巨量资料,是一种海量的、飞速增长的、多样化的信息资产。(✔️)
(2) 由于数据规模的不断扩大以及数据缺少、重复、错误等问题的出现,往往需要将整个流程约70%的时间花费在数据处理上。(❌)
(3) JS埋点采集日志通过在页面外植入JS代码实现日志数据的采集。(❌)
(4) 数据清洗是发现并纠正数据中可识别错误的一种方式。(✔️)
(5) 社区版的PyCharm需要付费使用。(❌)
6、非结构化数据可以通过二维表逻辑表示。(❌)
7、Requests库是Python内置的标准库。(❌)
8、数据清洗包括处理缺失值和逻辑错误。(✔️)
9、Pandas的DataFrame结构只能处理二维数据。(❌)
10、Flume主要用于日志数据的实时采集和传输。(✔️)


1.5. 简答题

(1) 简述网络爬虫的基本流程。
答:网络爬虫的基本流程主要包括以下几个步骤:首先,选定一个或多个起始URL作为入口点;其次,爬虫访问这些URL,并解析网页内容;然后,根据特定规则提取出感兴趣的信息和链接;接下来,将新发现的链接加入待抓取队列;最后,循环上述过程直到满足停止条件,比如达到预定的数量限制或者遍历完所有相关链接。

(2) 简述PyCharm的优势。
答:PyCharm是一款专门针对Python语言开发的强大IDE,具有多项优势:其提供了智能代码补全、代码检查和快速修复功能,极大地提高了编码效率;内置了丰富的调试工具,支持断点调试、表达式求值等功能,便于开发者排查问题;集成了版本控制系统,如Git、SVN等,方便团队协作开发;此外,还支持多种Web技术框架,如Django、Flask等,使得Web开发更加便捷。同时,PyCharm拥有直观友好的用户界面,增强了用户体验。

3、简述数据预处理中数据清洗的主要任务。
答:数据清洗的主要任务包括:处理缺失值(删除或填充)、修正格式错误(统一书写规范)、消除逻辑错误(删除重复或异常数据)、剔除非需求数据(无关字段)。

4、说明网络爬虫与日志数据采集的区别。
答:网络爬虫通过模拟浏览器抓取公开网页数据,而日志采集依赖埋点或Flume等工具收集用户行为数据,两者应用场景和数据源不同。

5、列举PyCharm的三种核心功能。
答:PyCharm的核心功能包括:代码自动完成、集成Django开发环境、版本控制支持(如Git)、图形化调试器。

6、描述结构化数据与非结构化数据的主要特点。
答:结构化数据(如数据库表)具有固定格式和字段,非结构化数据(如文本、图片)无固定模式,需特殊处理。

7、简述数据归约的意义及常用方法。
答:数据归约通过减少数据量降低成本和分析时间,常用方法包括维度归约(PCA)、数值归约(抽样)和数据压缩。


1.6. 综合题

1、结合实际案例,分析动态网页数据采集中Scrapy框架的优势及适用场景。
答:Scrapy框架优势:异步处理高并发、内置中间件和管道机制、适合大规模爬取。适用场景如电商商品数据采集、新闻网站更新监控。

2、设计一个基于ELK工具的日志数据预处理流程,并说明各组件的作用。
答:流程:Flume采集日志→Logstash过滤和格式化→Elasticsearch存储和搜索→Kibana可视化。各组件分别负责采集、处理、存储和展示。

3、假设需要搭建一个网页数据采集环境,请列出所需的工具及其主要功能。
答:工具及功能:PyCharm(开发环境)、Requests/Urllib(数据采集)、BeautifulSoup/Xpath(解析)、Pandas(预处理)、MongoDB(存储)。

4、某电商网站需采集商品评论数据,请设计一个完整的数据采集与预处理方案。
答:方案:使用Selenium模拟登录→Scrapy爬取评论→Pandas清洗数据→存储至MySQL。需处理反爬虫和数据去重。

5、分析Pandas在数据预处理中的核心作用,并举例说明其典型应用场景。
答:Pandas核心作用:提供DataFrame结构处理表格数据,支持缺失值填充(fillna)、数据筛选(query)、聚合分析(groupby)。典型场景如销售数据分析。


项目2 动态网页数据采集

2.1. 单选题

(1) Urllib库中用于打开网络连接的是(B)。
A. headers
B. urlopen
C. params
D. url

(2) 下列方法中,不属于Urllib库parse模块的是(D)。
A. urlparse()
B. urljoin()
C. quote()
D. urlretrieve()

(3) Requests库是一个使用(B)编写的HTTP库。
A. C
B. Python
C. Java
D. Scala

(4) 下列HTTP请求中,用于向服务器发送获取信息请求的是(A)。
A. GET
B. POST
C. HEAD
D. PATCH

(5) 下列用于设置超时时间的参数是(C)。
A. auth
B. files
C. timeout
D. proxies

6、关于urlparse()方法的描述,哪一项是不正确的?(C)
A) urlparse()方法用于将接收的URL路径解析成协议、域名、路径、参数、查询条件以及锚点等六个部分。
B) urlparse()方法返回结果包含字段有scheme, netloc, path, params, query, fragment。
C) urlparse()方法只能处理HTTP协议的URL。
D) urlparse()方法可以接收三个参数:urlstring, scheme, allow_fragments。

7、在使用Requests库时,哪个选项正确展示了如何设置会话级别的用户代理(User-Agent)?(B)
A) session.headers['User-Agent'] = 'my-app/0.0.1'
B) session.headers.update({'User-Agent': 'my-app/0.0.1'})
C) session.headers.add('User-Agent', 'my-app/0.0.1')
D) session.headers.set('User-Agent', 'my-app/0.0.1')

8、以下哪个异常类型是继承自URLError且专门用于处理HTTP请求返回的错误状态码?(C)
A) RequestException
B) ConnectionError
C) HTTPError
D) Timeout

9、在Requests库中,如果要发送一个带有JSON格式数据的POST请求,应该使用哪个参数?(B)
A) data
B) json
C) params
D) headers

10、下列关于urlencode()方法的描述,哪一项是正确的?(A)
A) urlencode()方法用于将字典或由两元素的元组序列转换为“application/x-www-form-urlencoded”编码的字符串。
B) urlencode()方法只能处理单个键值对。
C) urlencode()方法不会对特殊字符进行编码。
D) urlencode()方法需要手动导入urllib.parse模块才能使用。

11、在Requests库中,如何设置一个请求的超时时间为5秒?(A)
A) requests.get(url, timeout=5)
B) requests.get(url, time_limit=5)
C) requests.get(url).timeout(5)
D) requests.get(url, delay=5)

12、在使用urllib库时,若要通过POST请求上传文件,以下哪个选项是正确的做法?(C)
A) 使用urllib.request.urlopen()方法,并将文件内容作为data参数传递。
B) 使用urllib.request.Request()对象,并设置files参数为文件路径。
C) 将文件内容编码为字节序列,并将其作为data参数传递给urllib.request.urlopen()方法。
D) 使用urllib.parse.urlencode()方法对文件路径进行编码,并将其作为查询参数传递。

13、在Requests库中,如何通过基本认证方式发送请求?(C)
A) response = requests.get(url, auth=('user', 'password'))
B) response = requests.get(url, basic_auth=('user', 'password'))
C) from requests.auth import HTTPBasicAuth; session = requests.Session(); session.auth = HTTPBasicAuth('user', 'password')
D) response = requests.get(url, headers={'Authorization': 'Basic user:password'})

14、关于Session对象的描述,哪一项是不正确的?(C)
A) 使用Session对象可以在多个请求之间复用TCP连接,提高效率。
B) Session对象可以自动管理Cookie,保持会话状态。
C) Session对象不能设置代理服务器。
D) Session对象可以通过session.close()来关闭会话。

15、下列关于HTTPError异常类型的描述,哪一项是正确的?(B)
A) HTTPError仅适用于HTTP请求,无法处理HTTPS请求。
B) HTTPError继承自URLError,并且专门处理HTTP响应中的错误状态码。
C) HTTPError仅在响应状态码为404时触发。
D) HTTPError无法获取到响应头信息。

16、下列关于网络爬虫的描述中,哪一项是正确的?(C)
A) 网络爬虫只能抓取静态网页数据
B) 聚焦网络爬虫不需要遵循Robots协议
C) 通用网络爬虫主要用于搜索引擎的数据采集
D) 增量式网络爬虫会重复抓取所有网页

17、网络爬虫的工作原理中,以下哪一步骤是最后执行的?(D)
A) 获取初始URL
B) 抓取页面并获得新URL
C) 将新URL放入URL队列
D) 判断是否满足停止条件

18、以下哪项是网络爬虫的合法行为?(A)
A) 使用User-Agent字段伪装浏览器
B) 高频访问导致网站瘫痪
C) 直接抓取robots.txt禁止的页面
D) 忽略网站的Robots协议

19、通用网络爬虫和聚焦网络爬虫的主要区别在于(C)?
A) 是否使用代理服务器
B) 是否遵循Robots协议
C) 是否抓取整个互联网还是特定主题数据
D) 是否使用Python实现

20、以下哪项属于网络爬虫的防爬虫应对策略?(C)
A) 提高访问频率
B) 使用固定IP地址
C) 添加User-Agent字段
D) 不设置超时时间

21、HTTP协议中,请求方法POST和GET的主要区别是(C)?
A) POST比GET安全
B) GET可以传输文件
C) POST数据长度无限制
D) GET支持加密传输

22、以下哪个状态码表示“未找到资源”?(C)
A) 200
B) 302
C) 404
D) 500

23、URL中查询字符串的参数分隔符是(A)?
A) &
B) ?
C) #
D) :

24、HTTPS协议相比HTTP协议增加的安全特性是(B)?
A) 更快的传输速度
B) 数据加密传输
C) 更多的请求方法
D) 更长的URL长度

25、以下哪个请求头字段用于标识客户端身份?(B)
A) Accept
B) User-Agent
C) Content-Type
D) Referer

26、urlopen()方法默认使用的HTTP方法是(A)?
A) GET
B) POST
C) PUT
D) DELETE

27、Urllib模块中用于解析URL的子模块是(C)?
A) request
B) error
C) parse
D) response

28、以下哪个方法用于下载文件?(C)
A) urlopen()
B) Request()
C) urlretrieve()
D) quote()

29、Urllib异常处理中,HTTPError继承自(A)?
A) URLError
B) ConnectionError
C) TimeoutError
D) RequestException

30、URL编码中文字符应使用的方法是(B)?
A) urlencode()
B) quote()
C) unquote()
D) urlparse()

31、Requests库默认使用的HTTP方法是(A)?
A) GET
B) POST
C) PUT
D) HEAD

32、以下哪个方法用于设置会话对象?(B)
A) get()
B) Session()
C) post()
D) request()

33、Requests中处理代理的参数是(A)?
A) proxies
B) headers
C) cookies
D) auth

34、以下哪个属性表示响应状态码?(C)
A) text
B) content
C) status_code
D) encoding

35、Requests处理超时的参数是(A)?
A) timeout
B) connect
C) read
D) stream


2.2. 多选题

1、网络爬虫的应用场景包括(ABCD)。
A) 搜索引擎
B) 舆情分析
C) 电商平台商品聚合
D) 实时交通票务查询

2、以下哪些属于网络爬虫的分类(ABCD)。
A) 通用网络爬虫
B) 聚焦网络爬虫
C) 深层网络爬虫
D) 分布式网络爬虫

3、网络爬虫的工作流程包含以下哪些步骤(ABD)。
A) 获取初始URL
B) 过滤无关URL
C) 重复抓取已下载页面
D) 存储已抓取URL

4、Robots协议中的关键选项包括(ABCD)。
A) User-agent
B) Disallow
C) Sitemap
D) Crawl-delay

5、网络爬虫的实现技术中,Python的优势包括(AB)。
A) 语法简洁
B) 丰富的第三方库
C) 高性能多线程处理
D) 自动识别验证码

6、HTTP请求格式包含以下哪些部分(ABCD)。
A) 请求行
B) 请求头
C) 空行
D) 请求体

7、动态网页与静态网页的区别体现在(ABCD)。
A) 数据加载方式
B) 是否依赖数据库
C) URL格式
D) 页面更新频率

8、Fiddler工具的主要功能包括(ABC)。
A) 抓包分析
B) HTTPS解密
C) 请求重发
D) 数据库连接

9、HTTP响应头中常见的字段有(ABC)。
A) Content-Type
B) Set-Cookie
C) Cache-Control
D) User-Agent

10、URL的组成元素包括(ABCD)。
A) scheme
B) host
C) query
D) fragment

11、Urllib库包含的模块有(ABC)。
A) request
B) parse
C) error
D) response

12、urlopen()方法的参数包括(ABC)。
A) url
B) data
C) timeout
D) headers

13、URL解析结果包含的字段有(ABD)。
A) scheme
B) netloc
C) params
D) fragment

14、Urllib处理异常的方式包括(ABC)。
A) try-except
B) try-finally
C) try-else
D) try-catch

15、urlretrieve()方法的优点包括(AC)。
A) 支持文件下载
B) 自动设置超时
C) 提供下载进度回调
D) 支持断点续传

16、Requests支持的请求方法包括(ABCD)。
A) GET
B) PUT
C) OPTIONS
D) TRACE

17、Session对象可以保持的参数包括(AB)。
A) Cookie
B) headers
C) timeout
D) verify

18、Requests处理文件上传需要的参数是(A)。
A) files
B) data
C) json
D) params

19、常见的HTTP状态码包括(ABCD)。
A) 200 OK
B) 302 Found
C) 403 Forbidden
D) 500 Internal Server Error

20、Requests处理异常的模块是(A)。
A) requests.exceptions
B) requests.auth
C) requests.cookies
D) requests.structures


2.3. 填空题

1、网络爬虫的Robots协议文件名称是 robots.txt
2、网络爬虫抓取网页的核心流程是 发起请求—获取相应—解析内容—存储数据
3、Python中用于发送HTTP请求的标准库是 urllib
4、网络爬虫的增量式更新策略可以减少 重复抓取
5、网络爬虫的合法访问需要遵循 robots 协议。
6、HTTP协议默认使用的端口号是 80
7、URL中#后面的部分称为 片段标识符
8、Fiddler的工作原理是作为 代理服务器 运行。
9、动态网页数据通常通过 AJAX 技术加载。
10、HTTPS协议使用 SSL/TLS 证书保障传输安全。
11、Urllib中用于发送请求的主模块是 requests
12、URL编码中空格会被转换为 +
13、urlopen()方法返回的对象类型是 http.client.HTTPResponse
14、Robots协议文件的默认路径是 /robot.txt
15、Urllib的parse模块用于 URL解析
16、Requests中发送POST请求的方法是 post()
17、会话对象的创建方法是 session()
18、Response对象的 text 属性存储响应内容。
19、Requests默认的超时设置参数是 timeout
20、处理JSON响应数据的快捷方法是 json()


2.4. 判断题

(1) 在不同版本的Python中,Urllib库有两种。(✔️)
(2) 在Urllib库中,parse是一个用于实现HTTP请求模拟的模块,能够完成页面爬取、Cookie设置等工作。(❌)
(3) 在Urllib库中,为了避免定义异常的error模块,基于Urllib库提供了一个用于解决安全缺陷以及请求延迟等问题而被推出。(✔️)
(4) Requests库是一个使用Python编写的HTTP库,基于Urllib库建立,为解决Urllib库存在的安全缺陷以及请求延迟等问题而被推出。(❌)
(5) 在使用Requests库时会默认对SSL证书进行检查,当网站没有设置SSL证书时,就会出现证书验证错误。(✔️)
6、网络爬虫可以随意抓取任何网站的数据。(❌)
7、通用网络爬虫的目标是抓取特定主题的网页。(❌)
8、Robots协议具有法律强制约束力。(❌)
9、网络爬虫的工作流程包括解析网页数据。(✔️)
10、Python是实现网络爬虫的唯一语言。(❌)
11、GET请求的参数只能放在URL中。(✔️)
12、HTTP状态码304表示需要重新加载页面。(❌)
13、Fiddler可以捕获所有类型的网络请求。(✔️)
14、动态网页的内容在页面加载时已经确定。(❌)
15、Cookie信息存储在服务器端。(❌)
16、Urllib是Python内置的HTTP库。(✔️)
17、urlopen()方法可以设置请求头。(❌)
18、urlretrieve()仅能下载图片文件。(❌)
19、Robots协议必须放在网站根目录。(✔️)
20、Urllib支持自动处理HTTPS证书验证。(❌)
21、Requests是Python内置的HTTP库。(❌)
22、Session对象可以保持Cookie信息。(✔️)
23、Requests不支持文件下载功能。(❌)
24、get()方法的params参数用于URL编码。(✔️)
25、Requests默认启用SSL证书验证。(✔️)


2.5. 简答题

(1) 阐述Urllib库相关模块的作用。
答:

  • urllib.request:用于打开和读取URL。
  • urllib.parse:用于解析URL,支持URL的构造与拆解,也支持编码和解码。
  • urllib.error:包含了一些由urllib.request引发的异常类,比如URLError和HTTPError。
  • urllib.robotparser:用于解析robots.txt文件,判断哪些内容可以被抓取。

(2) 列举HTTP请求及其作用。
答:

  • GET:请求指定的页面信息,并返回实体主体。常用于数据检索操作。
  • POST:向指定资源提交数据进行处理请求(如提交表单或上传文件),数据被包含在请求体中。POST请求可能会导致新的资源的建立或已有资源的修改。
  • PUT:从客户端向服务器传送的数据取代指定文档的内容。
  • DELETE:请求服务器删除指定的页面或资源。
  • HEAD:类似于GET请求,只不过服务端不会返回消息体,仅返回响应头,用于获取元数据而不传输实际内容。
  • PATCH:是对PUT方法的补充,用来对已知资源进行部分修改。不同于PUT替换整个资源表示,PATCH只更新资源的部分属性。

3、简述网络爬虫的Robots协议的作用及核心规则。
答:
Robots协议是网站管理员与爬虫之间的沟通协议,用于管理内容抓取和索引。
核心规则包括:

  • User-agent(指定爬虫类型)
  • Disallow(禁止访问的路径)
  • Allow(允许访问的路径)
  • Sitemap(站点地图)

4、对比通用网络爬虫和聚焦网络爬虫的工作原理差异。
答:
通用网络爬虫抓取整个互联网数据,而聚焦网络爬虫专注于特定主题数据。
通用爬虫遵循广泛规则,聚焦爬虫通过过滤算法选择目标内容。

5、列举网络爬虫的三种应用场景并简要说明。
答:

  • 搜索引擎:用于索引网页。
  • 舆情分析:监控社交媒体数据。
  • 电商平台商品聚合:抓取商品信息。

6、解释网络爬虫的防爬虫策略中“降低访问频率”的作用。
答:
降低访问频率可以避免触发网站的反爬虫机制(如IP封禁),确保爬虫合法运行。

7、简述Python开发网络爬虫的流程步骤。
答:
Python开发网络爬虫的流程包括:发送HTTP请求→解析HTML→提取数据→存储数据→循环抓取。

8、解释HTTP请求中的Content-Type字段的作用。
答:
Content-Type字段标识请求体的数据类型(如application/json)。

9、简述动态网页数据采集的技术难点。
答:
技术难点包括定位AJAX请求、解析动态渲染内容、处理加密数据。

10、说明Fiddler工具在调试网络请求中的主要用途。
答:
Fiddler用于抓包分析、调试HTTP请求、解密HTTPS流量。

11、对比JSON和XML数据格式的优缺点。
答:
JSON更轻量、易读;XML支持复杂结构但冗余。

12、描述浏览器加载网页的完整过程。
答:
浏览器发送HTTP请求→解析HTML→加载资源→执行JavaScript→渲染页面。

13、说明urlopen()和Request()的协同工作原理。
答:
urlopen()发送请求,Request()设置请求头和参数。

14、描述Urllib处理重定向的机制。
答:
Urllib自动处理301/302重定向。

15、列举Urllib模块的三个主要功能。
答:
发送HTTP请求、解析URL、处理异常。

16、解释urlparse()方法的使用场景。
答:
用于解析URL的组成部分(如scheme、netloc)。

17、说明Urllib异常处理中URLError和HTTPError的区别。
答:
URLError处理网络连接错误,HTTPError处理HTTP状态码错误。

18、说明Requests与Urllib的主要区别。
答:
Requests更简洁,支持Session对象;Urllib更底层,功能复杂。

19、描述Session对象在处理登录会话中的作用。
答:
Session对象可保持Cookie和headers,用于登录状态管理。

20、列举Requests库的三个核心功能。
答:
发送HTTP请求、处理响应、文件上传。

21、解释requests.get()和requests.post()的参数差异。
答:
get()的params参数自动编码URL,post()的data参数发送表单。

22、说明Requests处理文件上传的实现方式。
答:
使用files参数上传文件,如requests.post(url, files={'file': open('file.txt', 'rb')})


2.6. 综合题

1、某电商网站限制同一IP每分钟最多访问10次,现需设计一个爬虫方案:
(1)如何通过代理服务器解决IP被封问题?
(2)如何设置请求头避免被检测?
(3)如何设计访问频率控制机制?

答:
(1)使用代理IP池轮换IP。
(2)设置随机User-Agent和Referer头。
(3)通过时间延迟或随机间隔控制请求频率。

2、假设需要采集豆瓣电影TOP250榜单数据,需考虑:
(1)分析Robots协议是否允许抓取该页面
(2)设计使用Urllib库的代码框架
(3)应对可能出现的验证码干扰

答:
(1)检查豆瓣电影页面的robots.txt文件是否允许抓取。
(2)使用Urllib库的代码框架:发送GET请求→解析HTML→提取数据。
(3)通过图像识别或第三方服务绕过验证码。

3、某新闻网站采用动态加载技术,需完成:
(1)比较Urllib和Requests库处理动态网页的能力差异
(2)设计使用Selenium的解决方案
(3)说明为何需要设置显式等待

答:
(1)Urllib无法处理动态网页,需依赖后端接口;Requests支持更复杂的请求。
(2)使用Selenium模拟浏览器操作。
(3)显式等待确保元素加载完成,避免操作未加载元素。

4、针对反爬虫策略的网站,需制定:
(1)User-Agent字段的随机化方案
(2)代理IP池的构建方法
(3)请求频率的随机延迟算法

答:
(1)使用随机User-Agent库(如fake_useragent)。
(2)构建代理IP池并轮换使用。
(3)通过random模块生成随机延迟。

5、某政府网站要求登录后才能查看数据,需实现:
(1)模拟登录的请求流程
(2)Cookie的持久化存储方案
(3)异常处理机制设计

答:
(1)发送登录POST请求并携带Cookie。
(2)使用requests.Session()持久化存储Cookie。
(3)设置重试次数和异常处理。


项目3 动态网页数据解析

3.1. 单选题

(1) 下列方法中,用于解析HTML文档的是(A)。
A. HTML()
B. XML()
C. parse()
D. tostring()

(2) 路径表达式根据作用对象的不同,有(B)种定位功能。
A. 1
B. 2
C. 3
D. 4

(3) 下列符号中,表示选取当前节点父节点的是(D)。
A. /
B. //
C. .
D. ..

(4) 目前,Beautiful Soup库有(D)个版本。
A. 1
B. 2
C. 3
D. 4

(5) 下列不属于Beautiful Soup库选择器的是(C)。
A. 标签选择器
B. 方法选择器
C. 路径选择器
D. CSS选择器

6、XPath的主要功能是什么?B
A) 仅用于HTML文档
B) 用于在XML或HTML文档中定位和选取节点
C) 仅用于XML文档
D) 用于数据库查询

7、以下哪个表达式用于从根节点开始选取直接子节点?B
A) //
B) /
C) .
D) ..

8、如果要选取名为book的所有节点,并且这些节点必须是bookstore的直接子节点,应该使用哪个路径表达式?B
A) //book
B) /bookstore/book
C) bookstore//book
D) //bookstore/book

9、以下哪个XPath函数可以返回当前节点集中的最后一个节点?B
A) position()
B) last()
C) count()
D) min()

10、假设有一个XML文档包含多个title元素,如何选择所有属性名为lang的title元素?A
A) //title[@lang]
B) //title/lang
C) //title/@lang
D) //title[lang]

11、如果要选取bookstore下所有名为price的节点,应使用哪个表达式?C
A) //bookstore/price
B) /bookstore//price
C) //bookstore//price
D) bookstore/price

12、以下哪个选项不是XPath中的常用符号?C
A) @
B) |
C) #
D) //

13、如何选择一个节点的父节点?B
A) .
B) ..
C) @
D) //

14、下列哪个XPath表达式可以用来选取bookstore下的第二个book元素?A
A) /bookstore/book[2]
B) /bookstore/book[last()-1]
C) /bookstore/book[position()<3]
D) /bookstore/book[position()>1]

15、若要选取所有具有任何属性的title元素,应使用哪个表达式?A
A) //title[@*]
B) //title/*
C) //@title
D) //title[@lang='eng']

16、Beautiful Soup主要用于什么?B
A) 数据库查询
B) 解析HTML或XML文档
C) 网络请求
D) 文件系统管理

17、如何安装Beautiful Soup?B
A) pip install lxml
B) pip install beautifulsoup4
C) pip install requests
D) pip install selenium

18、Beautiful Soup中哪个类表示HTML中的标签?C
A) NavigableString
B) Comment
C) Tag
D) BeautifulSoup

19、以下哪个方法用于创建BeautifulSoup对象?C
A) create()
B) parse()
C) BeautifulSoup()
D) soupify()

20、在Beautiful Soup中,哪个属性可以获取节点的名称?A
A) name
B) attrs
C) string
D) parent

21、以下哪个方法用于查找符合条件的第一个节点?B
A) find_all()
B) find()
C) select()
D) get()

22、如果要查找所有a标签并且href属性值为http://example.com。应使用哪个方法和参数?B
A) find("a", href="http://example.com")
B) find_all("a", attrs={"href": "http://example.com"})
C) select('a[href="http://example.com"]')
D) find_all("a", {"href": "http://example.com"})

23、以下哪个CSS选择器可以用来查找所有class为sister的元素?A
A) select('.sister')
B) select('#sister')
C) select('p.sister')
D) select('[class=sister]')

24、如果要查找所有直接子节点而不是子孙节点,应该设置哪个参数?B
A) recursive=True
B) recursive=False
C) limit=1
D) depth=1

25、以下哪个方法可以用来将HTML文档格式化输出,使其结构更加清晰易读?A
A) prettify()
B) format()
C) pretty_print()
D) beautify()

26、JSONPath的主要用途是什么?B
A) 数据库查询
B) 解析和查询JSON数据
C) 网络请求
D) 文件系统管理

27、在Python中,哪个模块用于解析和处理JSON数据?C
A) lxml
B) BeautifulSoup
C) json
D) requests

28、以下哪个是正确的将Python对象转换为JSON字符串的方法?B
A) json.loads()
B) json.dumps()
C) json.load()
D) json.dump()

29、如何使用json模块从文件中读取JSON数据并将其转换为Python对象?B
A) json.loads(file)
B) json.load(file)
C) json.dumps(file)
D) json.dump(file)

30、以下哪个JSONPath表达式可以用来选取所有名为name的节点?B
A) $.name
B) $..name
C) $.['name']
D) $[name]

31、在Python中,使用json模块时,如何处理JSON解析错误?C
A) 使用try-except块捕获ValueError
B) 使用try-except块捕获KeyError
C) 使用try-except块捕获JSONDecodeError
D) 使用try-except块捕获TypeError

32、以下哪个方法用于将JSON字符串写入文件?D
A) json.loads()
B) json.dumps()
C) json.load()
D) json.dump()

33、如果要从一个包含多个对象的JSON数组中选择第二个对象,应使用哪个JSONPath表达式?A
A) $[1]
B) $[2]
C) $..[1]
D) $..[2]

34、以下哪个选项不是有效的JSON数据类型?C
A) 字符串
B) 数组
C) 函数
D) 布尔值

35、假设有一个JSON结构如下:
{
"store": {
"book": [
{"category": "fiction", "title": "Harry Potter"},
{"category": "non-fiction", "title": "Learning XML"}
]
}
}
如何使用JSONPath选择所有title字段的值?B
A) $.store.book.['title']
B) $..title
C) $.store.book[].['title']
D) $..book[
]['title']

36、Selenium是什么?B
A) 数据库管理系统
B) 开源的自动化测试工具
C) 网页设计框架
D) 图像处理软件

37、Selenium WebDriver与浏览器交互需要什么?B
A) 直接连接到浏览器
B) 使用WebDriver驱动程序
C) 不需要任何额外的驱动程序
D) 使用Java编写的脚本

38、要获取当前页面的URL,应该使用WebDriver类中的哪个属性?B
A) title
B) current_url
C) page_source
D) find_element

39、如何最大化浏览器窗口?A
A) maximize_window()
B) full_screen()
C) set_window_size(width, height)
D) zoom_in()

40、在Selenium中,如何模拟点击一个按钮?B
A) click_button()
B) element.click()
C) press_key('Enter')
D) send_keys(Keys.ENTER)

41、如何通过id属性定位页面上的一个元素?B
A) find_element_by_class_name()
B) find_element_by_id()
C) find_element_by_tag_name()
D) find_element_by_xpath()

42、如果想要在输入框中输入文本,应该使用哪个方法?C
A) clear()
B) submit()
C) send_keys()
D) get_attribute()

43、为了执行一系列鼠标操作(如双击或拖放),你应该使用哪个类?B
A) MouseHandler
B) ActionChains
C) ClickEvent
D) DragAndDrop

44、在Selenium中,如果你想获取一个元素的文本内容,应该使用哪个属性或方法?C
A) element.text()
B) element.get_text()
C) element.text
D) element.content

45、在Selenium中,如果你想通过链接文本定位页面上的一个元素,应该使用哪个方法?B
A) find_element_by_id()
B) find_element_by_link_text()
C) find_element_by_class_name()
D) find_element_by_tag_name()

46、为了确保WebDriver能够正常工作,你首先需要做什么?B
A) 安装Python
B) 下载并配置对应浏览器的WebDriver驱动程序
C) 安装Selenium库
D) 配置环境变量JAVA_HOME

47、下列哪个不是Selenium WebDriver支持的操作?C
A) 单击按钮
B) 输入文本
C) 执行SQL查询
D) 刷新页面

48、使用Selenium时,若要获取当前页面的标题,应调用哪个属性?B
A) current_url
B) title
C) page_source
D) get_title()

49、下面哪种方式不是Selenium支持的元素定位方法?D
A) find_element_by_id()
B) find_element_by_name()
C) find_element_by_tagname()
D) find_element_by_color()

50、如果想要模拟用户滚动到页面底部的行为,你应该使用什么?B
A) ActionChains类中的scroll()方法
B) JavaScript执行器来执行滚动脚本
C) WebDriver类中的move_to_bottom()方法
D) 使用time.sleep()等待一段时间

51、当你想通过CSS选择器定位一个元素时,应该使用哪个方法?B
A) find_element_by_class_name()
B) find_element_by_css_selector()
C) find_element_by_tag_name()
D) find_element_by_link_text()

52、在Selenium中,如何实现鼠标悬停在一个元素上?C
A) hover()
B) mouse_over()
C) ActionChains(driver).move_to_element(element).perform()
D) focus_on_element()

53、当使用Selenium处理下拉列表框时,应该使用哪个类?A
A) Select
B) Dropdown
C) ComboBox
D) ListHandler

54、如果你想检查一个复选框是否被选中,应该使用哪个方法?B
A) is_checked()
B) is_selected()
C) get_attribute('checked')
D) isChecked()

55、在Selenium中,如果你想等待一个特定的条件发生(例如某个元素变得可见),而不只是等待固定的时间,你应该使用哪种等待方式?B
A) 隐式等待 (implicitly_wait())
B) 显式等待 (WebDriverWait 和 expected_conditions)
C) 固定等待 (time.sleep())
D) 动态等待 (dynamic_wait())

56、在Python中使用百度OCR进行字符验证码识别时,首先需要做什么?B
A) 安装Pillow库
B) 注册百度智能云账号并创建应用获取API Key和Secret Key
C) 直接调用pytesseract.image_to_string()方法
D) 使用Selenium模拟用户登录

57、在使用百度OCR进行字符验证码识别时,以下哪个步骤是必需的?D
A) 使用requests.post()发送请求
B) 将图片转换为二进制格式
C) 获取AccessToken
D) 所有上述选项

58、在处理滑动拼图验证码时,以下哪一步骤不是必要的?D
A) 获取包含缺口的背景图片
B) 计算滑块的偏移量
C) 使用Selenium模拟滑动轨迹
D) 调用百度OCR API进行文字识别

59、当使用Selenium处理滑块验证码时,以下哪项技术不是用来模拟拖动动作的?C
A) ActionChains类中的drag_and_drop_by_offset()方法
B) JavaScript注入实现滑动效果
C) send_keys()方法发送方向键
D) move_to_element_with_offset()结合click_and_hold()和release()

60、在Python中,使用Pytesseract进行字符验证码识别时,如果遇到识别率低的问题,应该尝试什么措施?C
A) 增加滑块验证码的滑动距离
B) 更换不同的浏览器驱动程序
C) 对图片进行预处理(如灰度化、二值化等)
D) 直接放弃使用Pytesseract,改用手动输入

61、在处理复杂的字符验证码时,以下哪种方法可能提高识别准确率?B
A) 使用更强大的GPU进行加速
B) 提高Tesseract-OCR的训练数据集质量
C) 在验证码图片上添加更多噪声
D) 减少Tesseract-OCR的识别语言选项

62、当处理滑块验证码时,如何确定滑块的偏移量?B
A) 直接拖动滑块直到拼图完全对齐
B) 计算包含缺口和不包含缺口背景图片之间的像素差异
C) 使用固定偏移量进行拖动
D) 随机生成一个偏移量值

63、在使用ddddocr库进行滑块验证码识别时,以下哪个参数用于指定目标图片(滑块)的二进制数据?C
A) target_img
B) background_bytes
C) target_bytes
D) slide_img

64、当你使用ddddocr进行滑块验证码识别时,如果设置simple_target=True,这表示什么?B
A) 目标图片是一个复杂的图案,算法会尝试更精确的匹配
B) 目标图片是一个简单的形状(如矩形或规则的图案),算法会使用更简单的匹配策略
C) 背景图片需要被简化处理
D) 不需要对背景图片进行任何预处理

65、在使用ddddocr进行滑块验证码识别后,返回值中的target_x代表什么?B
A) 滑块的最佳匹配位置的垂直偏移量
B) 滑块的最佳匹配位置的水平偏移量
C) 滑块在背景图片中的宽度
D) 滑块在背景图片中的高度

66、在使用Selenium处理滑块验证码时,以下哪个方法最适合用于模拟滑动动作?D
A) click_and_hold()
B) drag_and_drop_by_offset()
C) move_to_element_with_offset()
D) 以上全部

67、在进行字符验证码识别时,以下哪种预处理技术可以提高Tesseract-OCR的识别准确率?A
A) 将图片转换为灰度图像
B) 增加图片的亮度
C) 缩小图片尺寸
D) 添加更多噪声到图片中

68、当使用超级鹰平台进行点选验证码识别时,以下哪个字段是API返回结果中的坐标信息?A
A) pic_str
B) err_no
C) result
D) md5

69、在Python中使用ddddocr库进行滑块验证码识别时,以下哪个参数用于指定背景图片的二进制数据?B
A) target_bytes
B) background_bytes
C) slide_img
D) target_img

70、在处理滑块验证码时,如何确定滑块需要移动的距离?A
A) 计算缺口与滑块之间的像素差异
B) 随机生成一个偏移量值
C) 使用固定偏移量进行拖动
D) 直接拖动滑块直到拼图完全对齐

71、在使用超级鹰平台进行点选验证码识别时,以下哪个步骤不是必需的?D
A) 使用Selenium截取验证码图片
B) 将截图发送到超级鹰平台进行识别
C) 根据超级鹰返回的坐标信息模拟点击
D) 手动输入验证码字符

72、在进行字符验证码识别时,以下哪种情况可能导致识别率降低?A
A) 图片质量差,存在大量噪声
B) 图片经过了灰度化和二值化处理
C) 使用高质量的OCR引擎
D) 图片分辨率较高

73、在使用Selenium处理点选验证码时,以下哪个步骤是正确的?B
A) 使用Selenium截取整个页面的截图
B) 将截图发送到超级鹰平台进行识别,并根据返回的坐标信息模拟点击
C) 直接调用百度OCR API进行文字识别
D) 使用固定的坐标进行点击操作

74、在使用超级鹰平台进行点选验证码识别时,以下哪个字段用于标识图像的唯一ID?B
A) err_no
B) pic_id
C) pic_str
D) md5

75、当你需要通过ddddocr库识别滑块验证码,并希望提高匹配精度时,应该设置哪个参数为False?D
A) det
B) ocr
C) show_ad
D) simple_target

76、下列关于正则表达式中元字符“.”的描述,哪一项是正确的?B
A) 匹配任意数字字符
B) 匹配除换行符外的任意单个字符
C) 匹配一个空格
D) 匹配字母a到z

77、在re模块中,以下哪个方法用于编译正则表达式?B
A) re.findall()
B) re.compile()
C) re.search()
D) re.sub()

78、XPath中,以下哪个表达式用于选取当前节点的父节点?B
A) //
B) ..
C) .
D) @

79、在BeautifulSoup中,以下哪个方法用于查找第一个符合条件的节点?B
A) find_all()
B) find()
C) select()
D) get()

80、JsonPath中,以下哪个表达式用于选取根对象?B
A) @
B) $
C) *
D) ..


3.2. 多选题

1、以下哪些是re模块中支持的标志位?ABCD
A) re.I
B) re.M
C) re.S
D) re.X

2、在XPath中,以下哪些是谓语的用途?ABC
A) 筛选节点
B) 指定属性值
C) 计算节点位置
D) 提取文本内容

3、BeautifulSoup中,以下哪些参数可以用于方法选择器?ABCD
A) name
B) attrs
C) recursive
D) string

4、JsonPath中,以下哪些表达式可以用于提取数据?ABC
A) $.store.book[*].title
B) $.store.book[?(@.price<10)]
C) $.store.bicycle.color
D) //div[@class='example']

5、Selenium中,以下哪些方法属于WebDriver类?ABD
A) get()
B) find_element()
C) click()
D) switch_to()


3.3. 填空题

1、正则表达式中,\d表示匹配__任意数字__。
2、XPath中,//表示从当前节点选取__后代节点__。
3、BeautifulSoup中,__prettify()方法用于格式化输出文档内容。
4、JsonPath中,
..__用于选取所有符合条件的对象。
5、Selenium中,__close()__方法用于关闭当前窗口。


3.4. 判断题

(1) XPath是一种通过节点和属性的遍历定位XML文档中信息的查询语言。(❌)
(2) 在使用xpath()方法时,路径表达式由符号和方法组成。(✔️)
(3) 元素包含的内容的提取通过text实现。(❌)
(4) 在安装Beautiful Soup库时,只需添加版本号即可安装指定版本。(✔️)
(5) node参数中descendants表示子孙节点。(❌)
6、正则表达式中的“*”表示匹配其前导字符0次或多次。(✔️)
7、XPath的路径表达式必须从根节点开始。(❌)
8、BeautifulSoup默认使用lxml解析器。(✔️)
9、JsonPath不支持过滤操作。(❌)
10、Selenium无法处理动态网页数据。(❌)


3.5. 简答题

(1) 列举HTML()方法中可以选择的解析器。
答:HTML()方法可使用的解析器包括:

  • Python标准库中的html.parser
  • lxml的HTML解析器
  • lxml的XML解析器
  • html5lib(模拟浏览器行为)

(2) 简述Beautiful Soup库的优劣。
答:
优势:

  • 易于使用,提供直观的API
  • 容错能力强,能处理格式不规范的HTML
  • 支持多种解析器(如lxml、html5lib)
  • 强大的搜索功能,支持标签名、属性、CSS选择器等
    劣势:
  • 性能较低,不适合处理大型文档
  • 不能解析JavaScript渲染的内容
  • 功能受限,需结合其他工具(如正则表达式)

3、简述正则表达式中“^”和“$”的作用。
答:

  • “^”表示匹配字符串的开头
  • “$”表示匹配字符串的末尾

4、说明XPath与JsonPath的主要区别。
答:

  • XPath:用于解析XML/HTML文档,基于节点和属性定位
  • JsonPath:用于解析JSON数据,基于键值对导航

5、列举BeautifulSoup的四个主要类及其作用。
答:

  1. Tag:表示HTML标签
  2. NavigableString:表示HTML中的文本
  3. Comment:表示HTML注释
  4. BeautifulSoup:表示整个文档

6、简述re模块中compile()函数的作用。
答:re.compile()用于预编译正则表达式,提高效率。适用于重复使用的正则表达式。

7、描述Selenium中ActionChains类的功能。
答:ActionChains用于模拟复杂鼠标操作,如点击、悬停、拖拽等。


3.6. 综合题

1、结合实际场景,设计一个使用正则表达式提取网页中所有电子邮件地址的方案,并编写代码实现。
答:

import re

html = """
<div>Email: john.doe@example.com</div>
<div>Email: jane_doe123@subdomain.example.org</div>
"""

pattern = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
emails = re.findall(pattern, html)
print(emails)

2、假设需要从某电商网站抓取商品信息,设计一个使用XPath和BeautifulSoup的解析流程,并说明每一步的作用。
答:

  1. 发送GET请求获取HTML
  2. 使用BeautifulSoup解析HTML
  3. 使用XPath定位商品价格、标题等信息
  4. 存储提取的数据

3、编写一个Selenium脚本,模拟用户登录操作,并处理可能出现的滑动验证码。
答:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time

driver = webdriver.Chrome()
driver.get("https://example.com/login")

username = driver.find_element_by_id("username")
password = driver.find_element_by_id("password")
login_btn = driver.find_element_by_id("login-btn")

username.send_keys("testuser")
password.send_keys("password123")
login_btn.click()

# 处理滑块验证码
slider = driver.find_element_by_id("slider")
action = ActionChains(driver)
action.click_and_hold(slider).move_by_offset(200, 0).release().perform()
time.sleep(2)

driver.quit()

4、设计一个爬虫程序,使用JsonPath提取JSON数据中的特定字段,并将结果存储到CSV文件中。
答:

import jsonpath
import json
import csv

with open("data.json", "r") as f:
    data = json.load(f)

titles = jsonpath.jsonpath(data, "$..title")

with open("output.csv", "w", newline='') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(["Title"])
    for title in titles:
        writer.writerow([title])

5、分析验证码识别的常见方法,并比较它们的优缺点。
答:

方法 优点 缺点
Tesseract OCR 开源、易用 识别率低,依赖图片质量
百度OCR 接口丰富、识别率高 需要API密钥
ddddoc 专门针对滑块验证码 只适合特定类型的验证码
第三方平台 专业团队维护 成本高,需网络传输

项目4 基于Scrapy实现动态网页数据采集与存储

4.1. 单选题

(1) 一个简单的Scrapy框架包含(C)个主要模块。
A. 1
B. 3
C. 5
D. 7

(2) 下列命令中,不属于全局命令的是(D)。
A. fetch
B. startproject
C. genspider
D. crawl

(3) 以下不属于Scrapy框架中常用的Spider通用参数的是(A)。
A. HTMLFeedSpider
B. scrapy.Spider
C. CrawlSpider
D. XMLFeedSpider

(4) Scrapy框架提供了(B)种选择器。
A. 1
B. 2
C. 3
D. 4

(5) 在Scrapy框架中运行Scrapy项目时,可以使用crawl命令的(A)参数,将数据保存到本地JSON、CSV等文件中。
A. -o
B. -p
C. -s
D. -f

6、Scrapy框架中哪个组件负责下载网页内容?(C)
A) Item Pipeline
B) Spider
C) Downloader
D) Scheduler

7、下列关于Scrapy的描述,哪一项是正确的?(C)
A) Scrapy只能用于静态网页的数据采集。
B) Scrapy不支持分布式爬虫。
C) Scrapy可以使用XPath和CSS选择器解析网页。
D) Scrapy无法处理JavaScript动态渲染的页面。

8、在Scrapy项目中,用来定义实体数据的基类是什么?(C)
A) scrapy.Spider
B) scrapy.Field
C) scrapy.Item
D) scrapy.Request

9、Scrapy框架中的Downloader Middleware位于哪两个组件之间?(B)
A) Engine和Scheduler
B) Downloader和Engine
C) Spider和Item Pipeline
D) Spider和Downloader

10、要运行一个已创建的Scrapy爬虫,应使用以下哪个命令?(C)
A) scrapy fetch
B) scrapy runspider
C) scrapy crawl
D) scrapy shell


4.2. 多选题

1、Scrapy框架的优点有哪些?(ABC)
A) 支持并发功能
B) 具有统一的中间件
C) 采用可读性很强的XPath技术解析网页
D) 只能通过文本文件存储数据

2、以下哪些是Scrapy框架的核心组件?(ABCD)
A) Item Pipeline
B) Spider
C) Scheduler
D) Selector

3、Scrapy项目结构包含哪些重要文件或目录?(ABCD)
A) items.py
B) settings.py
C) pipelines.py
D) spiders/

4、以下哪些操作可以通过Scrapy Shell完成?(ABCD)
A) 发送新的请求并查看响应
B) 使用本机浏览器打开给定的response对象
C) 查看响应的请求头
D) 打印帮助列表

5、Scrapy框架中如何设置是否遵循robots.txt规则?(A)
A) ROBOTSTXT_OBEY=True
B) DOWNLOAD_DELAY=3
C) ITEM_PIPELINES={}
D) USER_AGENT='Mozilla/5.0'


4.3. 填空题

1、Scrapy框架的下载器称为 Downloader
2、Scrapy项目中自定义字段需要修改 items.py 文件。
3、在Scrapy框架中,通过 Requests和Responses 实现循环抓取网页数据。
4、Scrapy框架中用于存储爬取到的数据的部分被称为 Item Pipeline
5、Scrapy框架中使用 CONCURRENT_REQUESTS 来控制并发请求的数量。


4.4. 判断题

(1) 在Scrapy框架中,主要通过Twisted同步网络架构的应用实现网络通信的处理工作。(❌)
(2) 通过命令的方式,只能将数据以固定的格式存储至指定文件;而通过管道的方式,可以在管道中对数据进行处理后,再进行存储。(✔️)
(3) Scrapy框架是Python语言的一个第三方应用程序框架,主要用于爬取网站并从页面中提取结构化数据。(✔️)
(4) SPIDER_MODULES参数用于表示使用genspider命令创建新spider的模块。(❌)
(5) XPath能够通过路径表达式从XML、HTML等结构化文件中进行节点或节点集的选取。(✔️)

6、Scrapy框架自身无法实现分布式爬虫。(✔️)
7、Scrapy框架可以使用pip安装,并且会自动安装相关依赖库。(✔️)
8、Scrapy框架中的Downloader负责接收Requests请求。(❌)
9、Scrapy框架能够通过Shell工具方便地调试程序。(✔️)
10、Scrapy框架中的Item Pipeline主要用于下载网页内容。(❌)


4.5. 简答题

(1) 简述Scrapy框架中的中间件。
答:Scrapy中间件分为两类:

  • Downloader Middleware:位于引擎和下载器之间,用于处理请求和响应,如添加User-Agent、代理IP、处理Cookies等。
  • Spider Middleware:位于引擎和Spider之间,用于处理Spider的输入(Response)和输出(Item或Request),如清洗数据、过滤响应等。

(2) 简述Scrapy项目的构建流程。
答:

  1. 创建项目:scrapy startproject project_name
  2. 定义Item:在 items.py 中定义数据结构
  3. 编写Spider:在 spiders/ 目录下创建爬虫类
  4. 配置Pipeline:在 pipelines.py 中编写数据处理逻辑
  5. 设置配置:修改 settings.py 如User-Agent、延迟时间等
  6. 运行爬虫:scrapy crawl spider_name

3、简述Scrapy框架的主要组成部分及其功能。
答:

  • Engine:控制整个系统的数据流
  • Scheduler:调度请求队列
  • Downloader:下载网页内容
  • Spider:定义初始请求并解析响应
  • Item Pipeline:处理和持久化数据
  • Middleware:拦截请求/响应,执行预处理

4、解释Scrapy框架中的Spider组件的作用。
答:
Spider是Scrapy框架的核心组件之一,负责:

  • 定义初始请求
  • 解析响应内容,提取数据或生成新请求
  • 控制爬取流程

4.6. 综合题

1、结合实际应用场景,设计一个利用Scrapy框架进行数据采集的方案,并说明其工作流程。
答:

方案设计:采集豆瓣电影TOP250榜单数据

步骤:

  1. 创建Scrapy项目

    scrapy startproject douban_spider
    cd douban_spider
    scrapy genspider movie "movie.douban.com"
    
  2. 定义Itemitems.py

    import scrapy
    
    class DoubanMovieItem(scrapy.Item):
        title = scrapy.Field()     # 电影标题
        rating = scrapy.Field()    # 评分
        quote = scrapy.Field()     # 引言
        detail_url = scrapy.Field()# 详情页链接
    
  3. 编写Spiderspiders/movie.py

    import scrapy
    from douban_spider.items import DoubanMovieItem
    
    class MovieSpider(scrapy.Spider):
        name = 'douban'
        allowed_domains = ['movie.douban.com']
        start_urls = ['https://movie.douban.com/top250']
    
        def parse(self, response):
            for item in response.css('div.item'):
                yield {
                    'title': item.css('span.title::text').get(),
                    'rating': item.css('span.rating_num::text').get(),
                    'quote': item.css('span.inq::text').get(),
                    'detail_url': item.css('a::attr(href)').get()
                }
    
  4. 配置Pipelinepipelines.py

    class DoubanMoviePipeline:
        def process_item(self, item, spider):
            print(f"电影名称: {item['title']}")
            return item
    
  5. 启用Pipelinesettings.py

    ITEM_PIPELINES = {
        'douban_spider.pipelines.DoubanMoviePipeline': 300,
    }
    
  6. 运行爬虫

    scrapy crawl douban -o output.json
    

工作流程说明:

  1. 启动爬虫scrapy crawl douban 启动名为 douban 的爬虫
  2. 发起请求:Spider向目标URL发送GET请求
  3. 获取响应:Downloader接收网页内容
  4. 解析数据:Spider使用CSS选择器提取电影信息
  5. 传输数据:数据通过Engine传入Item Pipeline
  6. 处理数据:Pipeline执行数据清洗、去重、存储等操作
  7. 输出结果:最终结果保存为JSON或导入数据库

项目5 动态网页访问日志数据采集

5.1. 单选题

(1) Flume中不属于Agent核心组件的是(C)。
A. Source
B. Channel
C. syslog
D. Sink

(2) Flume使用Kafka作为数据源时,通过(B)设置主题列表。
A. channels
B. Kafka.topics
C. kafka.consumer.group.id
D. batchDurationMillis

(3) Flume的内存通道中使用(D)设置通道中所有事件在内存中的大小总和。
A. type
B. capacity
C. byteCapacityBufferPercentage
D. byteCapacity

(4) Kafka生产者脚本中使用(C)选择压缩编解码器。
A. --bootstrap-server
B. --batch-size
C. --compression-codec
D. --producer-property

(5) 下列不属于Hadoop核心组件的是(A)。
A. --delete
B. --describe
C. --drop
D. --remove

6、下列关于Kafka的描述中,哪一项是正确的?(B)
A) Kafka是一种关系型数据库
B) Kafka是一个分布式流处理平台
C) Kafka主要用于批处理任务
D) Kafka不支持消息持久化

7、下列关于Flume的描述中,哪一项是正确的?(C)
A) Flume只能用于收集日志数据
B) Flume不支持自定义Sink
C) Flume可以将数据导入HDFS
D) Flume无法扩展

8、以下哪项是Kafka中Partition的主要作用?(A)
A) 提高消息处理的并行度
B) 减少磁盘I/O操作
C) 实现数据的顺序写入
D) 保证消息的全局有序

9、Flume中的Source组件可以使用哪种方式收集日志数据?(D)
A) Exec Source
B) Spooling Directory Source
C) Kafka Source
D) 以上全部

10、下列关于Kafka Consumer的说法,正确的是?(C)
A) 消费者通过push机制从broker获取消息
B) 同一个消费组内的消费者可以消费相同的消息
C) 消费者可以通过offset管理来追踪已读取消息的位置
D) 消费者不能跨多个分区消费


5.2. 多选题

1、以下哪些是Kafka的核心组件?(ABCD)
A) Broker
B) Topic
C) Partition
D) ZooKeeper

2、以下哪些是Flume的特性?(ABD)
A) 支持多种数据源
B) 高可靠性
C) 不支持事务
D) 可扩展性

3、下列关于Kafka Consumer Group的说法,正确的有?(ABCD)
A) 同一个Consumer Group下的消费者共同消费同一个Topic的所有Partition
B) 不同Consumer Group之间互不影响
C) 在一个Consumer Group内,每个Partition只能被一个消费者消费
D) 当消费者数量超过Partition数量时,多余的消费者处于闲置状态

4、Flume配置文件中包含哪些基本元素?(ABCD)
A) Agent
B) Source
C) Channel
D) Sink

5、以下哪些拦截器可以在Flume中使用?(ABC)
A) 时间拦截器(Timestamp Interceptor)
B) 主机拦截器(Host Interceptor)
C) 正则表达式过滤拦截器(Regex Filtering Interceptor)
D) JSON解析拦截器(JSON Parsing Interceptor)


5.3. 填空题

1、Kafka是一个 高吞吐量、低延迟 的分布式发布订阅消息系统。
2、Flume中的Channel位于Source和Sink之间,用于 缓存 事件。
3、Flume支持的Sink类型包括HDFS Sink、Logger、Null以及 File Roll Sink 等。
4、在Kafka中,Producer向Broker发送消息时,可以通过设置 requiredAcks 来确保消息可靠传输。
5、Flume启动Agent使用的命令是 flume-ng agent --conf $FLUME_HOME/conf --conf-file /root/inspur/code/flume-code/access_log-HDFS-LocalFile.conf --name a1 -Dflume.root.logger=DEBUG,console


5.4. 判断题

(1) Kafka中使用--replication-factor来表示在创建生产者或增加分区时指定的分区数。(❌)
(2) Flume实现数据采集的方式非常简单,只需编辑相应的配置文件即可完成特定数据的采集与存储。(✔️)
(3) Producer表示消费者,用于接收消息。消费者连接到Kafka并接收消息,从而进行相应的业务逻辑处理。(❌)
(4) Topic表示分区,每个分区属于单个主题。(❌)
(5) Kafka是由Apache软件基金会开发的一个开源流处理平台,是一个快速、可扩展的、分布式的、分区的、可复制的且基于ZooKeeper协调的分布式日志系统。(✔️)

6、Kafka能够实现高吞吐量的数据传输。(✔️)
7、Flume默认采用Log4j作为其日志记录框架。(❌)
8、Kafka允许消费者直接从任意位置开始消费消息。(✔️)
9、Flume的Avro Source可以接收来自其他Flume节点的数据。(✔️)
10、Kafka的Consumer需要手动提交偏移量才能更新消费进度。(❌)


5.5. 简答题

(1) Flume中的Source、Channel以及Sink分别表示什么含义?
答:

  • Source:负责接收或收集数据。它可以是从外部来源(如日志文件、网络流等)获取数据的接口。
  • Channel:位于Source和Sink之间,作为一个临时存储区,确保数据能够可靠地从Source传递到Sink。Channels提供了一种机制来缓冲事件直到它们被Sink消费。
  • Sink:负责将数据发送到目的地。这可能包括另一个存储系统(如HDFS)、数据库或其他服务。

(2) Kafka中都有哪些核心组件?
答:

  • Broker:Kafka集群中的服务器实例。
  • Topic:一种类别或名称,用于组织消息。
  • Partition:Topic的细分单元,允许并行处理和存储大量消息。
  • Producer:负责发布消息到Kafka的Broker上。
  • Consumer:从Kafka Broker中拉取消息的应用程序。
  • ZooKeeper:用于维护和协调Kafka Brokers的状态。

3、简述Kafka的基本架构及其工作原理。
答:
Kafka由Broker、Topic、Partition组成。Producer向Topic发送消息,Consumer从Topic消费消息。Kafka通过Partition实现了并行处理,提高了系统的吞吐量。

4、解释Flume的工作流程,并说明其中各个组件的作用。
答:
Flume的工作流程包括Source接收数据、通过Channel传递给Sink。

  • Source:负责收集数据
  • Channel:用于缓存事件
  • Sink:负责将数据输出到目的地

5、阐述Kafka如何实现消息的高可靠性和容错性。
答:
Kafka通过消息复制、Leader选举机制和ISR(In-Sync Replicas)集合来保证高可靠性和容错性。

6、描述Flume中不同类型的Source和Sink的应用场景。
答:

  • Exec Source:适用于实时监控日志文件
  • Kafka Source:可用于从Kafka集群中读取数据
  • HDFS Sink:适合将数据存储至HDFS
  • Logger Sink:可用于调试

7、比较Kafka和传统消息队列的区别,并指出它们各自的优缺点。
答:

  • Kafka:具有更高的吞吐量和更低的延迟,支持消息持久化和副本机制。
  • 传统消息队列:在某些场景下更易于管理和维护,但通常缺乏Kafka的高并发能力。

5.6. 综合题

1、结合实际应用场景,设计一个使用Flume和Kafka进行动态网页访问日志数据采集与分析的方案。要求详细说明各组件的配置和功能。

方案设计:使用Flume + Kafka进行日志采集与分析

一、整体架构图

[Web Server] → [Flume (采集)] → [Kafka (消息队列)] → [Kafka Consumer (处理)] → [Elasticsearch (存储)] → [Kibana (可视化)]

二、各组件说明及配置

1. Web Server(数据源)
  • 作用:生成访问日志文件(如Nginx日志、Apache日志等)。

  • 示例日志格式

    127.0.0.1 - - [10/May/2025:13:55:36 +0800] "GET /index.html HTTP/1.1" 200 612 "-" "Mozilla/5.0"
    
2. Flume(日志采集)
  • 作用:实时采集Web Server上的日志文件,并传送到Kafka。
  • 配置文件access_log_flume_kafka.conf
# 定义Agent的名称
a1.sources = r1
a1.channels = c1
a1.sinks = k1

# 配置Source(监听日志文件)
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /var/log/nginx/access.log
a1.sources.r1.shell = /bin/bash -c

# 配置Channel(内存通道)
a1.channels.c1.type = memory
a1.channels.c1.capacity = 10000
a1.channels.c1.transactionCapacity = 1000

# 配置Sink(Kafka Sink)
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
a1.sinks.k1.topic = access_logs
a1.sinks.k1.brokerList = localhost:9092
a1.sinks.k1.requiredAcks = 1
a1.sinks.k1.messageType = text
a1.sinks.k1.serializationSchema.class = org.apache.flink.streaming.connectors.kafka.FlinkKafkaInternalSerializationSchemaWrapper
a1.sinks.k1.serializationSchema.payloadField = log_message

# 连接组件
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
3. Kafka(消息队列)
  • 作用:作为消息中间件接收Flume采集的日志数据,供下游系统消费。
  • 配置
    • 创建Topic:kafka-topics.sh --create --topic access_logs --partitions 3 --replication-factor 1 --zookeeper localhost:2181
    • 查看Topic内容:kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic access_logs --from-beginning
4. Kafka Consumer(日志处理)
  • 作用:消费Kafka中的日志数据,进行结构化处理后写入Elasticsearch。
  • 代码示例(Python + Elasticsearch)
from confluent_kafka import Consumer, KafkaException
from elasticsearch import Elasticsearch
import json

es = Elasticsearch(['http://localhost:9200'])

conf = {
    'bootstrap.servers': 'localhost:9092',
    'group.id': 'log_consumer_group',
    'auto.offset.reset': 'earliest'
}

consumer = Consumer(conf)
consumer.subscribe(['access_logs'])

try:
    while True:
        msg = consumer.poll(timeout=1.0)
        if msg is None:
            continue
        if msg.error():
            if msg.error().code() == KafkaException._PARTITION_EOF:
                print(f'End of partition reached {msg.partition()}')
            else:
                print(f'Error: {msg.error()}')
        else:
            log_data = msg.value().decode('utf-8')
            # 解析日志(简化版)
            ip = log_data.split(" ")[0]
            timestamp = log_data.split("[")[1].split("]")[0]
            method = log_data.split("\"")[1].split(" ")[0]
            path = log_data.split("\"")[1].split(" ")[1]
            status_code = log_data.split(" ")[8]

            es.index(index="weblogs", body={
                "ip": ip,
                "timestamp": timestamp,
                "method": method,
                "path": path,
                "status_code": status_code
            })
except KeyboardInterrupt:
    pass
finally:
    consumer.close()
5. Elasticsearch(日志存储)
  • 作用:存储结构化的日志数据,便于搜索和分析。
  • 索引映射示例
PUT /weblogs
{
  "mappings": {
    "properties": {
      "ip": {"type": "keyword"},
      "timestamp": {"type": "date", "format": "dd/MMM/yyyy:HH:mm:ss Z"},
      "method": {"type": "keyword"},
      "path": {"type": "text"},
      "status_code": {"type": "integer"}
    }
  }
}
6. Kibana(可视化)
  • 作用:对Elasticsearch中的日志数据进行可视化展示。
  • 可视化方案
    • 创建仪表板,展示:
      • 访问趋势(时间序列)
      • IP访问次数排名(Top N)
      • 请求路径分布(饼图)
      • 状态码分布(柱状图)

项目6 动态网页数据预处理

6.1. 单选题

(1) 以下不属于read_csv()方法包含参数的是(A)。
A. io
B. names
C. sep
D. header

(2) Pandas库中用于查看基本信息的方法是(A)。
A. DataFrame.info()
B. DataFrame.unique()
C. DataFrame.head()
D. DataFrame.tail()

(3) Logstash过滤器中用于匹配日志中的IP地址的匹配模式是(A)。
A. IPORHOST
B. IP
C. HOST
D. IPV4

(4) Pig内置函数中用于去除字符串头尾空格的函数是(C)。
A. LTRIM()
B. RTRIM()
C. TRIM()
D. UPPER()

(5) Logstash中表示标准输入插件的是(D)。
A. File
B. Kafka
C. Input
D. Stdin

6、下列关于Pandas数据结构的描述中,哪一项是正确的?(D)
A) Series只能存储整数类型的数据
B) DataFrame的列索引必须唯一
C) Panel是二维数据结构
D) DataFrame的列可以包含不同的数据类型

7、Pandas中用于读取CSV文件的方法是?(C)
A) read_excel()
B) read_sql()
C) read_csv()
D) read_json()

8、ELK技术栈中,负责日志数据采集的组件是?(B)
B) Logstash
C) Kibana
D) Beats

9、下列关于缺失值处理的描述中,哪一项是正确的?(C)
A) df.isna()用于填充缺失值
B) df.dropna()默认保留所有非空行
C) df.fillna()可以指定填充方法
D) 缺失值无法通过Pandas处理

10、Logstash的输入插件支持以下哪种数据源?(C)
A) 仅支持文件输入
B) 不支持网络数据源
C) 支持Kafka、文件、数据库等多种来源
D) 仅支持数据库输入


6.2. 多选题

1、下列关于Pandas数据结构的描述中,正确的有(ABC)。
A) Series是一维数组
B) DataFrame支持行索引和列索引
C) Panel是三维数据结构
D) DataFrame的列类型必须一致

2、Pandas中处理缺失值的方法包括(ABCD)。
A) dropna()
B) fillna()
C) isnull()
D) replace()

3、ELK技术栈的核心组件包括(ABC)。
A) Elasticsearch
B) Logstash
C) Kibana
D) Hadoop

4、Logstash过滤插件的功能包括(AB)。
A) 数据解析
B) 数据转换
C) 数据加密
D) 数据去重

5、Kibana的主要功能包括(AB)。
A) 数据可视化
B) 日志分析
C) 数据存储
D) 数据采集


6.3. 填空题

1、ELK技术栈中,Elasticsearch______用于实时搜索和分析海量数据。
2、Pandas中检查数据维度的方法是_shape()___
3、Logstash的输出插件可以将数据写入_Elasticsearch、数据库、文件

4、在ELK中,_Kibana______用于创建可视化仪表板。
5、Pandas中保存数据到Excel文件的方法是_to_excel()_____。


6.4. 判断题

(1) Pandas库是Python的核心闭源数据分析支持库。(❌)
(2) Pandas库中read_csv()方法默认使用“,”作为列分隔符。(✔️)
(3) Pig中加载函数PigStorage()表示将非结构化数据加载到Pig中。(❌)
(4) Logstash中正则匹配模式IPORHOST表示匹配IPv4地址。(❌)
(5) Logstash日志匹配模式中HTTPD_COMBINEDLOG表示匹配过滤httpd日志。(✔️)

6、Series中的数据类型必须一致。(✔️)
7、Logstash不支持从Kafka采集数据。(❌)
8、Elasticsearch默认端口是9200。(✔️)
9、df.isnull()会返回一个布尔值。(✔️)
10、Kibana只能查看数据,不能进行交互操作。(❌)


6.5. 简答题

(1) 简述ELK各个工具的作用。
答:

  • Elasticsearch:分布式搜索引擎,用于存储和检索大量数据。
  • Logstash:日志收集与处理工具,支持多种输入源并提供过滤、转换能力。
  • Kibana:数据可视化工具,提供图表、仪表板展示功能。

(2) 简述Pandas中DataFrame的特点。
答:

  • 行列标签可自定义
  • 支持异构数据类型
  • 提供丰富的数据操作方法
  • 适合处理结构化数据

3、ELK技术栈中三个组件的作用分别是什么?
答:

  • Elasticsearch:用于数据存储和搜索
  • Logstash:用于日志采集和格式转换
  • Kibana:用于数据可视化和交互分析

4、如何使用Pandas处理缺失值?
答:

  • 使用isnull()检测缺失值
  • 使用dropna()删除含缺失值的行或列
  • 使用fillna()填充缺失值(如均值、前向填充等)

5、Logstash的过滤插件有哪些常见用途?
答:

  • 解析日志内容(如Grok插件)
  • 转换字段名称和格式
  • 添加新字段或删除无用字段
  • 处理时间戳和地理信息

6、简述Kibana在数据分析中的主要功能。
答:

  • 创建数据仪表盘
  • 实现数据可视化(柱状图、折线图、地图等)
  • 提供日志分析和过滤功能
  • 支持告警配置和数据钻取

6.6. 综合题

1、某企业需要分析其官网的访问日志,要求:使用ELK技术栈完成日志采集、处理和可视化。请设计完整的解决方案,包括数据采集方式、处理流程及可视化展示方案。

解决方案设计

一、数据采集层(Logstash + Filebeat)

  • Filebeat:部署在Web服务器上,实时监控Nginx/Apache日志文件(如/var/log/nginx/access.log)。
  • Logstash输入插件:接收来自Filebeat的日志流,使用beats输入插件。
input {
  beats {
    port => 5044
  }
}

二、数据处理层(Logstash 过滤器)

  • Grok过滤器:解析日志内容,提取IP、时间、请求路径、状态码等字段。
filter {
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
  }
}
  • GeoIP插件:根据IP地址解析地理位置信息(国家、城市、经纬度等)。
geoip {
  source => "clientip"
}
  • Date插件:统一时间格式,便于后续分析。
date {
  match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
}

三、数据存储层(Elasticsearch)

  • 输出至Elasticsearch
output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "access-logs-%{+YYYY.MM.dd}"
  }
}
  • 配置Elasticsearch索引模板,优化查询性能。

四、数据可视化层(Kibana)

  • 创建仪表板

    • 时间序列图:展示每日访问量趋势
    • 地图视图:显示访问来源的地理分布
    • 柱状图:统计各URL访问次数
    • 异常日志筛选器:过滤4xx、5xx错误日志
  • 设置告警规则:当错误日志数量超过阈值时发送通知。

五、完整流程总结

[Web Server] → [Filebeat] → [Logstash (过滤)] → [Elasticsearch (存储)] → [Kibana (可视化)]

2、某电商平台需要对商品评论数据进行清洗和分析,要求:使用Pandas完成数据预处理(包括缺失值处理、重复值删除、数据格式转换)。请写出具体实现步骤及代码示例。

步骤说明

Step 1:导入Pandas并读取数据

import pandas as pd

df = pd.read_csv('comments.csv')

Step 2:查看数据基本信息

print(df.info())
print(df.describe())

Step 3:处理缺失值

# 检查缺失值
print(df.isnull().sum())

# 删除全为空的列
df.dropna(axis=1, how='all', inplace=True)

# 填充文本型字段(如评论内容)
df['comment_text'].fillna('无内容', inplace=True)

# 填充评分字段(如平均分)
df['rating'].fillna(df['rating'].mean(), inplace=True)

Step 4:处理重复值

# 查找重复行
duplicate_rows = df[df.duplicated()]

# 删除重复行
df.drop_duplicates(inplace=True)

Step 5:数据格式转换

# 将时间字段转换为datetime类型
df['create_time'] = pd.to_datetime(df['create_time'])

# 将评分字段转换为整数类型
df['rating'] = df['rating'].astype(int)

# 将用户ID转换为字符串
df['user_id'] = df['user_id'].astype(str)

Step 6:导出清洗后的数据

df.to_csv('cleaned_comments.csv', index=False)

3、对比分析Pandas和ELK在数据预处理中的优缺点,并说明适用场景。

对比维度 Pandas ELK
优点 简单易用、支持本地开发、适合小规模数据 实时性强、分布式架构、适合大规模日志
缺点 内存限制、不适合高并发处理 部署复杂、学习曲线陡峭
适用场景 结构化数据清洗、离线分析 日志实时采集、大数据分析

应用场景建议

  • Pandas:适用于小型数据集清洗、探索性数据分析、快速原型开发。
  • ELK:适用于日志集中化处理、实时监控、大规模数据分析。

4、假设某系统日志包含IP地址字段,要求:使用Logstash的GeoIP插件解析IP地址,并在Kibana中展示地域分布。请描述实现过程。

实现过程

Step 1:Logstash配置文件

input {
  stdin {}
}

filter {
  grok {
    match => { "message" => "%{IP:clientip} %{DATA:ident} %{DATA:auth} \[%{HTTPDATE:timestamp}\] \"%{WORD:verb} %{URIPATH:request_path} HTTP/%{NUMBER:httpversion}\" %{NUMBER:response_status} %{NUMBER:bytes} %{QS:referrer} %{QS:agent}" }
  }

  geoip {
    source => "clientip"
  }
}

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "geoip_logs-%{+YYYY.MM.dd}"
  }
}

Step 2:启动Logstash

bin/logstash -f logstash_geoip.conf

Step 3:Kibana配置地图可视化

  1. 打开Kibana → Management → Index Management → 创建索引 geoip_logs*
  2. 进入 Maps → Create Map → Add Layer
  3. 选择 Elasticsearch documents,添加geoip.location字段
  4. 设置地图样式(如点大小代表访问次数)

Step 4:结果展示

  • 地图上显示不同颜色和大小的标记,反映IP来源地和访问频率
  • 可点击标记查看详细日志信息

5、某机构需要监控服务器性能指标(CPU、内存、磁盘IO),要求:使用ELK技术栈完成数据采集、存储和告警功能。请设计实现方案。

设计方案

Step 1:数据采集(Metricbeat)

  • 安装Metricbeat,配置系统监控模块:
metricbeat.modules:
- module: system
  metricsets:
    - cpu
    - memory
    - filesystem
  period: 10s

output.elasticsearch:
  hosts: ["http://localhost:9200"]
  index: "server-metrics-%{+YYYY.MM.dd}"

Step 2:数据处理(Logstash)

  • 如果需要额外字段处理,可配置Logstash过滤器:
filter {
  if [type] == "system" {
    mutate {
      add_field => {
        "source" => "server_metrics"
      }
    }
  }
}

Step 3:数据存储(Elasticsearch)

  • Metricbeat直接写入Elasticsearch,也可通过Logstash进一步加工后写入
  • 使用GET _cat/indices?v命令验证索引是否生成

Step 4:数据可视化(Kibana)

  • 创建仪表板,添加以下图表:
    • 折线图:CPU使用率随时间变化
    • 柱状图:内存占用趋势
    • 饼图:磁盘分区使用情况
    • 地图:服务器位置分布(如果涉及多节点)

Step 5:设置告警(Kibana Watcher)

  • 在Kibana中启用Watcher插件
  • 创建条件告警,例如:
    • system.cpu.user.pct > 90%持续1分钟时触发告警
    • 告警信息通过邮件或Slack通知

整体流程

[Metricbeat] → [Logstash (可选)] → [Elasticsearch] → [Kibana (可视化+告警)]

← 返回首页