使用Python构建一个简单的Web爬虫:技术详解与实战

今天 4阅读

在当今数据驱动的世界中,网络爬虫(Web Crawler)成为获取互联网信息的重要工具。无论是用于数据分析、机器学习训练,还是市场监控,爬虫都扮演着关键角色。本文将详细介绍如何使用 Python 构建一个简单但功能完整的 Web 爬虫系统,并提供完整代码示例。

我们将涵盖以下内容:

网络爬虫的基本原理 使用 requestsBeautifulSoup 进行网页抓取和解析 数据存储:保存为 CSV 文件 遵守网站规则:robots.txt 与请求间隔控制 异常处理与日志记录 完整代码示例与运行演示

网络爬虫的基本原理

网络爬虫是一种自动从互联网上抓取信息的程序。它通过模拟浏览器访问目标网页,获取 HTML 内容,并从中提取所需的数据。整个流程如下:

发送 HTTP 请求获取网页内容(HTML)解析 HTML 文本,提取有用信息存储数据(数据库、文件等)遵循网站规定,避免频繁请求造成服务器负担

在 Python 中,我们常用的库有:

requests:发送 HTTP 请求获取网页内容 BeautifulSoup:解析 HTML 结构 csvpandas:存储数据 time:控制请求频率 logging:记录日志信息

使用 requests 和 BeautifulSoup 抓取网页

首先安装必要的依赖包(如尚未安装):

pip install requests beautifulsoup4

下面是一个基本的抓取页面并解析标题的例子:

import requestsfrom bs4 import BeautifulSoupdef fetch_page(url):    try:        headers = {            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0 Safari/537.36'        }        response = requests.get(url, headers=headers, timeout=10)        response.raise_for_status()  # 检查请求是否成功        return response.text    except requests.RequestException as e:        print(f"请求失败: {e}")        return Nonedef parse_title(html):    soup = BeautifulSoup(html, 'html.parser')    title_tag = soup.find('title')    if title_tag:        return title_tag.get_text()    else:        return "无标题"if __name__ == '__main__':    url = 'https://example.com'    html = fetch_page(url)    if html:        title = parse_title(html)        print(f"网页标题: {title}")

这段代码展示了如何:

使用 requests.get() 获取网页内容 设置 User-Agent 防止被识别为爬虫 使用 BeautifulSoup 提取 <title> 标签中的内容 处理异常情况,提高程序健壮性

数据存储:保存为 CSV 文件

假设我们要抓取多个链接的标题并保存到 CSV 文件中。我们可以使用 Python 的内置模块 csv 来实现:

import csvdef save_to_csv(data, filename='output.csv'):    with open(filename, mode='w', newline='', encoding='utf-8') as f:        writer = csv.writer(f)        writer.writerow(['URL', 'Title'])  # 写入表头        for item in data:            writer.writerow([item['url'], item['title']])    print(f"数据已保存至 {filename}")if __name__ == '__main__':    urls = [        'https://example.com',        'https://httpbin.org/get',        'https://www.python.org'    ]    results = []    for url in urls:        html = fetch_page(url)        if html:            title = parse_title(html)            results.append({'url': url, 'title': title})    save_to_csv(results)

该部分代码演示了:

如何遍历多个 URL 并批量抓取 将结果以字典形式组织并写入 CSV 文件 使用 with open(...) 实现安全的文件操作

遵守网站规则:robots.txt 与请求间隔控制

为了防止对目标网站造成过大压力,爬虫应遵循以下原则:

检查 robots.txt:查看网站是否允许爬取特定路径 设置请求间隔:使用 time.sleep() 控制请求频率 设置超时时间:避免长时间等待响应

例如,在每次请求之间添加 2 秒延迟:

import timefor url in urls:    html = fetch_page(url)    if html:        title = parse_title(html)        results.append({'url': url, 'title': title})    time.sleep(2)  # 每次请求后暂停2秒

此外,可以使用 robotparser 模块来解析网站的 robots.txt 文件,判断是否允许爬取某个页面。


异常处理与日志记录

为了更好地调试和维护爬虫程序,建议引入日志记录机制:

import logging# 配置日志输出格式logging.basicConfig(    level=logging.INFO,    format='%(asctime)s - %(levelname)s - %(message)s')def fetch_page(url):    try:        headers = {            'User-Agent': 'Mozilla/5.0'        }        logging.info(f"正在请求: {url}")        response = requests.get(url, headers=headers, timeout=10)        response.raise_for_status()        return response.text    except requests.RequestException as e:        logging.error(f"请求失败: {e}")        return None

这样可以在终端或日志文件中清晰地看到爬虫的运行状态,便于排查问题。


完整代码示例

以下是整合以上所有功能的完整代码:

import requestsfrom bs4 import BeautifulSoupimport csvimport timeimport logging# 配置日志logging.basicConfig(    level=logging.INFO,    format='%(asctime)s - %(levelname)s - %(message)s')# 获取网页HTML内容def fetch_page(url):    try:        headers = {            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0 Safari/537.36'        }        logging.info(f"正在请求: {url}")        response = requests.get(url, headers=headers, timeout=10)        response.raise_for_status()        return response.text    except requests.RequestException as e:        logging.error(f"请求失败: {e}")        return None# 解析标题def parse_title(html):    soup = BeautifulSoup(html, 'html.parser')    title_tag = soup.find('title')    return title_tag.get_text(strip=True) if title_tag else "无标题"# 保存数据到CSVdef save_to_csv(data, filename='output.csv'):    with open(filename, mode='w', newline='', encoding='utf-8') as f:        writer = csv.writer(f)        writer.writerow(['URL', 'Title'])        for item in data:            writer.writerow([item['url'], item['title']])    logging.info(f"数据已保存至 {filename}")# 主函数if __name__ == '__main__':    urls = [        'https://example.com',        'https://httpbin.org/get',        'https://www.python.org'    ]    results = []    for url in urls:        html = fetch_page(url)        if html:            title = parse_title(html)            results.append({'url': url, 'title': title})        time.sleep(2)  # 控制请求频率    save_to_csv(results)

总结

本文介绍了如何使用 Python 构建一个基础但实用的 Web 爬虫系统。通过 requestsBeautifulSoup 库,我们实现了网页抓取与数据解析;通过 csv 模块实现了数据持久化;并通过日志记录和请求间隔控制提高了程序的稳定性和合规性。

当然,这只是一个起点。实际项目中可能还需要考虑更多高级功能,如:

使用 Scrapy 框架进行大规模爬取 使用代理 IP 防止封禁 多线程或异步请求提升效率 使用数据库替代 CSV 存储结构化数据

希望本文能为你入门 Web 爬虫开发提供帮助!

免责声明:本文来自网站作者,不代表CIUIC的观点和立场,本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。客服邮箱:ciuic@ciuic.com

目录[+]

您是本站第69436名访客 今日有17篇新文章

微信号复制成功

打开微信,点击右上角"+"号,添加朋友,粘贴微信号,搜索即可!