使用 Python 实现一个简单的 Web 爬虫系统

今天 4阅读

在当今数据驱动的世界中,网络爬虫(Web Crawler) 成为了获取信息的重要工具之一。通过编写爬虫程序,我们可以自动从网页中提取结构化数据,并用于数据分析、监控、搜索引擎索引等多种用途。

本文将介绍如何使用 Python 编写一个基本的网络爬虫系统,包括以下几个部分:

环境准备爬取网页内容解析 HTML 数据保存数据到本地实现一个完整的爬虫示例

我们将使用 requestsBeautifulSoup 这两个常用的 Python 库来完成任务。


环境准备

首先确保你的开发环境中安装了以下库:

pip install requests beautifulsoup4 lxml pandas
requests: 用于发起 HTTP 请求,获取网页内容。beautifulsoup4: 用于解析 HTML 文档。lxml: 作为 BeautifulSoup 的解析器,速度快且容错能力强。pandas: 用于将爬取的数据整理为表格形式并导出。

爬取网页内容

我们先以 https://example.com 为例,演示如何使用 requests 获取网页内容。

示例代码:

import requestsdef fetch_page(url):    try:        headers = {            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'        }        response = requests.get(url, headers=headers)        response.raise_for_status()  # 如果状态码不是200,抛出异常        return response.text    except requests.RequestException as e:        print(f"请求失败: {e}")        return Noneif __name__ == '__main__':    url = "https://example.com"    html_content = fetch_page(url)    if html_content:        print(html_content[:200])  # 打印前200个字符查看结果

这段代码向目标网站发送 GET 请求,并返回 HTML 内容。注意我们设置了 User-Agent 来模拟浏览器访问,避免被服务器拒绝。


解析 HTML 数据

接下来,我们需要从 HTML 中提取有用的信息。假设我们要抓取页面中的所有链接和标题。

示例代码:

from bs4 import BeautifulSoupdef parse_html(html):    soup = BeautifulSoup(html, 'lxml')    title = soup.title.string if soup.title else '无标题'    links = [a.get('href') for a in soup.find_all('a', href=True)]    return {        'title': title,        'links': links    }if __name__ == '__main__':    url = "https://example.com"    html = fetch_page(url)    if html:        data = parse_html(html)        print("页面标题:", data['title'])        print("链接数量:", len(data['links']))        print("前5个链接:")        for link in data['links'][:5]:            print(link)

输出结果类似如下:

页面标题: Example Domain链接数量: 1前5个链接:https://www.iana.org/domains/example

这里我们使用了 BeautifulSoup 来解析 HTML,提取了页面标题和所有超链接。


保存数据到本地

我们可以将爬取的数据保存为 CSV 文件以便后续分析。

示例代码:

import pandas as pddef save_to_csv(data, filename='output.csv'):    df = pd.DataFrame(data['links'], columns=['Link'])    df.to_csv(filename, index=False)    print(f"数据已保存至 {filename}")if __name__ == '__main__':    url = "https://example.com"    html = fetch_page(url)    if html:        data = parse_html(html)        save_to_csv(data)

运行后会在当前目录下生成一个名为 output.csv 的文件,里面包含所有提取到的链接。


实现一个完整的爬虫示例

现在我们将前面的功能整合成一个完整的爬虫程序,它能够:

爬取指定页面;提取页面标题和链接;将链接保存为 CSV 文件;支持命令行参数传入 URL。

完整代码如下:

import requestsfrom bs4 import BeautifulSoupimport pandas as pdimport argparsedef fetch_page(url):    try:        headers = {            'User-Agent': 'Mozilla/5.0'        }        response = requests.get(url, headers=headers)        response.raise_for_status()        return response.text    except requests.RequestException as e:        print(f"请求失败: {e}")        return Nonedef parse_html(html):    soup = BeautifulSoup(html, 'lxml')    title = soup.title.string if soup.title else '无标题'    links = [a.get('href') for a in soup.find_all('a', href=True)]    return {'title': title, 'links': links}def save_to_csv(data, filename='output.csv'):    df = pd.DataFrame(data['links'], columns=['Link'])    df.to_csv(filename, index=False)    print(f"数据已保存至 {filename}")def main():    parser = argparse.ArgumentParser(description="简单网页爬虫")    parser.add_argument('--url', required=True, help="需要爬取的网址")    parser.add_argument('--output', default='output.csv', help="输出文件名")    args = parser.parse_args()    html = fetch_page(args.url)    if html:        data = parse_html(html)        print("页面标题:", data['title'])        print("链接数量:", len(data['links']))        save_to_csv(data, args.output)if __name__ == '__main__':    main()

使用方法:

python crawler.py --url https://example.com --output links.csv

注意事项与扩展建议

注意事项:

遵守 Robots 协议:每个网站都有 /robots.txt 文件,规定哪些路径允许爬虫访问。设置合理的请求间隔:频繁请求可能被封 IP,建议使用 time.sleep() 控制频率。处理相对链接:提取的链接可能是相对路径,需拼接完整 URL。异常处理要完善:如网络错误、元素不存在等情况。

扩展建议:

使用 Scrapy 框架构建更复杂的爬虫项目;使用代理 IP 避免被封锁;添加并发功能提升效率(如使用 concurrent.futuresasyncio);存储数据到数据库(如 SQLite、MongoDB);增加日志记录、重试机制等。

总结

本文介绍了如何使用 Python 构建一个基础但完整的网页爬虫系统,涵盖了从请求页面、解析内容到保存数据的全过程。虽然这个爬虫比较简单,但它可以作为一个起点,帮助你理解网络爬虫的基本原理和实现方式。

随着经验的积累,你可以尝试使用更高级的框架(如 Scrapy、Selenium)来应对更复杂的网页结构和反爬策略。

希望这篇文章能帮助你迈出网络爬虫开发的第一步!


字数统计:约 1500 字

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

目录[+]

您是本站第69312名访客 今日有16篇新文章

微信号复制成功

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