Python爬虫面试必看的常见问题与参考答案解析
1. 什么是 Web 爬虫?你一般是如何构建一个 Web 爬虫的?
Web 爬虫是一种程序,能够自动地从 Web 页面上爬取数据。主要用于网络搜索引擎和数据挖掘等领域。
构建 Web 爬虫的一般步骤如下:
- 确定目标网站及其页面结构;
- 使用 Python 编写程序,获取目标网站的 HTML 页面;
- 解析 HTML 代码,获取所需数据;
- 存储数据至本地文件或数据库;
- 添加自动化功能,如定时爬取、去重等。
以下是示例代码,实现了从知乎上获取问题和答案的基本过程:
import requests
from bs4 import BeautifulSoup
url = 'https://www.zhihu.com/question/21912345'
headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
title = soup.find('h1', {'class': 'QuestionHeader-title'}).text
print('问题:', title)
answers = soup.find_all('div', {'class': 'AnswerCard'})
print('答案数:', len(answers))
for index, answer in enumerate(answers):
author = answer.find('a', {'class': 'UserLink-link'}).text.strip()
content = answer.find('div', {'class': 'RichContent-inner'}).text.strip()
print('第', str(index + 1), '个答案', sep='')
print('作者:', author)
print('内容:', content)
2. 解释一下 CSS 选择器。
CSS 选择器是一种用于匹配 HTML 元素的模式,可以根据元素的标签名、类名、id 值、属性等进行选择和筛选。
常见的 CSS 选择器包括:
- 标签选择器:根据标签名选择元素,如
div
; - 类选择器:根据类名选择元素,如
.class-name
; - id 选择器:根据 id 值选择元素,如
#id-name
; - 属性选择器:根据元素的属性值选择元素,如
[attr=value]
; - 后代选择器:选择某个元素的后代元素,如
div p
; - 群组选择器:选择某些元素,如
div, p
。
以下是一个简单的示例,用于根据类名选取 HTML 元素:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>CSS Selector</title>
<style>
.header {
background-color: #333333;
color: #ffffff;
font-size: 24px;
}
.text {
font-size: 18px;
margin: 20px;
}
</style>
</head>
<body>
<div class="header">Header</div>
<div class="text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. In, obcaecati.</div>
<div class="text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Asperiores, ducimus?</div>
<div class="text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Fuga, porro?</div>
<div class="text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minus, reiciendis?</div>
<div class="text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptates, temporibus!</div>
</body>
</html>
使用类选择器 .
选取所有类名为 text
的元素:
.text {
font-size: 18px;
margin: 20px;
}
3. 请解释一下同步和异步的区别。
“同步”和“异步”是针对程序处理调用的方式而言的。
同步是指发起调用后,需等待被调用函数或方法执行完成后再继续执行后续代码;异步是指发起调用后,不需等待被调用函数或方法执行完成,即可继续执行后续代码。
以下是 Python 代码示例,用于说明同步和异步的区别:
import time
# 同步调用函数
def sync_function():
print('start sync function')
time.sleep(5)
print('end sync function')
# 异步调用函数
import asyncio
async def async_function():
print('start async function')
await asyncio.sleep(5)
print('end async function')
# 同步调用示例:需等待 5 秒才能执行后续代码
print('before sync call')
sync_function()
print('after sync call')
# 异步调用示例:无需等待,立即执行后续代码
print('before async call')
asyncio.run(async_function())
print('after async call')
4. 请简述一下 HTTP 协议和 HTTPS 协议的区别。
HTTP(Hypertext Transfer Protocol)和 HTTPS(Hypertext Transfer Protocol Secure)都是用于 Web 数据通信的协议,其中 HTTPS 是对 HTTP 的安全版本。其主要区别如下:
- 安全性:HTTP 是明文传输,数据容易被拦截和篡改,而 HTTPS 在 HTTP 的基础上增加了 SSL/TLS 加密,保障了数据的安全性。
- 端口:HTTP 默认端口为 80,而 HTTPS 默认端口为 443。
- 连接方式:HTTP 是无状态协议,即每个请求都是独立的,而 HTTPS 使用 SSL/TLS 协议进行通信,可以保持持久连接状态,减小了每次连接的开销。
- 请求速度:HTTPS 的加密和解密过程需要消耗更多的 CPU 资源,导致请求速度比 HTTP 稍慢。
以下是一个 Python 程序示例,用于对比 HTTP 和 HTTPS 的请求速度:
import requests
import time
# 发起 HTTP 请求
start_time = time.time()
http_response = requests.get('http://httpbin.org/get')
http_time = time.time() - start_time
print(f'HTTP Request Time: {http_time:.2f} seconds\nResponse Content: {http_response.content.decode()}\n')
# 发起 HTTPS 请求
start_time = time.time()
https_response = requests.get('https://httpbin.org/get')
https_time = time.time() - start_time
print(f'HTTPS Request Time: {https_time:.2f} seconds\nResponse Content: {https_response.content.decode()}\n')
5. 请解释一下 Cookies 和 Session 的区别及其使用场景。
Cookies 和 Session 都是用于 Web 网站的状态管理,其中 Cookies 是浏览器保存在本地的一组键值对,Session 是服务器上保存用户信息的一种机制。其主要区别如下:
- 存储位置:Cookies 存储在客户端,而 Session 存储在服务器上。
- 安全性:Cookies 可能容易被篡改和盗用,而 Session 可以更好地保障用户账户的安全性。
- 存储大小:Cookies 存储的数据大小有限制,而 Session 可以存储比较大的数据量。
- 使用场景:Cookies 主要用于保存用户的基本信息,如用户名、密码等,以便用户下次访问时可以直接使用;Session 主要用于保存一些比较敏感的信息,如登录状态、购物车信息等。
以下是一个简单的 Flask 程序示例,用于说明 Cookies 和 Session 的使用:
from flask import Flask, request, session, make_response
app = Flask(__name__)
app.secret_key = 'my-secret-key'
# 设置 Cookies 示例
@app.route('/set_cookie')
def set_cookie():
resp = make_response('set cookie')
resp.set_cookie('username', 'john')
return resp
# 获取 Cookies 示例
@app.route('/get_cookie')
def get_cookie():
username = request.cookies.get('username')
return f'username={username}'
# 设置 Session 示例
@app.route('/set_session')
def set_session():
session['logged_in'] = True
return 'set session'
# 获取 Session 示例
@app.route('/get_session')
def get_session():
logged_in = session.get('logged_in')
return f'logged_in={logged_in}'
if __name__ == '__main__':
app.run(debug=True)
在上述 Flask 应用中,set_cookie
和 get_cookie
分别设置和获取 Cookies;set_session
和 get_session
分别设置和获取 Session。注意,需要在 Flask 应用中设置 secret_key 属性,以保障 Session 的安全性。