python爬虫面试必看的常见问题与参考答案解析

  • Post category:Python

Python爬虫面试必看的常见问题与参考答案解析

1. 什么是 Web 爬虫?你一般是如何构建一个 Web 爬虫的?

Web 爬虫是一种程序,能够自动地从 Web 页面上爬取数据。主要用于网络搜索引擎和数据挖掘等领域。

构建 Web 爬虫的一般步骤如下:

  1. 确定目标网站及其页面结构;
  2. 使用 Python 编写程序,获取目标网站的 HTML 页面;
  3. 解析 HTML 代码,获取所需数据;
  4. 存储数据至本地文件或数据库;
  5. 添加自动化功能,如定时爬取、去重等。

以下是示例代码,实现了从知乎上获取问题和答案的基本过程:

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 的安全版本。其主要区别如下:

  1. 安全性:HTTP 是明文传输,数据容易被拦截和篡改,而 HTTPS 在 HTTP 的基础上增加了 SSL/TLS 加密,保障了数据的安全性。
  2. 端口:HTTP 默认端口为 80,而 HTTPS 默认端口为 443。
  3. 连接方式:HTTP 是无状态协议,即每个请求都是独立的,而 HTTPS 使用 SSL/TLS 协议进行通信,可以保持持久连接状态,减小了每次连接的开销。
  4. 请求速度: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 是服务器上保存用户信息的一种机制。其主要区别如下:

  1. 存储位置:Cookies 存储在客户端,而 Session 存储在服务器上。
  2. 安全性:Cookies 可能容易被篡改和盗用,而 Session 可以更好地保障用户账户的安全性。
  3. 存储大小:Cookies 存储的数据大小有限制,而 Session 可以存储比较大的数据量。
  4. 使用场景: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_cookieget_cookie 分别设置和获取 Cookies;set_sessionget_session 分别设置和获取 Session。注意,需要在 Flask 应用中设置 secret_key 属性,以保障 Session 的安全性。