MST

星途 面试题库

面试题:Python第三方库复杂应用场景

假设你需要开发一个网络爬虫项目,要用到requests和BeautifulSoup这两个第三方库。请阐述如何利用它们实现从一个网页中提取所有图片的链接,并处理可能出现的HTTP错误和解析错误。同时说明在项目中如何优化这两个库的使用以提高爬虫效率。
38.2万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
  1. 提取图片链接并处理错误
    • 安装库: 确保已经安装了requestsBeautifulSoup库。如果没有安装,可以使用pip install requests beautifulsoup4进行安装。
    • 代码实现
import requests
from bs4 import BeautifulSoup
from requests.exceptions import HTTPError

def get_image_links(url):
    try:
        # 发送HTTP GET请求
        response = requests.get(url)
        # 检查HTTP状态码,如果是4xx或5xx则抛出异常
        response.raise_for_status()
    except HTTPError as http_err:
        print(f'HTTP error occurred: {http_err}')
        return []
    except Exception as err:
        print(f'Other error occurred: {err}')
        return []
    
    try:
        soup = BeautifulSoup(response.text, 'html.parser')
        img_tags = soup.find_all('img')
        image_links = [img.get('src') for img in img_tags if img.get('src')]
        return image_links
    except Exception as parse_err:
        print(f'Parse error occurred: {parse_err}')
        return []
  1. 优化使用以提高爬虫效率
    • 请求优化
      • 设置合理的超时时间:在requests.get中设置timeout参数,避免请求长时间等待。例如response = requests.get(url, timeout = 5),5秒后如果没有响应则抛出异常,这样可以快速处理无响应的链接。
      • 复用连接:使用requests.Session对象,它可以在多个请求之间保持连接,减少建立新连接的开销。例如:
session = requests.Session()
response = session.get(url)
  • 解析优化
    • 选择合适的解析器BeautifulSoup支持多种解析器,如html.parserlxml等。lxml通常比html.parser更快,安装lxml库后可以使用soup = BeautifulSoup(response.text, 'lxml')
    • 减少不必要的解析:如果只需要获取图片链接,直接使用find_all('img')而不是先解析整个文档再筛选,这样可以减少解析工作量。