准备的一些爬虫面试题

最近准备试试外面的市场,找找看外面的岗位,给自己找点后路,防止到时候被裁被动。
我将面试题分为基于scrapy框架与普通爬虫【requests/aiohttp等开发的爬虫】

普通爬虫面试题

列举反爬虫机制

(1) UA 检测,请求头合法性
(2) Robots 协议
(3) 验证码
(4) IP 封禁
(5) 账号封禁
(6) 动态数据加载
(7) 请求参数加密/响应结果加密
(8) 隐藏参数
(9) 字体反爬

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

# 获取文本形式的响应内容
text_content = response.text# 获取二进制形式的响应内容
binary_content = response.content# 获取JSON数据
json_data = response.json()

文本形式(Text):
适用场景: 当你处理的是文本数据,比如HTML网页内容、纯文本文件等时,可以使用.text属性获取文本形式的响应。
示例应用: 网页爬取、文本数据分析、日志文件读取等。

二进制形式(Binary):
适用场景: 当你处理的是二进制数据,比如图片、音频、视频文件等时,可以使用.content属性获取二进制形式的响应。
示例应用: 下载文件、处理图像数据、处理音频或视频数据等。

JSON数据:
适用场景: 当你请求的资源返回的是JSON格式的数据时,使用.json()方法能够方便地将JSON数据解析为Python字典或列表。
示例应用: 与API交互、处理前端通过AJAX请求返回的数据、处理包含结构化信息的数据等。

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

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

举例如下:

贪婪匹配 (.*):

(.) 是贪婪匹配模式。这意味着它会尽可能多地匹配字符,直到无法匹配为止。在贪婪模式下,. 会匹配尽量多的字符。

text = "This is a test. This is another test."
pattern = re.compile(r'This is (.*) test\.')
match = pattern.search(text)
print(match.group(1))

输出结果
“a test. This is another”

非贪婪匹配(.*?)

(.?) 是非贪婪匹配模式。这表示它会尽可能少地匹配字符,直到满足条件为止。在非贪婪模式下,.? 会匹配尽量少的字符。

pattern = re.compile(r'This is (.*?) test\.')
match = pattern.search(text)
print(match.group(1))

输出结果:
“a”

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

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

Xpath 中根据索引定位节点数时,索引从 1 开始

示例

请列举爬虫中解析数据的模块

我使用的一般有以下四种库【模块】
lxml re bs4 json
我使用lxml内的etree与re来解析静态页面,常用用xpath定位数据节点,获取需要的数据。

Cookie 和 session 的区别

1. 数据存储位置不同:
Cookie 存储在客户端,通过浏览器的 Cookie 机制进行管理。Cookie 通常用于存储较小且不敏感的数据,例如用户偏好设置、跟踪信息等。
Session 存储在服务器端,客户端的 Cookie 中仅包含 Session ID。实际的用户数据存储在服务器上,这使得 Session 更安全。
2. 安全程度不同:
由于 Cookie 存储在客户端,可能被篡改或窃取,因此其安全性较低。可以通过加密或签名等方式提高安全性。
Session 存储在服务器上,只有 Session ID 存储在客户端,因此相对更安全。但仍需注意防止 Session Fixation 等攻击。
3. 性能不同:
Cookie 存储在客户端,不占用服务器资源,但每次请求都会携带 Cookie 数据,增加网络负担。
Session 存储在服务器,可能占用服务器内存,尤其在高访问量时,会增加服务器负载。
4. 数据存储大小不同:
单个 Cookie 通常不超过 4KB,且客户端浏览器对 Cookie 的数量有一定限制。
Session 存储在服务器,不受客户端浏览器限制,可以存储更大量级的数据。
结合使用的方式:在实际开发中,常常将 Session ID 存储在客户端的 Cookie 中,以维护用户的状态。
具体流程如下:
1. 用户通过用户名和密码登录。
2. 服务器创建一个 Session,并将用户的相关信息存储在 Session 中。
3. 服务器将 Session ID 发送给客户端浏览器,存储在 Cookie 中。
4. 客户端每次请求时,浏览器会自动携带 Cookie(包含 Session ID)。
5. 服务器通过解析 Cookie 中的 Session ID 获取用户信息。
这种方式既维护了用户状态,也避免了在 Cookie 中存储敏感信息。同时,可以通过一些安全措施,如使用 HttpOnly 标志、定期更换 Session ID 等,提高安全性。

json字符串与python字典数据相互转换

这里有一个json字符串,如果需要更新字符串里的内容,或者对数据进行持久化等操作,可以使用python将json转换为python字典进行操作。
使用 json.loads 将 JSON 字符串转换为 Python 字典。

python_dict = json.loads(json_str)

使用 json.dumps 将 Python 字典转换为 JSON 字符串

json_str = json.dumps(python_dict)

Selenium浏览器爬虫常用方法

  1. driver.execute_script(js) 执行 JS 代码

  2. 定位元素的方法:
    在这里插入图片描述

  3. selenium获取当前页面源码
    Html = browser.page_source

  4. 添加代理
    通过add_argument方法添加代理

     ```proxy = "代理服务器的IP地址:端口号"chrome_options = webdriver.ChromeOptions()chrome_options.add_argument(f"--proxy-server={proxy}")# 创建Chrome浏览器驱动对象driver = webdriver.Chrome(chrome_options=chrome_options)```
    

    添加代理的具体示例

  5. 添加cookie
    driver.add_cookie(cookie)
    添加cookie实现登录示例

  6. 使用无界面模式
    options.add_grgument(“–headless”)

    options = webdriver.ChromeOptions()
    options.add_argument('--headless')
    driver = webdriver.Chrome(options=options)
    

什么是 i/o 密集型和计算密集型程序

I/O 密集型(I/O-bound)程序:

特点: 这种程序的特点是它们花费大部分时间等待输入/输出操作完成,而不是进行计算。在执行过程中,CPU 主要用于等待数据从存储器、磁盘、网络等 I/O 设备中读取或写入。
例子: 网络服务器、文件处理、数据库操作等。

计算密集型(CPU-bound)程序:

特点: 这种程序的特点是它们主要通过进行大量的数学计算或逻辑运算来消耗 CPU 时间。它们的执行主要依赖于 CPU 的处理能力,而不是等待外部设备的数据。
例子: 科学计算、图形渲染、密码学算法等。

对于 I/O 密集型任务,提高 I/O 操作的效率是关键。例如,使用异步编程、多线程或多进程来处理 I/O 操作,以便在等待数据时能够执行其他任务。对于计算密集型任务,通常需要更强大的 CPU 处理能力,可以考虑使用并行计算或分布式计算来加速任务的完成。

基于scrapy框架的面试题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/640323.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python使用HTTP代理进行API请求的优化

在Python中,HTTP代理是一种常用的技术,用于控制和修改HTTP请求和响应。通过使用HTTP代理,我们可以更好地控制网络请求的行为,提高安全性、隐私性和效率。下面我们将详细介绍如何在Python中使用HTTP代理进行API请求的优化。 一、减…

10分钟快速上手LLM大模型Python前端开发(三)之显示模块(二)

【计划昵称全网统一,代码随想随记,知乎无法立即修改,,】 微信公众号:leetcode_algos_life,代码随想随记 小红书:412408155 CSDN:https://blog.csdn.net/woai8339?typeblog &#xf…

反序列化字符串逃逸(上篇)

首先,必须先明白,这个点并不难,我给大家梳理一遍就会明白。 反序列化字符串逃逸就是序列化过程中逃逸出来字符,是不是很简单,哈哈哈! 好了,不闹了,其实: 这里你们只要懂…

Windows系统如何修改Nginx配置实现远程访问多个本地站点

文章目录 1. 下载windows版Nginx2. 配置Nginx3. 测试局域网访问4. cpolar内网穿透5. 测试公网访问6. 配置固定二级子域名7. 测试访问公网固定二级子域名 1. 下载windows版Nginx 进入官方网站(http://nginx.org/en/download.html)下载windows版的nginx 下载好后解压进入nginx目…

P4学习(六)实验三:a Control Plane using P4Runtime

目录 一. 实验目的二.阅读MyController.py文件1.导入P4Runtime的库2.main部分1. P4InfoHelper 实例化2. 创建交换机连接3. 设置主控制器4. 安装 P4 程序5. 写入隧道规则6. 读取表项和计数器(注释掉的部分)7. 定时打印隧道计数器8. 异常处理9. 关闭交换机…

TensorRT部署--Linux(Ubuntu)环境配置

系列文章目录 TensorRT环境配置–Linux(Ubuntu) 文章目录 系列文章目录前言一、环境配置二、CUDA下载安装三、cuDNN下载安装四、TensorRT下载安装五、模型创建总结 前言 TensorRT部署-Windows环境配置: https://blog.csdn.net/m0_70420861/article/details/135658922?csdn_s…

深入了解WPF控件:常用属性与用法(六)

掌握WPF控件:熟练常用属性(六) ListView 用于展示数据项集合的列表控件。它提供了丰富的功能和灵活的定制性,可以轻松地展示和编辑大量的数据。 常用属性描述ItemsSource用于设置ListView的数据源。可以是一个集合、数组或列表…

透明拼接屏代工:专业制造与质量保证

透明拼接屏代工是指专业的代工厂家根据客户的需求,为其生产透明拼接屏产品。随着透明拼接屏市场的不断扩大,越来越多的企业选择通过代工方式快速进入市场。尼伽小编将深入探讨透明拼接屏代工的优势、选择合适的代工厂家以及质量保证等方面的内容。 一、透…

深度学习记录--指数加权平均

指数加权移动平均(exponentially weighted moving averages) 如何对杂乱的数据进行拟合? 通过指数加权平均可以把数据图近似拟合成一条曲线 公式: 其中表示第t个平均数,表示第t-1个平均数,表示第t个数据,表示变化参数…

【测试入门】测试用例经典设计方法 —— 因果图法

01、因果图设计测试用例的步骤 1、分析需求 阅读需求文档,如果User Case很复杂,尽量将它分解成若干个简单的部分。这样做的好处是,不必在一次处理过程中考虑所有的原因。没有固定的流程说明究竟分解到何种程度才算简单,需要测试…

IP2325 5V输入双节串联锂电池升压充电IC 英集芯参数

简介 IP2325是一款支持双节串联锂电池/锂离子电 池的升压充电管理IC。 IP2325集成功率MOS,采用同步开关架构, 使其在应用时仅需极少的外围器件,并有效减小整 体方案的尺寸,降低BOM成本。 IP2325的升压开关充电转换器工作频率500K…

免费的WordPress插件大全

在当今数字化的时代,拥有一个强大的在线存在变得至关重要。而对于使用WordPress建站的用户来说,插件是提高网站功能的关键。在这篇文章中,我们将为您推荐三款免费的WordPress插件,它们不仅是147SEO软件中的佼佼者,而且…

《WebKit 技术内幕》学习之五(3): HTML解释器和DOM 模型

3 DOM的事件机制 基于 WebKit 的浏览器事件处理过程:首先检测事件发生处的元素有无监听者,如果网页的相关节点注册了事件的监听者则浏览器会将事件派发给 WebKit 内核来处理。另外浏览器可能也需要处理这样的事件(浏览器对于有些事件必须响应…

makefile 编译动态链接库使用(.so库文件)

makefile 编译动态链接库使用(.so库文件) 动态链接库:不会把代码编译到二进制文件中,而是在运行时才去加载, 好处是程序可以和库文件分离,可以分别发版,然后库文件可以被多处共享 动态链接库 动态&#…

vue3项目eslint配置、配置prettier(格式化配置)

文章链接: 全部配置链接 第一步:eslint配置、配置prettier(代码格式化):点击链接 (1) .eslint.cjs—eslint配置文件 (2).eslintignore—校验忽略文件 (3).prettierrc.json添加规则 (4).prettierignore忽略文件 prettierrc规范说明: npm install -D eslint-plugin-import…

gdip-yolo项目解读:gdip模块 |mdgip模块 |GDIP regularizer模块的使用分析

gdip-yolo是2022年提出了一个端到端的图像自适应目标检测框架,其论文中的效果展示了良好的图像增强效果。其提出了gdip模块 |mdgip模块 |GDIP regularizer模块等模块,并表明这是效果提升的关键。为此对gdip-yolo的项目进行深入分析。 gdip-yolo的论文可以…

第15届蓝桥杯嵌入式省赛准备第三天总结笔记(使用STM32cubeMX创建hal库工程+串口接收发送)

因为我是自己搞得板子,原本的下程序和串口1有问题,所以我用的是串口2,用的PA2和PA3 一,使用CubeMX配置串口 选择A开头的这个是异步通信。 配置串口参数,往届的题基本用的9600波特率,所以我这里设置为9600…

C++——结构体

1,结构体基本概念 结构体属于用户自定义的数据类型,允许用户存储不同的数据类型。像int(整型),浮点型,bool型,字符串型等都是属于系统内置的数据类型。而今天要学习的结构体则是属于我们自定义…

导出 MySQL 数据库表结构、数据字典word设计文档

一、第一种 :利用sql语句查询 需要说明的是该方法应该适用很多工具,博主用的是navicat SELECT TABLE_NAME 表名,( i : i 1 ) AS 序号,COLUMN_NAME 列名, COLUMN_TYPE 数据类型, DATA_TYPE 字段类型, CHARACTER_MAXIMUM_LENGTH 长度, IS_NULLABLE…

Linux: dev: glibc: 里面有很多的关于系统调用的函数

其实都没有实体源代码klogctl.c,而是通过编译时构造出来的源代码实体,比如klogctl这个函数,glibc的反汇编如下: 直接是0x67这个系统调用:103: Reading symbols from /usr/lib64/libc-2.28.so... (No debugg…