最近准备试试外面的市场,找找看外面的岗位,给自己找点后路,防止到时候被裁被动。
我将面试题分为基于scrapy框架与普通爬虫【requests/aiohttp等开发的爬虫】
(1) UA 检测,请求头合法性
(2) Robots 协议
(3) 验证码
(4) IP 封禁
(5) 账号封禁
(6) 动态数据加载
(7) 请求参数加密/响应结果加密
(8) 隐藏参数
(9) 字体反爬
# 获取文本形式的响应内容
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”
(1) Re.findall():以列表形式返回所有满足条件的对象
(2) Re.search():匹配到第一个就返回一个对象 ,用 group()取值,匹配不到返回 None
(3) Re.match():从字符串开头匹配,匹配返回一个对象,用 group()取值,匹配不到返回 None
我使用的一般有以下四种库【模块】
lxml re bs4 json
我使用lxml内的etree与re来解析静态页面,常用用xpath定位数据节点,获取需要的数据。